Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/.gitignore b/.gitignore
- index a977c79..21fe8f5 100644
- --- a/.gitignore
- +++ b/.gitignore
- @@ -114,3 +114,5 @@ contrib/devtools/split-debug.sh
- # vagrant
- .vagrant
- +
- +**/.vscode
- diff --git a/CMakeLists.txt b/CMakeLists.txt
- index 8318039..65f759d 100644
- --- a/CMakeLists.txt
- +++ b/CMakeLists.txt
- @@ -1,7 +1,7 @@
- # Copyright (c) 2017 The Bitcoin developers
- cmake_minimum_required(VERSION 3.1)
- -project(BitcoinABC)
- +project(BitcoinCandy)
- # Add path for custom modules
- set(CMAKE_MODULE_PATH
- diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
- index 0303334..0075dff 100644
- --- a/CONTRIBUTING.md
- +++ b/CONTRIBUTING.md
- @@ -1,15 +1,15 @@
- -Contributing to Bitcoin ABC
- +Contributing to Bitcoin Candy
- ===========================
- -The Bitcoin ABC project welcomes contributors!
- +The Bitcoin Candy project welcomes contributors!
- -This guide is intended to help developers contribute effectively to Bitcoin ABC.
- +This guide is intended to help developers contribute effectively to Bitcoin Candy.
- -Bitcoin ABC Development Philosophy
- +Bitcoin Candy Development Philosophy
- ----------------------------------
- -Bitcoin ABC aims for fast iteration and continuous integration.
- +Bitcoin Candy aims for fast iteration and continuous integration.
- This means that there should be quick turnaround for patches to be proposed,
- reviewed, and committed. Changes should not sit in a queue for long.
- @@ -35,9 +35,9 @@ If a Diff is landed, and breaks the build, fix it quickly. If it cannot be fixed
- quickly, it should be reverted, and re-applied later when it no longer breaks the build.
- - Automate as much as possible, and spend time on things only humans can do.
- -Here are some handy links for development practices aligned with Bitcoin ABC:
- +Here are some handy links for development practices aligned with Bitcoin Candy:
- -- [Statement of Bitcoin ABC Values and Visions](https://www.yours.org/content/bitcoin-abc---our-values-and-vision-a282afaade7c)
- +- [Statement of Bitcoin Candy Values and Visions](https://www.yours.org/content/bitcoin-abc---our-values-and-vision-a282afaade7c)
- - [Large Diffs Are Hurting Your Ability To Ship](https://medium.com/@kurtisnusbaum/large-diffs-are-hurting-your-ability-to-ship-e0b2b41e8acf)
- - [Stacked Diffs: Keeping Phabricator Diffs Small](https://medium.com/@kurtisnusbaum/stacked-diffs-keeping-phabricator-diffs-small-d9964f4dcfa6)
- - [Parallel Implementations](https://www.gamasutra.com/view/news/128325/Opinion_Parallel_Implementations.php)
- @@ -45,7 +45,7 @@ Here are some handy links for development practices aligned with Bitcoin ABC:
- - [Advantages of monolithic version control](https://danluu.com/monorepo/)
- -Getting set up with the Bitcoin ABC Repository
- +Getting set up with the Bitcoin Candy Repository
- ----------------------------------------------
- 1. Create an account at `https://reviews.bitcoinabc.org/`
- @@ -93,7 +93,7 @@ If code formatting tools do not install automatically on your system, you
- may have to install clang-format-3.8 and autopep8.
- -Working with The Bitcoin ABC Repository
- +Working with The Bitcoin Candy Repository
- ---------------------------------------
- A typical workflow would be:
- @@ -134,7 +134,7 @@ as the Diff number, reviewers, etc.).
- - When reviewers approve your Diff, it should be listed as "ready to Land"
- in Phabricator. When you want to commit your diff to the repository, check out
- type my-topic-branch in git, then type `arc land`. You have now succesfully
- -committed a change to the Bitcoin ABC repository.
- +committed a change to the Bitcoin Candy repository.
- What to work on
- diff --git a/COPYING b/COPYING
- index 76a2523..14e064c 100644
- --- a/COPYING
- +++ b/COPYING
- @@ -2,7 +2,7 @@ The MIT License (MIT)
- Copyright (c) 2009-2015 Bitcoin Developers
- Copyright (c) 2009-2017 The Bitcoin Core developers
- -Copyright (c) 2017 The Bitcoin ABC developers
- +Copyright (c) 2017 The Bitcoin Candy developers
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- diff --git a/INSTALL.md b/INSTALL.md
- index dc96228..53b82a6 100644
- --- a/INSTALL.md
- +++ b/INSTALL.md
- @@ -2,4 +2,4 @@ Building Bitcoin
- ================
- See doc/build-*.md for instructions on building the various
- -elements of the Bitcoin ABC implementation of Bitcoin.
- +elements of the Bitcoin Candy implementation of Bitcoin.
- diff --git a/Makefile.am b/Makefile.am
- index cf1e278..536af97 100644
- --- a/Makefile.am
- +++ b/Makefile.am
- @@ -28,7 +28,7 @@ BITCOIN_WIN_INSTALLER=$(PACKAGE)-$(PACKAGE_VERSION)-win$(WINDOWS_BITS)-setup$(EX
- empty :=
- space := $(empty) $(empty)
- -OSX_APP=BitcoinABC-Qt.app
- +OSX_APP=BitcoinCandy-Qt.app
- OSX_VOLNAME = $(subst $(space),-,$(PACKAGE_NAME))
- OSX_DMG = $(OSX_VOLNAME).dmg
- OSX_BACKGROUND_SVG=background.svg
- @@ -98,7 +98,7 @@ $(OSX_APP)/Contents/Resources/bitcoin.icns: $(OSX_INSTALLER_ICONS)
- $(MKDIR_P) $(@D)
- $(INSTALL_DATA) $< $@
- -$(OSX_APP)/Contents/MacOS/BitcoinABC-Qt: $(BITCOIN_QT_BIN)
- +$(OSX_APP)/Contents/MacOS/BitcoinCandy-Qt: $(BITCOIN_QT_BIN)
- $(MKDIR_P) $(@D)
- STRIPPROG="$(STRIP)" $(INSTALL_STRIP_PROGRAM) $< $@
- @@ -108,7 +108,7 @@ $(OSX_APP)/Contents/Resources/Base.lproj/InfoPlist.strings:
- OSX_APP_BUILT=$(OSX_APP)/Contents/PkgInfo $(OSX_APP)/Contents/Resources/empty.lproj \
- $(OSX_APP)/Contents/Resources/bitcoin.icns $(OSX_APP)/Contents/Info.plist \
- - $(OSX_APP)/Contents/MacOS/BitcoinABC-Qt $(OSX_APP)/Contents/Resources/Base.lproj/InfoPlist.strings
- + $(OSX_APP)/Contents/MacOS/BitcoinCandy-Qt $(OSX_APP)/Contents/Resources/Base.lproj/InfoPlist.strings
- osx_volname:
- echo $(OSX_VOLNAME) >$@
- @@ -133,7 +133,7 @@ $(APP_DIST_DIR)/Applications:
- @rm -f $@
- @cd $(@D); $(LN_S) /Applications $(@F)
- -$(APP_DIST_EXTRAS): $(APP_DIST_DIR)/$(OSX_APP)/Contents/MacOS/BitcoinABC-Qt
- +$(APP_DIST_EXTRAS): $(APP_DIST_DIR)/$(OSX_APP)/Contents/MacOS/BitcoinCandy-Qt
- $(OSX_DMG): $(APP_DIST_EXTRAS)
- $(GENISOIMAGE) -no-cache-inodes -D -l -probe -V "$(OSX_VOLNAME)" -no-pad -r -dir-mode 0755 -apple -o $@ dist
- @@ -148,7 +148,7 @@ $(APP_DIST_DIR)/.background/$(OSX_BACKGROUND_IMAGE): $(OSX_BACKGROUND_IMAGE_DPIF
- $(APP_DIST_DIR)/.DS_Store: $(OSX_DSSTORE_GEN)
- $(PYTHON) $< "$@" "$(OSX_VOLNAME)"
- -$(APP_DIST_DIR)/$(OSX_APP)/Contents/MacOS/BitcoinABC-Qt: $(OSX_APP_BUILT) $(OSX_PACKAGING)
- +$(APP_DIST_DIR)/$(OSX_APP)/Contents/MacOS/BitcoinCandy-Qt: $(OSX_APP_BUILT) $(OSX_PACKAGING)
- INSTALLNAMETOOL=$(INSTALLNAMETOOL) OTOOL=$(OTOOL) STRIP=$(STRIP) $(PYTHON) $(OSX_DEPLOY_SCRIPT) $(OSX_APP) -translations-dir=$(QT_TRANSLATION_DIR) -add-qt-tr $(OSX_QT_TRANSLATIONS) -verbose 2
- deploydir: $(APP_DIST_EXTRAS)
- diff --git a/README.md b/README.md
- index 4d0af1e..eec6e50 100644
- --- a/README.md
- +++ b/README.md
- @@ -1,29 +1,23 @@
- -Bitcoin ABC
- +Bitcoin Candy
- ===========
- -https://bitcoinabc.org
- +https://bitcoincandy.one
- -What is Bitcoin Cash?
- ----------------------
- +What is Bitcoin candy?
- +Bitcoin candy is an experimental digital currency that enables instant payments to anyone, anywhere in the world. It uses peer-to-peer technology to operate with no central authority: managing transactions and issuing money are carried out collectively by the network. Bitcoin Candy is a descendant of Bitcoin Cash. It became a separate currency from the version supported by Bitcoin Cash when the two split on Jan 13, 2018. Bitcoin Candy and the Bitcoin Cash version of Bitcoin share the same transaction history up until the split.
- -[Bitcoin Cash](https://www.bitcoincash.org/) is an experimental digital currency
- -that enables instant payments to anyone, anywhere in the world. It uses peer-to-peer
- -technology to operate with no central authority: managing transactions and issuing
- -money are carried out collectively by the network. Bitcoin Cash is a descendant of
- -Bitcoin. It became a separate currency from the version supported by Bitcoin Core
- -when the two split on August 1, 2017. Bitcoin Cash and the Bitcoin Core version of
- -Bitcoin share the same transaction history up until the split.
- -What is Bitcoin ABC?
- ---------------------
- +Release
- +-------
- +
- +[windows-64bit](https://github.com/bitcoincandyofficial/bitcoincandy/files/1707921/bitcoincandy-windows-exe.zip)
- -Bitcoin ABC is the name of open-source software which enables the use of Bitcoin Cash.
- -It is a fork of the [Bitcoin Core](https://bitcoincore.org) software project.
- +Currently we only provide windows version of wallet. Wallets for linux and mac will be released soon.
- License
- -------
- -Bitcoin ABC is released under the terms of the MIT license. See [COPYING](COPYING) for more
- +Bitcoin Candy is released under the terms of the MIT license. See [COPYING](COPYING) for more
- information or see https://opensource.org/licenses/MIT.
- Development Process
- @@ -31,6 +25,7 @@ Development Process
- This Github repository contains only source code of releases.
- -Bitcoin ABC development takes place at https://reviews.bitcoinabc.org/
- +Bitcoin Candy development takes place at https://reviews.bitcoinabc.org/
- If you would like to contribute, please read [CONTRIBUTING](CONTRIBUTING.md)
- +
- diff --git a/configure.ac b/configure.ac
- index b2cfe0c..0b91130 100644
- --- a/configure.ac
- +++ b/configure.ac
- @@ -3,12 +3,12 @@ AC_PREREQ([2.60])
- define(_CLIENT_VERSION_MAJOR, 0)
- define(_CLIENT_VERSION_MINOR, 16)
- define(_CLIENT_VERSION_REVISION, 2)
- -define(_CLIENT_VERSION_BUILD, 0)
- +define(_CLIENT_VERSION_BUILD, 7)
- define(_CLIENT_VERSION_IS_RELEASE, true)
- -define(_COPYRIGHT_YEAR, 2017)
- +define(_COPYRIGHT_YEAR, 2018)
- define(_COPYRIGHT_HOLDERS,[The %s developers])
- define(_COPYRIGHT_HOLDERS_SUBSTITUTION,[[Bitcoin]])
- -AC_INIT([Bitcoin ABC],[_CLIENT_VERSION_MAJOR._CLIENT_VERSION_MINOR._CLIENT_VERSION_REVISION],[https://github.com/Bitcoin-ABC/bitcoin-abc/issues],[bitcoin-abc],[https://bitcoinabc.org/])
- +AC_INIT([Bitcoin Candy],[_CLIENT_VERSION_MAJOR._CLIENT_VERSION_MINOR._CLIENT_VERSION_REVISION],[https://github.com/bitcoincandyteam/bitcoincandy/issues],[bitcoin-abc],[https://bitcoincandy.one/])
- AC_CONFIG_SRCDIR([src/validation.cpp])
- AC_CONFIG_HEADERS([src/config/bitcoin-config.h])
- AC_CONFIG_AUX_DIR([build-aux])
- @@ -1030,6 +1030,8 @@ AC_SUBST(UNIVALUE_LIBS)
- BITCOIN_QT_PATH_PROGS([PROTOC], [protoc],$protoc_bin_path)
- +LIBEQUIHASH_LIBS="-lcrypto -lsodium"
- +
- AC_MSG_CHECKING([whether to build bitcoind])
- AM_CONDITIONAL([BUILD_BITCOIND], [test x$build_bitcoind = xyes])
- AC_MSG_RESULT($build_bitcoind)
- @@ -1230,6 +1232,7 @@ AC_SUBST(SSL_LIBS)
- AC_SUBST(EVENT_LIBS)
- AC_SUBST(EVENT_PTHREADS_LIBS)
- AC_SUBST(ZMQ_LIBS)
- +AC_SUBST(LIBEQUIHASH_LIBS)
- AC_SUBST(PROTOBUF_LIBS)
- AC_SUBST(QR_LIBS)
- AC_CONFIG_FILES([Makefile src/Makefile doc/man/Makefile share/setup.nsi share/qt/Info.plist src/test/buildenv.py test/functional/config.ini])
- diff --git a/contrib/rpm/bitcoin-0.12.0-libressl.patch b/contrib/rpm/bitcoin-0.12.0-libressl.patch
- deleted file mode 100644
- index 555614a..0000000
- +++ /dev/null
- @@ -1,24 +0,0 @@
- -diff -ur bitcoin-0.12.0.orig/src/init.cpp bitcoin-0.12.0/src/init.cpp
- ---- bitcoin-0.12.0.orig/src/init.cpp 2015-12-31 16:00:00.000000000 -0800
- -+++ bitcoin-0.12.0/src/init.cpp 2016-02-23 06:03:47.133227757 -0800
- -@@ -1075,7 +1075,7 @@
- - if (fPrintToDebugLog)
- - OpenDebugLog();
- -
- --#if (OPENSSL_VERSION_NUMBER < 0x10100000L)
- -+#if defined(LIBRESSL_VERSION_NUMBER) || (OPENSSL_VERSION_NUMBER < 0x10100000L)
- - LogPrintf("Using OpenSSL version %s\n", SSLeay_version(SSLEAY_VERSION));
- - #else
- - LogPrintf("Using OpenSSL version %s\n", OpenSSL_version(OPENSSL_VERSION));
- -diff -ur bitcoin-0.12.0.orig/src/qt/rpcconsole.cpp bitcoin-0.12.0/src/qt/rpcconsole.cpp
- ---- bitcoin-0.12.0.orig/src/qt/rpcconsole.cpp 2015-12-31 16:00:00.000000000 -0800
- -+++ bitcoin-0.12.0/src/qt/rpcconsole.cpp 2016-02-23 15:09:42.881126841 -0800
- -@@ -264,7 +264,7 @@
- -
- - // set library version labels
- -
- --#if (OPENSSL_VERSION_NUMBER < 0x10100000L)
- -+#if defined(LIBRESSL_VERSION_NUMBER) || (OPENSSL_VERSION_NUMBER < 0x10100000L)
- - ui->openSSLVersion->setText(SSLeay_version(SSLEAY_VERSION));
- - #else
- - ui->openSSLVersion->setText(OpenSSL_version(OPENSSL_VERSION));
- diff --git a/depends/packages/libsodium.mk b/depends/packages/libsodium.mk
- new file mode 100644
- index 0000000..a3de1d6
- diff --git a/doc/build-unix.md b/doc/build-unix.md
- index b925b98..47041b7 100644
- --- a/doc/build-unix.md
- +++ b/doc/build-unix.md
- @@ -65,7 +65,7 @@ Dependency Build Instructions: Ubuntu & Debian
- ----------------------------------------------
- Build requirements:
- - sudo apt-get install build-essential libtool autotools-dev automake pkg-config libssl-dev libevent-dev bsdmainutils
- + sudo apt-get install build-essential libtool autotools-dev automake pkg-config libssl-dev libevent-dev bsdmainutils libsodium-dev
- Options when installing required Boost library files:
- diff --git a/share/qt/Info.plist.in b/share/qt/Info.plist.in
- index 21fadd9..1df6845 100644
- --- a/share/qt/Info.plist.in
- +++ b/share/qt/Info.plist.in
- @@ -29,16 +29,16 @@
- <string>????</string>
- <key>CFBundleExecutable</key>
- - <string>BitcoinABC-Qt</string>
- + <string>BitcoinCandy-Qt</string>
- <key>CFBundleName</key>
- - <string>BitcoinABC-Qt</string>
- + <string>BitcoinCandy-Qt</string>
- <key>LSHasLocalizedDisplayName</key>
- <true/>
- <key>CFBundleIdentifier</key>
- - <string>org.bitcoinabc.BitcoinABC-Qt</string>
- + <string>one.bitcoincandy.BitcoinCandy-Qt</string>
- <key>CFBundleURLTypes</key>
- <array>
- diff --git a/src/Makefile.am b/src/Makefile.am
- index 65b2509..075a892 100644
- --- a/src/Makefile.am
- +++ b/src/Makefile.am
- @@ -270,6 +270,9 @@ crypto_libbitcoin_crypto_a_SOURCES = \
- crypto/chacha20.h \
- crypto/chacha20.cpp \
- crypto/common.h \
- + crypto/equihash.cpp \
- + crypto/equihash.h \
- + crypto/equihash.tcc \
- crypto/hmac_sha256.cpp \
- crypto/hmac_sha256.h \
- crypto/hmac_sha512.cpp \
- @@ -423,7 +426,7 @@ bitcoind_LDADD = \
- $(LIBMEMENV) \
- $(LIBSECP256K1)
- -bitcoind_LDADD += $(BOOST_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) $(ZMQ_LIBS)
- +bitcoind_LDADD += $(BOOST_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) $(ZMQ_LIBS) $(LIBEQUIHASH_LIBS)
- # bitcoin-cli binary #
- bitcoin_cli_SOURCES = bitcoin-cli.cpp
- @@ -441,7 +444,7 @@ bitcoin_cli_LDADD = \
- $(LIBBITCOIN_UTIL) \
- $(LIBBITCOIN_CRYPTO)
- -bitcoin_cli_LDADD += $(BOOST_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(EVENT_LIBS)
- +bitcoin_cli_LDADD += $(BOOST_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(EVENT_LIBS) $(LIBEQUIHASH_LIBS)
- #
- # bitcoin-seeder binary #
- @@ -475,7 +478,8 @@ bitcoin_tx_LDADD = \
- $(LIBBITCOIN_UTIL) \
- $(LIBBITCOIN_CONSENSUS) \
- $(LIBBITCOIN_CRYPTO) \
- - $(LIBSECP256K1)
- + $(LIBSECP256K1) \
- + $(LIBEQUIHASH_LIBS)
- bitcoin_tx_LDADD += $(BOOST_LIBS) $(CRYPTO_LIBS)
- #
- @@ -490,8 +494,8 @@ if GLIBC_BACK_COMPAT
- endif
- libbitcoinconsensus_la_LDFLAGS = $(AM_LDFLAGS) -no-undefined $(RELDFLAGS)
- -libbitcoinconsensus_la_LIBADD = $(LIBSECP256K1)
- -libbitcoinconsensus_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(builddir)/obj -I$(srcdir)/secp256k1/include -DBUILD_BITCOIN_INTERNAL
- +libbitcoinconsensus_la_LIBADD = $(LIBSECP256K1) $(BOOST_LIBS) $(LIBEQUIHASH_LIBS)
- +libbitcoinconsensus_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(builddir)/obj -I$(srcdir)/secp256k1/include -DBUILD_BITCOIN_INTERNAL -DNO_UTIL_LOG
- libbitcoinconsensus_la_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
- endif
- diff --git a/src/Makefile.bench.include b/src/Makefile.bench.include
- index ff09656..12ff264 100644
- --- a/src/Makefile.bench.include
- +++ b/src/Makefile.bench.include
- @@ -40,7 +40,8 @@ bench_bench_bitcoin_LDADD = \
- $(LIBLEVELDB_SSE42) \
- $(LIBMEMENV) \
- $(LIBSECP256K1) \
- - $(LIBUNIVALUE)
- + $(LIBUNIVALUE)\
- + $(LIBEQUIHASH_LIBS)
- if ENABLE_ZMQ
- bench_bench_bitcoin_LDADD += $(LIBBITCOIN_ZMQ) $(ZMQ_LIBS)
- diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include
- index 960ae4b..b1c9094 100644
- --- a/src/Makefile.qt.include
- +++ b/src/Makefile.qt.include
- @@ -406,7 +406,7 @@ qt_bitcoin_qt_LDADD += $(LIBBITCOIN_ZMQ) $(ZMQ_LIBS)
- endif
- qt_bitcoin_qt_LDADD += $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CONSENSUS) $(LIBBITCOIN_CRYPTO) $(LIBUNIVALUE) $(LIBLEVELDB) $(LIBLEVELDB_SSE42) $(LIBMEMENV) \
- $(BOOST_LIBS) $(QT_LIBS) $(QT_DBUS_LIBS) $(QR_LIBS) $(PROTOBUF_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) $(LIBSECP256K1) \
- - $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS)
- + $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) $(LIBEQUIHASH_LIBS)
- qt_bitcoin_qt_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(QT_LDFLAGS) $(LIBTOOL_APP_LDFLAGS)
- qt_bitcoin_qt_LIBTOOLFLAGS = --tag CXX
- diff --git a/src/Makefile.qttest.include b/src/Makefile.qttest.include
- index 398dfd2..8b699dd 100644
- --- a/src/Makefile.qttest.include
- +++ b/src/Makefile.qttest.include
- @@ -53,7 +53,7 @@ endif
- qt_test_test_bitcoin_qt_LDADD += $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CONSENSUS) $(LIBBITCOIN_CRYPTO) $(LIBUNIVALUE) $(LIBLEVELDB) \
- $(LIBLEVELDB_SSE42) $(LIBMEMENV) $(BOOST_LIBS) $(QT_DBUS_LIBS) $(QT_TEST_LIBS) $(QT_LIBS) \
- $(QR_LIBS) $(PROTOBUF_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) $(LIBSECP256K1) \
- - $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS)
- + $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) $(LIBEQUIHASH_LIBS)
- qt_test_test_bitcoin_qt_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(QT_LDFLAGS) $(LIBTOOL_APP_LDFLAGS)
- qt_test_test_bitcoin_qt_CXXFLAGS = $(AM_CXXFLAGS) $(QT_PIE_FLAGS)
- diff --git a/src/Makefile.test.include b/src/Makefile.test.include
- index 961f2df..5faed9a 100644
- --- a/src/Makefile.test.include
- +++ b/src/Makefile.test.include
- @@ -140,6 +140,7 @@ BITCOIN_TESTS =\
- test/undo_tests.cpp \
- test/univalue_tests.cpp \
- test/util_tests.cpp \
- + test/equihash_tests.cpp \
- test/validation_tests.cpp
- if ENABLE_WALLET
- @@ -155,7 +156,8 @@ endif
- test_test_bitcoin_SOURCES = $(BITCOIN_TESTS) $(JSON_TEST_FILES) $(RAW_TEST_FILES)
- test_test_bitcoin_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) -I$(builddir)/test/ $(TESTDEFS) $(EVENT_CFLAGS)
- test_test_bitcoin_LDADD = $(LIBBITCOIN_SERVER) $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CONSENSUS) $(LIBBITCOIN_CRYPTO) $(LIBUNIVALUE) \
- - $(LIBLEVELDB) $(LIBLEVELDB_SSE42) $(LIBMEMENV) $(BOOST_LIBS) $(BOOST_UNIT_TEST_FRAMEWORK_LIB) $(LIBSECP256K1) $(EVENT_LIBS)
- + $(LIBLEVELDB) $(LIBLEVELDB_SSE42) $(LIBMEMENV) $(BOOST_LIBS) $(BOOST_UNIT_TEST_FRAMEWORK_LIB) $(LIBSECP256K1) $(EVENT_LIBS) \
- + $(LIBEQUIHASH_LIBS)
- test_test_bitcoin_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
- if ENABLE_WALLET
- @@ -183,7 +185,8 @@ test_test_bitcoin_fuzzy_LDADD = \
- $(LIBBITCOIN_UTIL) \
- $(LIBBITCOIN_CONSENSUS) \
- $(LIBBITCOIN_CRYPTO) \
- - $(LIBSECP256K1)
- + $(LIBSECP256K1)\
- + $(LIBEQUIHASH_LIBS)
- test_test_bitcoin_fuzzy_LDADD += $(BOOST_LIBS) $(CRYPTO_LIBS)
- #
- diff --git a/src/amount.cpp b/src/amount.cpp
- index b779b0f..cbeda04 100644
- --- a/src/amount.cpp
- +++ b/src/amount.cpp
- @@ -7,11 +7,11 @@
- #include "tinyformat.h"
- -const std::string CURRENCY_UNIT = "BCH";
- +const std::string CURRENCY_UNIT = "CDY";
- std::string Amount::ToString() const {
- - return strprintf("%d.%08d %s", amount / COIN.GetSatoshis(),
- - amount % COIN.GetSatoshis(), CURRENCY_UNIT);
- + return strprintf("%d.%05d %s", amount / (COIN.GetSatoshis() / COIN_MULTIPLE),
- + amount % (COIN.GetSatoshis() / COIN_MULTIPLE), CURRENCY_UNIT);
- }
- CFeeRate::CFeeRate(const Amount nFeePaid, size_t nBytes_) {
- @@ -45,6 +45,6 @@ Amount CFeeRate::GetFee(size_t nBytes_) const {
- std::string CFeeRate::ToString() const {
- return strprintf(
- - "%d.%08d %s/kB", nSatoshisPerK.GetSatoshis() / COIN.GetSatoshis(),
- - nSatoshisPerK.GetSatoshis() % COIN.GetSatoshis(), CURRENCY_UNIT);
- + "%d.%05d %s/kB", nSatoshisPerK.GetSatoshis() / (COIN.GetSatoshis() / COIN_MULTIPLE),
- + nSatoshisPerK.GetSatoshis() % (COIN.GetSatoshis() / COIN_MULTIPLE), CURRENCY_UNIT);
- }
- diff --git a/src/amount.h b/src/amount.h
- index f076ecf..0dfccd3 100644
- --- a/src/amount.h
- +++ b/src/amount.h
- @@ -112,6 +112,9 @@ typedef int64_t CAmount;
- static const Amount COIN(100000000);
- static const Amount CENT(1000000);
- +static const CAmount COIN_MULTIPLE = 1000; // CDY * 1000
- +static const CAmount COIN_DECIMAL_COUNT = 5; // CDY 5 decimals
- +
- extern const std::string CURRENCY_UNIT;
- /**
- diff --git a/src/bitcoin-tx.cpp b/src/bitcoin-tx.cpp
- index f93799b..85d7a36 100644
- --- a/src/bitcoin-tx.cpp
- +++ b/src/bitcoin-tx.cpp
- @@ -540,7 +540,7 @@ static Amount AmountFromValue(const UniValue &value) {
- }
- int64_t n;
- - if (!ParseFixedPoint(value.getValStr(), 8, &n)) {
- + if (!ParseFixedPoint(value.getValStr(), COIN_DECIMAL_COUNT, &n)) {
- throw std::runtime_error("Invalid amount");
- }
- Amount amount = Amount(n);
- diff --git a/src/chain.cpp b/src/chain.cpp
- index 7ac803c..ba4b6ed 100644
- --- a/src/chain.cpp
- +++ b/src/chain.cpp
- @@ -156,7 +156,10 @@ int64_t GetBlockProofEquivalentTime(const CBlockIndex &to,
- r = from.nChainWork - to.nChainWork;
- sign = -1;
- }
- - r = r * arith_uint256(params.nPowTargetSpacing) / GetBlockProof(tip);
- +
- + // Yang
- + int64_t nPowTargetSpacing = tip.nHeight >= params.cdyHeight ? params.nPowTargetSpacingCDY : params.nPowTargetSpacing;
- + r = r * arith_uint256(nPowTargetSpacing) / GetBlockProof(tip);
- if (r.bits() > 63) {
- return sign * std::numeric_limits<int64_t>::max();
- }
- diff --git a/src/chain.h b/src/chain.h
- index 8f6a9c3..7971025 100644
- --- a/src/chain.h
- +++ b/src/chain.h
- @@ -15,6 +15,7 @@
- #include <unordered_map>
- #include <vector>
- +#include <string.h>
- class CBlockFileInfo {
- public:
- @@ -215,9 +216,11 @@ public:
- //! block header
- int32_t nVersion;
- uint256 hashMerkleRoot;
- + uint32_t nReserved[7];
- uint32_t nTime;
- uint32_t nBits;
- - uint32_t nNonce;
- + uint256 nNonce;
- + std::vector<unsigned char> nSolution;
- //! (memory only) Sequential id assigned to distinguish order in which
- //! blocks are received.
- @@ -243,9 +246,11 @@ public:
- nVersion = 0;
- hashMerkleRoot = uint256();
- + memset(nReserved, 0, sizeof(nReserved));
- nTime = 0;
- nBits = 0;
- - nNonce = 0;
- + nNonce = uint256();
- + nSolution.clear();
- }
- CBlockIndex() { SetNull(); }
- @@ -255,9 +260,13 @@ public:
- nVersion = block.nVersion;
- hashMerkleRoot = block.hashMerkleRoot;
- + // TODO(h4x3rotab): Copy nHeight or not?
- + nHeight = block.nHeight;
- + memcpy(nReserved, block.nReserved, sizeof(nReserved));
- nTime = block.nTime;
- nBits = block.nBits;
- nNonce = block.nNonce;
- + nSolution = block.nSolution;
- }
- CDiskBlockPos GetBlockPos() const {
- @@ -285,9 +294,12 @@ public:
- block.hashPrevBlock = pprev->GetBlockHash();
- }
- block.hashMerkleRoot = hashMerkleRoot;
- + block.nHeight = nHeight;
- + memcpy(block.nReserved, nReserved, sizeof(block.nReserved));
- block.nTime = nTime;
- block.nBits = nBits;
- block.nNonce = nNonce;
- + block.nSolution = nSolution;
- return block;
- }
- @@ -413,9 +425,14 @@ public:
- READWRITE(this->nVersion);
- READWRITE(hashPrev);
- READWRITE(hashMerkleRoot);
- + //Yang
- + for(size_t i = 0; i < (sizeof(nReserved) / sizeof(nReserved[0])); i++) {
- + READWRITE(nReserved[i]);
- + }
- READWRITE(nTime);
- READWRITE(nBits);
- READWRITE(nNonce);
- + READWRITE(nSolution);
- }
- uint256 GetBlockHash() const {
- @@ -423,9 +440,12 @@ public:
- block.nVersion = nVersion;
- block.hashPrevBlock = hashPrev;
- block.hashMerkleRoot = hashMerkleRoot;
- + block.nHeight = nHeight;
- + memcpy(block.nReserved, nReserved, sizeof(block.nReserved));
- block.nTime = nTime;
- block.nBits = nBits;
- block.nNonce = nNonce;
- + block.nSolution = nSolution;
- return block.GetHash();
- }
- diff --git a/src/chainparams.cpp b/src/chainparams.cpp
- index 56a3245..76b6bf3 100644
- --- a/src/chainparams.cpp
- +++ b/src/chainparams.cpp
- @@ -6,11 +6,24 @@
- #include "chainparams.h"
- #include "consensus/merkle.h"
- +#include "uint256.h"
- +#include "arith_uint256.h"
- +
- #include "tinyformat.h"
- #include "util.h"
- #include "utilstrencodings.h"
- #include <cassert>
- +// For equihash_parameters_acceptable.
- +#include "crypto/equihash.h"
- +#include "net.h"
- +#include "validation.h"
- +#define equihash_parameters_acceptable(N, K) \
- + ((CBlockHeader::HEADER_SIZE + equihash_solution_size(N, K))*MAX_HEADERS_RESULTS < \
- + MAX_PROTOCOL_MESSAGE_LENGTH-1000)
- +
- +#include "base58.h"
- +#include <boost/assign/list_of.hpp>
- #include "chainparamsseeds.h"
- @@ -43,10 +56,11 @@ static CBlock CreateGenesisBlock(const char *pszTimestamp,
- CBlock genesis;
- genesis.nTime = nTime;
- genesis.nBits = nBits;
- - genesis.nNonce = nNonce;
- + genesis.nNonce = ArithToUint256(arith_uint256(nNonce));
- genesis.nVersion = nVersion;
- genesis.vtx.push_back(MakeTransactionRef(std::move(txNew)));
- genesis.hashPrevBlock.SetNull();
- + genesis.nHeight = 0;
- genesis.hashMerkleRoot = BlockMerkleRoot(genesis);
- return genesis;
- }
- @@ -78,6 +92,8 @@ static CBlock CreateGenesisBlock(uint32_t nTime, uint32_t nNonce,
- nBits, nVersion, genesisReward);
- }
- +const arith_uint256 maxUint = UintToArith256(uint256S("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"));
- +
- /**
- * Main network
- */
- @@ -102,11 +118,22 @@ public:
- consensus.BIP66Height = 363725;
- consensus.antiReplayOpReturnSunsetHeight = 530000;
- consensus.antiReplayOpReturnCommitment = GetAntiReplayCommitment();
- - consensus.powLimit = uint256S(
- - "00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
- + consensus.powLimit = uint256S("0007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
- + consensus.powLimitLegacy = uint256S("00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
- +
- + //based on https://github.com/BTCGPU/BTCGPU/issues/78
- + consensus.nPowAveragingWindow = 30;
- + assert(maxUint/UintToArith256(consensus.powLimit) >= consensus.nPowAveragingWindow);
- + consensus.nPowMaxAdjustDown = 32;
- + consensus.nPowMaxAdjustUp = 16;
- +
- // two weeks
- - consensus.nPowTargetTimespan = 14 * 24 * 60 * 60;
- + consensus.nPowTargetTimespanLegacy = 14 * 24 * 60 * 60;
- consensus.nPowTargetSpacing = 10 * 60;
- +
- + //Yang
- + consensus.nPowTargetSpacingCDY = 2 * 60;
- +
- consensus.fPowAllowMinDifficultyBlocks = false;
- consensus.fPowNoRetargeting = false;
- // 95% of 2016
- @@ -131,14 +158,11 @@ public:
- // The best chain should have at least this much work.
- consensus.nMinimumChainWork =
- - uint256S("0x0000000000000000000000000000000000000000007e5dbf54c7f6b"
- - "58a6853cd");
- + uint256S("0x00000000000000000000000000000000000000000082d89e5b8963ba7d734c61");
- // By default assume that the signatures in ancestors of this block are
- // valid.
- - consensus.defaultAssumeValid =
- - uint256S("0x000000000000000005e14d3f9fdfb70745308706615cfa9edca4f45"
- - "58332b201");
- + consensus.defaultAssumeValid = uint256S("0x000000000000000003d0f45045742bb557f1a6c633cdb9de53564eb7ec4459d0"); // block hash 512665
- // Aug, 1 hard fork
- consensus.uahfHeight = 478559;
- @@ -146,6 +170,11 @@ public:
- // Nov, 13 hard fork
- consensus.daaHeight = 504031;
- + // hard fork-----add by hmc
- + consensus.cdyHeight = 512666;
- + consensus.BitcoinPostforkBlock = uint256S("0000000000000000007b746068bd08ba4089f97636690e9dc758774e7db21f17"); // 512666 block hash
- + consensus.BitcoinPostforkTime = 1515799972;
- +
- /**
- * The message start string is designed to be unlikely to occur in
- * normal data. The characters are rarely used upper ASCII, not valid as
- @@ -156,15 +185,26 @@ public:
- diskMagic[2] = 0xb4;
- diskMagic[3] = 0xd9;
- netMagic[0] = 0xe3;
- - netMagic[1] = 0xe1;
- - netMagic[2] = 0xf3;
- - netMagic[3] = 0xe8;
- - nDefaultPort = 8333;
- + netMagic[1] = 0xc3; // 0x80 + 0x43 'C'
- + netMagic[2] = 0xc4; // 0x80 + 0x44 'D'
- + netMagic[3] = 0xd9; // 0x80 + 0x59 'Y'
- + netMagicLegacy[0] = 0xe3; // BCH
- + netMagicLegacy[1] = 0xe1; // BCH
- + netMagicLegacy[2] = 0xf3; // BCH
- + netMagicLegacy[3] = 0xe8; // BCH
- +
- + // use different default
- + nDefaultPort = 8367;
- + nBitcoinDefaultPort = 8333;
- nPruneAfterHeight = 100000;
- + const size_t N = 200, K = 9;
- + BOOST_STATIC_ASSERT(equihash_parameters_acceptable(N, K));
- + nEquihashN = N;
- + nEquihashK = K;
- genesis = CreateGenesisBlock(1231006505, 2083236893, 0x1d00ffff, 1,
- 50 * COIN);
- - consensus.hashGenesisBlock = genesis.GetHash();
- + consensus.hashGenesisBlock = genesis.GetHash(consensus);
- assert(consensus.hashGenesisBlock ==
- uint256S("0x000000000019d6689c085ae165831e934ff763ae46a2a6c172b3"
- "f1b60a8ce26f"));
- @@ -176,29 +216,15 @@ public:
- // subset of possible options.
- // Bitcoin ABC seeder
- vSeeds.push_back(
- - CDNSSeedData("bitcoinabc.org", "seed.bitcoinabc.org", true));
- - // bitcoinforks seeders
- - vSeeds.push_back(CDNSSeedData("bitcoinforks.org",
- - "seed-abc.bitcoinforks.org", true));
- - // BU backed seeder
- - vSeeds.push_back(CDNSSeedData("bitcoinunlimited.info",
- - "btccash-seeder.bitcoinunlimited.info",
- - true));
- - // Bitprim
- - vSeeds.push_back(CDNSSeedData("bitprim.org", "seed.bitprim.org", true));
- - // Amaury S횋CHET
- - vSeeds.push_back(
- - CDNSSeedData("deadalnix.me", "seed.deadalnix.me", true));
- - // criptolayer.net
- - vSeeds.push_back(
- - CDNSSeedData("criptolayer.net", "seeder.criptolayer.net", true));
- + CDNSSeedData("bitcoincandy.one", "seed.bitcoincandy.one", true));
- + vSeeds.push_back(CDNSSeedData("cdy.one", "seed.cdy.one", true));
- - base58Prefixes[PUBKEY_ADDRESS] = std::vector<uint8_t>(1, 0);
- - base58Prefixes[SCRIPT_ADDRESS] = std::vector<uint8_t>(1, 5);
- + base58Prefixes[PUBKEY_ADDRESS] = std::vector<uint8_t>(1, 0x1c); // 'C'
- + base58Prefixes[SCRIPT_ADDRESS] = std::vector<uint8_t>(1, 0x58); // 'c'
- base58Prefixes[SECRET_KEY] = std::vector<uint8_t>(1, 128);
- base58Prefixes[EXT_PUBLIC_KEY] = {0x04, 0x88, 0xB2, 0x1E};
- base58Prefixes[EXT_SECRET_KEY] = {0x04, 0x88, 0xAD, 0xE4};
- - cashaddrPrefix = "bitcoincash";
- + cashaddrPrefix = "bitcoincandy";
- vFixedSeeds = std::vector<SeedSpec6>(
- pnSeed6_main, pnSeed6_main + ARRAYLEN(pnSeed6_main));
- @@ -276,11 +302,19 @@ public:
- consensus.BIP66Height = 330776;
- consensus.antiReplayOpReturnSunsetHeight = 1250000;
- consensus.antiReplayOpReturnCommitment = GetAntiReplayCommitment();
- - consensus.powLimit = uint256S(
- - "00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
- + consensus.powLimit = uint256S("0007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
- + consensus.powLimitLegacy = uint256S("00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
- +
- + //based on https://github.com/BTCGPU/BTCGPU/issues/78
- + consensus.nPowAveragingWindow = 30;
- + assert(maxUint/UintToArith256(consensus.powLimit) >= consensus.nPowAveragingWindow);
- + consensus.nPowMaxAdjustDown = 32;
- + consensus.nPowMaxAdjustUp = 16;
- +
- // two weeks
- - consensus.nPowTargetTimespan = 14 * 24 * 60 * 60;
- + consensus.nPowTargetTimespanLegacy = 14 * 24 * 60 * 60;
- consensus.nPowTargetSpacing = 10 * 60;
- + consensus.nPowTargetSpacingCDY = 2 * 60;
- consensus.fPowAllowMinDifficultyBlocks = true;
- consensus.fPowNoRetargeting = false;
- // 75% for testchains
- @@ -305,8 +339,7 @@ public:
- // The best chain should have at least this much work.
- consensus.nMinimumChainWork =
- - uint256S("0x00000000000000000000000000000000000000000000002888c34d6"
- - "1b53a244a");
- + uint256S("0000000000000000000000000000000000000000000000000453e926d09ebe87");
- // By default assume that the signatures in ancestors of this block are
- // valid.
- @@ -320,20 +353,42 @@ public:
- // Nov, 13 hard fork
- consensus.daaHeight = 1188697;
- + // hard fork-----add by hmc
- + consensus.cdyHeight = 201601;
- + consensus.BitcoinPostforkBlock = uint256S("00000000d16d6c2aecc7436eea0c54a53741fee9abf265606aa465d6fd3f3d8a"); // block 201601
- + consensus.BitcoinPostforkTime = 1393815074;
- +
- diskMagic[0] = 0x0b;
- diskMagic[1] = 0x11;
- diskMagic[2] = 0x09;
- diskMagic[3] = 0x07;
- netMagic[0] = 0xf4;
- - netMagic[1] = 0xe5;
- - netMagic[2] = 0xf3;
- - netMagic[3] = 0xf4;
- - nDefaultPort = 18333;
- + netMagic[1] = 0x43; // 'C'
- + netMagic[2] = 0x44; // 'D'
- + netMagic[3] = 0x59; // 'Y'
- + // BTC
- + netMagicLegacy[0] = 0x0b;
- + netMagicLegacy[1] = 0x11;
- + netMagicLegacy[2] = 0x09;
- + netMagicLegacy[3] = 0x07;
- + // BCH
- + // netMagicLegacy[0] = 0xf4;
- + // netMagicLegacy[1] = 0xe5;
- + // netMagicLegacy[2] = 0xf3;
- + // netMagicLegacy[3] = 0xf4;
- +
- + // use different default
- + nDefaultPort = 18367;
- + nBitcoinDefaultPort = 18333;
- nPruneAfterHeight = 1000;
- + const size_t N = 200, K = 9;
- + BOOST_STATIC_ASSERT(equihash_parameters_acceptable(N, K));
- + nEquihashN = N;
- + nEquihashK = K;
- genesis =
- CreateGenesisBlock(1296688602, 414098458, 0x1d00ffff, 1, 50 * COIN);
- - consensus.hashGenesisBlock = genesis.GetHash();
- + consensus.hashGenesisBlock = genesis.GetHash(consensus);
- assert(consensus.hashGenesisBlock ==
- uint256S("0x000000000933ea01ad0ee984209779baaec3ced90fa3f4087195"
- "26f8d77f4943"));
- @@ -345,27 +400,14 @@ public:
- vSeeds.clear();
- // nodes with support for servicebits filtering should be at the top
- // Bitcoin ABC seeder
- - vSeeds.push_back(CDNSSeedData("bitcoinabc.org",
- - "testnet-seed.bitcoinabc.org", true));
- - // bitcoinforks seeders
- - vSeeds.push_back(CDNSSeedData(
- - "bitcoinforks.org", "testnet-seed-abc.bitcoinforks.org", true));
- - // Bitprim
- - vSeeds.push_back(
- - CDNSSeedData("bitprim.org", "testnet-seed.bitprim.org", true));
- - // Amaury S횋CHET
- - vSeeds.push_back(
- - CDNSSeedData("deadalnix.me", "testnet-seed.deadalnix.me", true));
- - // criptolayer.net
- - vSeeds.push_back(CDNSSeedData("criptolayer.net",
- - "testnet-seeder.criptolayer.net", true));
- + vSeeds.push_back(CDNSSeedData("bitcoincandy.one", "testnet-seed.bitcoincandy.one", true));
- base58Prefixes[PUBKEY_ADDRESS] = std::vector<uint8_t>(1, 111);
- base58Prefixes[SCRIPT_ADDRESS] = std::vector<uint8_t>(1, 196);
- base58Prefixes[SECRET_KEY] = std::vector<uint8_t>(1, 239);
- base58Prefixes[EXT_PUBLIC_KEY] = {0x04, 0x35, 0x87, 0xCF};
- base58Prefixes[EXT_SECRET_KEY] = {0x04, 0x35, 0x83, 0x94};
- - cashaddrPrefix = "bchtest";
- + cashaddrPrefix = "cdytest";
- vFixedSeeds = std::vector<SeedSpec6>(
- pnSeed6_test, pnSeed6_test + ARRAYLEN(pnSeed6_test));
- @@ -412,11 +454,19 @@ public:
- consensus.BIP66Height = 1251;
- consensus.antiReplayOpReturnSunsetHeight = 530000;
- consensus.antiReplayOpReturnCommitment = GetAntiReplayCommitment();
- - consensus.powLimit = uint256S(
- - "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
- + consensus.powLimit = uint256S("7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
- + consensus.powLimitLegacy = uint256S("7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
- +
- + //based on https://github.com/BTCGPU/BTCGPU/issues/78
- + consensus.nPowAveragingWindow = 30;
- + //assert(maxUint/UintToArith256(consensus.powLimit) >= consensus.nPowAveragingWindow);
- + consensus.nPowMaxAdjustDown = 32;
- + consensus.nPowMaxAdjustUp = 16;
- +
- // two weeks
- - consensus.nPowTargetTimespan = 14 * 24 * 60 * 60;
- + consensus.nPowTargetTimespanLegacy = 14 * 24 * 60 * 60;
- consensus.nPowTargetSpacing = 10 * 60;
- + consensus.nPowTargetSpacingCDY = 2 * 60;
- consensus.fPowAllowMinDifficultyBlocks = true;
- consensus.fPowNoRetargeting = true;
- // 75% for testchains
- @@ -440,10 +490,13 @@ public:
- consensus.defaultAssumeValid = uint256S("0x00");
- // Hard fork is always enabled on regtest.
- - consensus.uahfHeight = 0;
- + consensus.uahfHeight = 2017;
- +
- + // hard fork-----add by hmc
- + consensus.cdyHeight = 2260;
- // Nov, 13 hard fork is always on on regtest.
- - consensus.daaHeight = 0;
- + consensus.daaHeight = 2250;
- diskMagic[0] = 0xfa;
- diskMagic[1] = 0xbf;
- @@ -455,9 +508,13 @@ public:
- netMagic[3] = 0xfa;
- nDefaultPort = 18444;
- nPruneAfterHeight = 1000;
- + const size_t N = 48, K = 5;
- + BOOST_STATIC_ASSERT(equihash_parameters_acceptable(N, K));
- + nEquihashN = N;
- + nEquihashK = K;
- genesis = CreateGenesisBlock(1296688602, 2, 0x207fffff, 1, 50 * COIN);
- - consensus.hashGenesisBlock = genesis.GetHash();
- + consensus.hashGenesisBlock = genesis.GetHash(consensus);
- assert(consensus.hashGenesisBlock ==
- uint256S("0x0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b"
- "1a11466e2206"));
- @@ -487,7 +544,7 @@ public:
- base58Prefixes[SECRET_KEY] = std::vector<uint8_t>(1, 239);
- base58Prefixes[EXT_PUBLIC_KEY] = {0x04, 0x35, 0x87, 0xCF};
- base58Prefixes[EXT_SECRET_KEY] = {0x04, 0x35, 0x83, 0x94};
- - cashaddrPrefix = "bchreg";
- + cashaddrPrefix = "cdyreg";
- }
- void UpdateBIP9Parameters(Consensus::DeploymentPos d, int64_t nStartTime,
- diff --git a/src/chainparams.h b/src/chainparams.h
- index 1d9c4bf..d4013e2 100644
- --- a/src/chainparams.h
- +++ b/src/chainparams.h
- @@ -61,7 +61,8 @@ public:
- const Consensus::Params &GetConsensus() const { return consensus; }
- const CMessageHeader::MessageMagic &DiskMagic() const { return diskMagic; }
- const CMessageHeader::MessageMagic &NetMagic() const { return netMagic; }
- - int GetDefaultPort() const { return nDefaultPort; }
- + int GetDefaultPort(bool bootstrapping = false) const { return bootstrapping ? nBitcoinDefaultPort : nDefaultPort; }
- + const CMessageHeader::MessageMagic& NetMagicLegacy() const { return netMagicLegacy; }
- const CBlock &GenesisBlock() const { return genesis; }
- /** Make miner wait to have peers to avoid wasting work */
- @@ -71,6 +72,8 @@ public:
- /** Policy: Filter transactions that do not match well-defined patterns */
- bool RequireStandard() const { return fRequireStandard; }
- uint64_t PruneAfterHeight() const { return nPruneAfterHeight; }
- + unsigned int EquihashN() const { return nEquihashN; }
- + unsigned int EquihashK() const { return nEquihashK; }
- /**
- * Make miner stop after a block is found. In RPC, don't return until
- * nGenProcLimit blocks are generated.
- @@ -93,7 +96,11 @@ protected:
- Consensus::Params consensus;
- CMessageHeader::MessageMagic diskMagic;
- CMessageHeader::MessageMagic netMagic;
- + CMessageHeader::MessageMagic netMagicLegacy;
- int nDefaultPort;
- + int nBitcoinDefaultPort;
- + unsigned int nEquihashN = 0;
- + unsigned int nEquihashK = 0;
- uint64_t nPruneAfterHeight;
- std::vector<CDNSSeedData> vSeeds;
- std::vector<uint8_t> base58Prefixes[MAX_BASE58_TYPES];
- diff --git a/src/chainparamsbase.cpp b/src/chainparamsbase.cpp
- index bdb429f..554b16b 100644
- --- a/src/chainparamsbase.cpp
- +++ b/src/chainparamsbase.cpp
- @@ -31,7 +31,7 @@ void AppendParamsHelpMessages(std::string &strUsage, bool debugHelp) {
- */
- class CBaseMainParams : public CBaseChainParams {
- public:
- - CBaseMainParams() { nRPCPort = 8332; }
- + CBaseMainParams() { nRPCPort = 8366; }
- };
- static CBaseMainParams mainParams;
- @@ -41,7 +41,7 @@ static CBaseMainParams mainParams;
- class CBaseTestNetParams : public CBaseChainParams {
- public:
- CBaseTestNetParams() {
- - nRPCPort = 18332;
- + nRPCPort = 18366;
- strDataDir = "testnet3";
- }
- };
- @@ -53,7 +53,7 @@ static CBaseTestNetParams testNetParams;
- class CBaseRegTestParams : public CBaseChainParams {
- public:
- CBaseRegTestParams() {
- - nRPCPort = 18332;
- + nRPCPort = 18366;
- strDataDir = "regtest";
- }
- };
- diff --git a/src/chainparamsseeds.h b/src/chainparamsseeds.h
- index 0dfe0ab..ba73164 100644
- --- a/src/chainparamsseeds.h
- +++ b/src/chainparamsseeds.h
- @@ -8,1537 +8,8 @@
- * IPv4 as well as onion addresses are wrapped inside a IPv6 address accordingly.
- */
- static SeedSpec6 pnSeed6_main[] = {
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x01,0x20,0xc8,0x78}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x02,0x21,0x16,0xa1}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x09,0x13,0x6d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x09,0x1c,0x0a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x09,0x90,0x53}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x09,0xdc,0x84}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x2c,0x61,0x6e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x38,0x28,0x01}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x38,0x32,0x71}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x38,0xf7,0x45}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x3d,0x21,0xdc}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x3d,0x28,0x38}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x4f,0x4f,0x96}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x67,0x89,0x92}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x87,0x9d,0x11}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xbd,0x90,0xfa}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xbd,0x99,0x85}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xbd,0xa4,0x93}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xbd,0xac,0xc8}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xbd,0xbf,0x7b}, 8335},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xe6,0x91,0x82}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xf9,0x3a,0x4c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x08,0x26,0x58,0x7e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0c,0x17,0x7f,0xaf}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x36,0x5f,0x93}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x36,0xe0,0x54}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x37,0x83,0xf0}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x37,0xc8,0xb1}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x38,0xa8,0x40}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x44,0xda,0xf6}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x49,0x00,0x3d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x4e,0x70,0x0b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x52,0x5c,0xc9}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x5c,0x52,0xeb}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x5e,0x29,0x52}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x72,0x7f,0xbd}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x72,0xee,0xb8}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x72,0xf5,0xa0}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x7c,0x6e,0x65}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x7d,0x17,0xa4}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x7d,0x3b,0x87}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x7e,0x0a,0x03}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x7e,0x1f,0x8d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x7e,0x20,0x67}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x7e,0x28,0x32}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x7e,0x5d,0x82}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x7e,0x8b,0xb6}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x7e,0x9b,0x3f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x7e,0xd1,0x75}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x7e,0xe2,0xdd}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x7e,0xec,0x29}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x7e,0xef,0x57}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x7e,0xef,0xdb}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0xd2,0x1e,0x16}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0xd2,0xb0,0x7c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0xe4,0x6d,0x99}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0xe5,0x39,0x19}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0xe5,0x39,0xd5}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0xe5,0x3b,0xf0}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0xe5,0x3e,0xbf}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0xe5,0x3f,0x32}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0xe5,0x71,0x8f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0xe5,0x7a,0xc4}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0e,0x03,0x26,0xb3}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0e,0x22,0xae,0xb5}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0e,0x3f,0x07,0x3c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0e,0xa1,0x03,0x88}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x12,0x66,0xde,0x7d}, 8335},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x12,0x66,0xde,0x7e}, 8335},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x12,0x66,0xde,0xeb}, 8335},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x12,0xc4,0x00,0xf2}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0x5b,0xef,0x4c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0x61,0x4c,0x60}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0x63,0xcc,0x47}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0x7e,0x7e,0x7b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0xf2,0x89,0xed}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x04,0xdf,0x07}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x06,0x23,0x54}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x06,0xbb,0x4f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x10,0x4b,0x80}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x1c,0x1f,0x2d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x2c,0x04,0x5d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x30,0x0d,0x57}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x41,0x38,0x89}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x47,0x22,0xc6}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x47,0x28,0x2e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x4c,0x7a,0x6c}, 8090},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x5b,0x54,0xf1}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x71,0xc1,0x18}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x78,0xaf,0xf3}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xb0,0x0d,0x0a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xbe,0x32,0x71}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xbe,0x73,0x7c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xbe,0x7a,0xd5}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xc0,0x36,0x80}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xc4,0xb1,0x9f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xcd,0x8f,0xb2}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xd1,0x74,0x86}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xd4,0x8c,0xa3}, 28333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xe1,0x7a,0xec}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xfd,0x95,0x8f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1b,0x20,0x49,0x80}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1b,0xfc,0xc2,0x88}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0xb2,0xb1,0xc3}, 8343},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0xd0,0xb7,0x23}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0xd1,0x3b,0xb3}, 21824},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x22,0xc8,0xe0,0xb6}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x22,0xcf,0x5b,0x0e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x22,0xd3,0x69,0x49}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x22,0xd6,0x50,0x33}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x22,0xd7,0x7f,0xdf}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x22,0xd8,0x32,0x02}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x22,0xe1,0x6b,0x8e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x22,0xe3,0x2f,0xff}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x22,0xe4,0xf4,0x31}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x22,0xe5,0xcd,0xdd}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x22,0xf8,0x25,0x20}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x22,0xf8,0xa0,0x43}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x22,0xfa,0x39,0xd6}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x22,0xfa,0xe4,0x94}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x22,0xfb,0x31,0x63}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x22,0xfb,0xf9,0x9f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x22,0xfd,0x29,0x98}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x22,0xfd,0x89,0x7d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0x9a,0x65,0xfe}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0x9a,0x95,0x80}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0x9a,0x99,0xbc}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0x9a,0xfa,0x72}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0x9c,0x76,0x94}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0x9c,0x84,0xb9}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0x9c,0xe1,0xbe}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0x9d,0xe3,0x91}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0x9d,0xf4,0xe1}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0x9e,0x52,0x9c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0x9e,0xbe,0xee}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0x9e,0xc0,0x3c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0x9e,0xd0,0xaa}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0x9e,0xe2,0x8e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0x9e,0xf0,0xae}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0x9e,0xf6,0x1b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0xa2,0x84,0x60}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0xa6,0xf4,0x0a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0xb1,0x93,0xff}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0xb6,0x66,0x2c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0xc0,0x0c,0xb5}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0xc5,0x19,0xeb}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0xc5,0x45,0x79}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0xc6,0x48,0x00}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0xc6,0x96,0xe9}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0xc6,0xaa,0x8b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0xc9,0x8f,0x38}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0xe1,0x72,0x8a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0xe2,0xc3,0xb0}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x2e,0xf6,0x1c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x3b,0x28,0xc6}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x3d,0xee,0x36}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x3d,0xee,0x84}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x6e,0x3b,0xe6}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x78,0xa4,0x10}, 18333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x8f,0xf3,0x3f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0xbb,0x69,0x41}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0xbb,0x8d,0x49}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0xdd,0xc6,0x39}, 28333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0xf7,0x16,0x35}, 8533},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6a,0xfa,0x96}, 8363},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6c,0x0d,0x66}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6c,0x0e,0xa6}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6c,0x47,0xfe}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6c,0x64,0x7a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6c,0x6b,0x78}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6c,0xc3,0x36}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6c,0xc3,0x6d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6c,0xf6,0xa3}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6c,0xf6,0xaa}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6c,0xf6,0xac}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6c,0xf6,0xb0}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6c,0xf6,0xb8}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6c,0xf6,0xbd}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6c,0xf6,0xc6}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6c,0xf6,0xda}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6c,0xf6,0xdc}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6c,0xf6,0xdf}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6c,0xf6,0xe2}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6c,0xf6,0xee}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x28,0x7e,0xfd,0xb4}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x29,0x32,0x60,0x65}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2a,0x77,0x2a,0x5c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2a,0x77,0x2b,0x2e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x14,0x98,0x89}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x20,0x06,0xad}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x20,0x2e,0xc6}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x20,0x41,0x23}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x20,0xe9,0xe1}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x21,0x0e,0x1b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x21,0x14,0x31}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x21,0x30,0x2a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x21,0x7a,0xfe}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x30,0xa5,0x4c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x3a,0x37,0xba}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x3f,0x33,0x0a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x4d,0xdb,0x32}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x4e,0x80,0x05}, 8334},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x4f,0x43,0xe6}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x4f,0x4e,0xe9}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x4f,0x59,0xfd}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x4f,0x63,0xdc}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x4f,0xa2,0x8f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x4f,0xce,0xad}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x76,0x85,0xf2}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x7b,0x67,0x73}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x04,0x55,0xf1}, 9090},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x09,0x7c,0x92}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x1c,0xcc,0x3d}, 17302},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x3b,0x2d,0x00}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x3d,0x11,0x51}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x65,0xf0,0xb8}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x65,0xfe,0xd7}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x67,0xf8,0x2d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x69,0x62,0xb3}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x6d,0x65,0xc6}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xa2,0x01,0x5d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xa5,0xdd,0xd1}, 9333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xd8,0x28,0xae}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xd8,0x30,0x7b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xe9,0x2b,0x9b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xf6,0x26,0x6f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x04,0x74}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x09,0x50}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x09,0x5d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x09,0x69}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x09,0xb9}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x09,0xc6}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x09,0xdb}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x09,0xf2}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x09,0xf9}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x0a,0x00}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x0a,0x0c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x0a,0x14}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x0a,0x1a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x0a,0x1b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x0a,0x2f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x0a,0x32}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x0a,0x36}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x0a,0x3b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x0a,0x3d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x0a,0x43}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x0a,0x46}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x0a,0x5c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x0a,0x5e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x0a,0x61}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x0a,0x69}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x0a,0xef}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x0a,0xf4}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x25,0x2a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x26,0x61}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x67,0x75}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x6a,0xfd}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x4a,0x16,0x67}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x20,0x4c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x20,0xce}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x20,0xeb}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x21,0x00}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x21,0x33}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x21,0x3c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x21,0xa9}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x21,0xcd}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x21,0xd7}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x21,0xf8}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x22,0x15}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x22,0x1a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x22,0x79}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x22,0x83}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x22,0x8e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x22,0xaf}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x22,0xbe}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x22,0xf8}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x23,0x36}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x39,0x63}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x3e,0x64}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x4c,0x86}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x4c,0xbe}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x4c,0xd3}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x4d,0x0d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x4d,0x2a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x4d,0xb2}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x4d,0xf4}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x4e,0x0e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x4e,0x74}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x4e,0x78}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x4e,0xbb}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x4e,0xe4}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x4e,0xf1}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x4f,0x2a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x4f,0x30}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x4f,0x40}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x4f,0x58}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x4f,0x5e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbc,0x05}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbc,0x06}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbc,0x0f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbc,0x40}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbc,0x61}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbc,0x89}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbc,0x8f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbc,0xad}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbc,0xbb}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbc,0xc9}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbc,0xe7}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbc,0xf6}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbd,0x02}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbd,0x37}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbd,0x41}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbd,0x86}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbd,0xb4}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbd,0xc9}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbe,0x0a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbe,0x5a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbe,0x71}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbe,0xe1}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbf,0x1f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbf,0x6a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbf,0x8e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbf,0xb0}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbf,0xd1}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xc0,0x7a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xc0,0xb3}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xc0,0xc9}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xc0,0xdf}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xc0,0xed}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xc1,0x16}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xc1,0x5d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xc3,0x82}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x59,0x2e,0xd1}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x59,0xb1,0x86}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x59,0xb1,0xba}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x59,0xb4,0xa2}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5a,0x66,0x46}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5a,0xcc,0xf1}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5a,0xd0,0xfe}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5a,0xf1,0xb8}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5b,0x5f,0x94}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5b,0xc6,0xae}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5b,0xe8,0x04}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x5a,0xc2}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x72,0x20}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x72,0xe5}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x73,0x82}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x74,0x8a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x74,0xcc}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x78,0x85}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x7a,0xe3}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x7b,0xc1}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x7b,0xe4}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x7c,0x73}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x7d,0x18}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x7d,0x6d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x7d,0x8c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x89,0xc5}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x8a,0x80}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x8a,0x8c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x8a,0x90}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x8a,0xa3}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x8a,0xc2}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x8a,0xc3}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x8a,0xc5}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x8a,0xd5}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x8b,0x43}, 8335},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x8b,0x55}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0xad,0x53}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x24,0x78}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x24,0xfa}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x25,0x39}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x25,0x57}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x25,0x64}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x25,0x69}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x25,0x6f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x25,0x86}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x25,0x89}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x25,0x8b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x25,0x93}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x25,0x96}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x25,0x97}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x25,0x98}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x25,0xfe}, 8335},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x26,0x05}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x26,0x58}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x27,0x57}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x28,0x68}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x28,0xb2}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x29,0x2a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x29,0x3a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x2b,0x16}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x2b,0x8a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x2b,0xc1}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x2b,0xd9}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x2c,0xe0}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x2d,0xb8}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x2e,0x1f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x2e,0xdb}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x2e,0xe0}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x2f,0x5f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x2f,0x79}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x2f,0x98}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x2f,0xa9}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x2f,0xca}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x2f,0xd8}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x38,0xe8}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x39,0x1b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x39,0x44}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x39,0x5c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x39,0x5f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x39,0x60}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x39,0x72}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x39,0x79}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x39,0x80}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x39,0x8b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x39,0x8c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x39,0x91}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x39,0x92}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x39,0x95}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x39,0x97}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x39,0x98}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x39,0x9b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x39,0x9c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x39,0xa1}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x3a,0x92}, 8335},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x3a,0xc2}, 8335},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x85,0xfc}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x20,0x0b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x20,0x25}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x20,0x31}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x20,0x51}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x20,0x66}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x20,0x73}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x20,0x96}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x20,0xa0}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x20,0xa8}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x20,0xaa}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x20,0xce}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x20,0xd6}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x20,0xde}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x21,0x24}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x21,0xf4}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x22,0xcc}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x22,0xdd}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x22,0xef}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x24,0x24}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x24,0x2b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x24,0x58}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x24,0x70}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x24,0x77}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x24,0x7f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x24,0x83}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x24,0x8e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x90,0x44,0x81}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x90,0x59,0x5f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x93,0xc2,0xb6}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0xc7,0x40,0x4e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0xc7,0xf5,0x93}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0xcd,0x68,0x54}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0xdd,0xaa,0xfb}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x31,0x97,0x95,0x5a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x23,0x47,0xde}, 9333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x4f,0xae,0xfd}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x59,0xeb,0xe7}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x74,0x18,0x2c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0xc9,0x90,0xaa}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0xfb,0x54,0x52}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x33,0x0f,0x40,0x26}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x33,0x0f,0x4e,0x0b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x33,0x0f,0xac,0x55}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x33,0x0f,0xb1,0xa2}, 5901},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x33,0xae,0x5b,0x39}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x33,0xfe,0x3e,0xa9}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x07,0xe9,0x0d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x10,0x6a,0x0b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x10,0x72,0x7f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x13,0xb6,0x01}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x1c,0xca,0x83}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x1d,0x24,0x47}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x1d,0x85,0x10}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x27,0xca,0x9f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x32,0x55,0x9d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x33,0xe8,0xea}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x35,0x94,0xa3}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x35,0xc6,0x8d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x35,0xf6,0x41}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x35,0xf8,0x2a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x37,0xb3,0x05}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x39,0x0e,0x43}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x3a,0xa3,0xc9}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x3a,0xbe,0x90}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x3b,0x46,0xb2}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x3e,0xb7,0x31}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x3f,0x85,0x69}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x3f,0xaf,0x3d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x41,0x3a,0xc7}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x41,0x54,0x46}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x42,0x0a,0xcc}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x42,0xb4,0x98}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x4d,0xc2,0xf5}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x4d,0xd2,0x2a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x4d,0xd3,0xdb}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x4d,0xdf,0x71}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x5a,0x84,0x2a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x5b,0x03,0x36}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0xa6,0x6a,0xd7}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0xa9,0xe6,0x32}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0xae,0xf4,0x4c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0xb2,0x5c,0x75}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0xd2,0x26,0xe3}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0xd2,0xfc,0x7b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0xd4,0x5c,0x00}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0xdd,0xba,0x1c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0xdd,0xe3,0x9d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0xe7,0xc9,0x3d}, 10333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0xf3,0x2c,0xb0}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x24,0xaf,0x4b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x40,0xd9,0xaf}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x42,0xdc,0xb3}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x42,0xde,0x0f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x4c,0x04,0x92}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x4c,0x27,0x76}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x4d,0x06,0x7d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x4d,0x09,0xb4}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x4d,0x60,0x2a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x4f,0x58,0x16}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x4f,0x5f,0x31}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x56,0x1e,0x4a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x59,0x08,0xed}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x59,0xa2,0x36}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x5a,0x94,0x84}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x5d,0xd3,0x42}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x95,0xce,0x16}, 18916},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x99,0x06,0x85}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x99,0x09,0xd9}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x99,0x7a,0x1f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x99,0xa3,0xa3}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x99,0xe0,0x97}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x9a,0x8b,0xd4}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x9e,0x0d,0x7b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x9e,0x57,0x0f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xa9,0x03,0x9b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xa9,0xc2,0xfd}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xa9,0xe7,0x37}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xad,0x95,0x16}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xae,0xe3,0xeb}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xaf,0xf3,0x7a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xb3,0x85,0x4f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xb3,0x9d,0x21}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xb7,0x24,0x06}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xb7,0x83,0x88}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xb7,0xbb,0xf9}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xb7,0xd6,0xf0}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xb7,0xd8,0xee}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xb7,0xeb,0x83}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xb7,0xef,0xe2}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xc1,0x67,0xe7}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xce,0x1b,0x12}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xce,0x2e,0x28}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xce,0x4d,0x3d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xd7,0xf8,0x8f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xdb,0xac,0x69}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xdf,0xd6,0xee}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xe0,0x89,0x6e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xec,0xd4,0x8b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xf1,0x95,0x02}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xfe,0x86,0x5e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xff,0xbb,0x95}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xff,0xc9,0x82}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xff,0xd5,0xfe}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3a,0xb6,0xc2,0xf7}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3a,0xe5,0xd0,0xd7}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3b,0x6e,0x73,0x34}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3b,0x6e,0x73,0x35}, 8335},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3b,0x6e,0x73,0x3c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3b,0xa7,0x6f,0xea}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3c,0xcd,0x5d,0x22}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3c,0xcd,0x5e,0x29}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3c,0xcd,0x95,0x07}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3c,0xcd,0x95,0xcc}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3d,0x64,0xb6,0xbd}, 18333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0x15,0x32,0x28}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0x4b,0xa5,0x7f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0x4b,0xf4,0x4e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0x70,0x08,0x15}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0x70,0x0b,0xbc}, 8345},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0xb2,0x5e,0xcc}, 8222},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0xcc,0x8d,0x22}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0xd2,0x5d,0xe5}, 28333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0xd2,0x6e,0xb5}, 18333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x40,0x5b,0xe9,0xce}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x40,0xbf,0x09,0x81}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x41,0x1d,0xde,0xb5}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x41,0x3c,0xfd,0x49}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0x44,0x2f,0x28}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0x67,0x0e,0x9d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0x6c,0x0f,0x05}, 8433},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0xaf,0xdd,0x3d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0xbb,0x41,0x06}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0xdb,0xc7,0x07}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0xe4,0x37,0x94}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0xe7,0x9a,0xba}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0x05,0xc8,0xd2}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0x51,0xc2,0xdb}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xa4,0xc6,0xf7}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xa8,0x6d,0xb7}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xb0,0x69,0x94}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xb8,0x19,0x18}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xbb,0x5b,0x79}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xcd,0xa2,0xf8}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xcd,0xb3,0xa1}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xdd,0x8e,0xfc}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x44,0x04,0xe4,0x8a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x44,0x2c,0x8f,0xd8}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x44,0x33,0x56,0xdf}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x44,0x64,0x13,0x58}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x44,0x77,0x52,0xb9}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x7b,0x0e,0x7f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0xa4,0xce,0xce}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0xac,0xae,0x15}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0xb5,0x14,0x98}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0xf4,0xbc,0x25}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0xfd,0x4f,0x96}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x46,0x77,0x7d,0xa0}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x46,0xb5,0x73,0x14}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x47,0x13,0xfc,0x72}, 15849},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x47,0x48,0xe1,0x24}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x47,0x5d,0xcc,0xe2}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x47,0x7f,0x2b,0x44}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x47,0xe0,0x0b,0xd6}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x47,0xe5,0xbe,0xdf}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x47,0xfc,0x89,0xf6}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0x05,0xa7,0x29}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0x0e,0xb0,0xeb}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0x0e,0xb3,0xb9}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0x30,0x14,0x8f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0x45,0xa4,0x9e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0x57,0x73,0x37}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0x5f,0x18,0xc8}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0xca,0xbe,0x44}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0xdb,0xc0,0x3b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0xe0,0x65,0x41}, 8334},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0xea,0xfb,0xcb}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x49,0x2d,0xb0,0x51}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x49,0x3e,0x92,0x0b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x49,0x88,0x0c,0xe6}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x49,0x8c,0x9b,0x8c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x49,0xdd,0xfb,0xc0}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x49,0xde,0x08,0x72}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x49,0xde,0xb2,0x67}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x49,0xe1,0x8f,0xd4}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x49,0xe8,0x5e,0x16}, 9333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x49,0xfc,0xc8,0xad}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4a,0x46,0xc7,0x07}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4a,0x61,0x36,0xa9}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4a,0x8e,0xb7,0x5e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4a,0xd7,0xcd,0x25}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4b,0x52,0x04,0xb7}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4b,0x76,0x07,0x47}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4b,0x87,0x26,0x7e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4b,0x8f,0x6d,0x2a}, 8334},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4b,0xab,0xfa,0x41}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4b,0xb1,0x89,0x86}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0x0e,0x28,0xe0}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0x10,0x0c,0x51}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0x1e,0x92,0x20}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0x72,0x6d,0xde}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0xa7,0xe0,0x16}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0xaa,0x88,0x2d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0xb7,0x66,0xc0}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0x46,0x07,0xee}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0x4e,0x17,0xed}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0x62,0x6c,0xc2}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0x8b,0x42,0x03}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0xea,0x68,0x89}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0xf9,0xd5,0x19}, 5914},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x00,0x10,0x96}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x22,0x0d,0xf3}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x2e,0x2b,0x15}, 38333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x2e,0x41,0xca}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x2e,0x6d,0x7c}, 8334},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x54,0x9a,0x33}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0xbb,0x5a,0x7a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0xc2,0x9e,0x8d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4f,0x43,0x7c,0x77}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4f,0x6d,0x75,0x36}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4f,0x89,0x45,0xaf}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4f,0xfa,0x7c,0x3f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4f,0xfa,0x7d,0x1d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4f,0xfa,0x7e,0x9b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0x03,0x9e,0xef}, 9333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0x1c,0x40,0xe6}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0x63,0x12,0x99}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0x66,0xea,0x0b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0x95,0x17,0x13}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0xd8,0x12,0x72}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0xdc,0xcb,0xa3}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0xe5,0x07,0xe3}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0xeb,0x1f,0x6f}, 28480},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x02,0x5f,0x87}, 8335},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x62,0xd8,0xd4}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x6e,0x12,0xdf}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0xa3,0xcf,0x0c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0xb6,0xfb,0x76}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0xb8,0xce,0xcb}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0xbb,0x52,0x36}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0xbf,0xf3,0x23}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x17,0xc0,0x9e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x19,0x37,0x47}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x19,0x48,0xe4}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x24,0x8d,0xa0}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x25,0xef,0xdf}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x2f,0x90,0xc8}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x47,0x24,0x1d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x83,0x57,0x6d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xa1,0x85,0x70}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xc4,0x0d,0x4f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xca,0xc7,0x7a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xd9,0x85,0x91}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xda,0xe0,0x7b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xdd,0x80,0xcf}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xeb,0x93,0x09}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xfb,0x8a,0x50}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x00,0xd7,0xc2}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x39,0x23,0xdf}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x45,0xcb,0x2c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x4e,0xb8,0x0e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x68,0x3b,0xaa}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xa2,0xba,0x3d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xa2,0xf4,0x63}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xa2,0xf5,0xa7}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xa3,0xdf,0x91}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xa9,0x14,0x22}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xac,0x45,0x9a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xf3,0x42,0x78}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x0a,0xa0,0x5e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x32,0xf3,0xa5}, 28480},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x38,0x03,0x76}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x38,0x0e,0x59}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x4b,0xff,0x4c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x50,0xaf,0xfc}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x6f,0xb5,0x83}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x8b,0x8c,0x5c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0xc8,0x4c,0x20}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0xd1,0x92,0x63}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0x01,0x51,0xaa}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0x18,0x91,0x12}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0x18,0xca,0xc7}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0x40,0x20,0x59}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0x90,0xc5,0xa3}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0xa6,0xbf,0x47}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0xc3,0xd6,0xbd}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0xd6,0x93,0x63}, 8340},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0xe0,0x6b,0xcf}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0xe0,0xcd,0x97}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0xfd,0x65,0x4a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x56,0x03,0x9b,0x93}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x56,0x54,0x17,0x94}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x56,0x58,0x12,0x58}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x56,0x8a,0x33,0x57}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x56,0x8c,0x99,0xed}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x56,0xa3,0xf5,0x8a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x56,0xb4,0x38,0x77}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x56,0xbf,0x4b,0x58}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x56,0xc2,0x90,0x78}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x56,0xc2,0x94,0x97}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x56,0xc2,0x96,0x2a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x56,0xf7,0x31,0x54}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x56,0xfd,0x2a,0xd0}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0x06,0xf5,0x99}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0x0e,0x31,0x3c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0x64,0xb3,0x49}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0x78,0x08,0xc8}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0xa7,0x6d,0xc5}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0xb6,0xbf,0xaa}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0xec,0xc5,0x28}, 8433},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0xec,0xc6,0x06}, 8433},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x07,0x71,0xe2}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x15,0x52,0x72}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x60,0x21,0x7c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x63,0x10,0x46}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x63,0xc7,0x57}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x63,0xe4,0x34}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x84,0x62,0xe0}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x8b,0x7d,0x08}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x9f,0x5c,0x9b}, 8533},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0xa7,0x61,0x13}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0xba,0x3d,0xd1}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0xc6,0x21,0xd6}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0xc6,0x27,0xcd}, 28333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0xc6,0xd6,0x42}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0xcf,0x8b,0xcb}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0x00,0x30,0x15}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0x1d,0x80,0x05}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0x66,0xa3,0x5a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0x99,0x43,0x20}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0xa3,0x94,0x67}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0xa3,0xfa,0xcd}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0xae,0xad,0x3a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0xb3,0xf7,0xec}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0xc9,0x25,0xe5}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5a,0x44,0x21,0x46}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5a,0x5e,0xc6,0x0d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5a,0xad,0x87,0xbe}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x40,0x7f,0xc1}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x40,0x97,0xca}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x79,0xb7,0x80}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x91,0x2a,0x53}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x91,0x31,0x38}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x91,0x60,0x8e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x99,0x81,0x86}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x9b,0x02,0x53}, 8773},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xc1,0xe4,0x6a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xc3,0xf9,0x02}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xc5,0x2c,0x90}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xc6,0xb1,0xde}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xcc,0x95,0x05}, 8334},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xd3,0xd6,0xe2}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xf2,0x44,0xf9}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5c,0x1b,0x2f,0xdf}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5c,0x6a,0x25,0x2d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5c,0xcb,0xe6,0x1b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5c,0xd0,0xc7,0x76}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5c,0xf6,0x14,0xc8}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5c,0xff,0xc4,0xf3}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0x68,0xd0,0x77}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0x68,0xd1,0x52}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0x89,0x60,0xa2}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0xb4,0x33,0x33}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0xc5,0x81,0x3c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0xc5,0x84,0x15}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0xc5,0x84,0xa2}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0xe1,0xb9,0x81}, 8335},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0xe6,0x35,0xb4}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0xfe,0x42,0xf0}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0x36,0x41,0x3f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0x82,0x09,0x64}, 8334},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0x82,0x61,0x80}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0x82,0x81,0xe9}, 8340},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0x82,0xcf,0x13}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0x82,0xe6,0xd6}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0x87,0x89,0x6c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0x8e,0xf0,0x07}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0x9e,0xca,0x96}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0xc0,0xa8,0x35}, 8334},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0xd0,0xa3,0x74}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0xd6,0x5f,0x25}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0x18,0xce,0x9c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0x4c,0xe4,0x16}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0x50,0x2c,0x64}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0x90,0x9f,0xf4}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0x91,0x1f,0xe6}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0xb7,0x36,0x3c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0xd3,0x88,0x56}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0xd5,0x8f,0x8b}, 8334},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0xd5,0xd2,0x8d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0xec,0x2d,0xfb}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x60,0x1b,0x18,0x23}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x60,0x21,0xce,0x0c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x60,0x37,0xa0,0x53}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x60,0x3d,0x5c,0xf2}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x60,0x7e,0x75,0x05}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x60,0x7e,0x7e,0xec}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x60,0xea,0x27,0xb9}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x60,0xff,0x95,0x19}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x60,0xff,0x97,0xea}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0x1a,0x6c,0x8e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0x6f,0xa7,0x35}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0x74,0x39,0xd2}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0x97,0x10,0x3c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0xa1,0xce,0x62}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0xc5,0x9d,0xa3}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0xce,0xff,0xca}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0xd3,0x30,0xe9}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0xd4,0x28,0x70}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0xd6,0x65,0xa0}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0xdf,0x0b,0x3a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x63,0xf9,0x0b,0x9b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x63,0xfc,0xb9,0xb6}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x64,0x00,0xf0,0x83}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x64,0x08,0xa5,0x56}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x64,0x28,0x0a,0x93}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0x0c,0x61}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0x0c,0x84}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0x0c,0xd1}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0x0e,0xa8}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0x74,0x2f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0x74,0x81}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0x74,0x89}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0x74,0xb5}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0x74,0xe2}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0x75,0x6c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0x75,0x9b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0x75,0x9f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0x75,0xa1}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0x75,0xac}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0xa0,0x8e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0xa0,0xde}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0xa1,0x77}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0xa1,0x99}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0xa1,0xd7}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0xa1,0xf9}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0xa2,0x47}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0xa2,0x57}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0xa2,0x5c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0xa2,0x90}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0xa3,0x29}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0xa3,0x4d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0xa3,0x54}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0xa3,0x6d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0xa3,0x78}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0xa3,0x84}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0xfd,0xdb}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0xfd,0xdf}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0xfd,0xe8}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x50,0x7c,0x04}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x5c,0x29,0x48}, 8334},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x5c,0x2c,0x56}, 8334},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x5c,0x2e,0xdb}, 8334},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x64,0xae,0x8a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x84,0x11,0x27}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x84,0x19,0x45}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x84,0x19,0x5e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x84,0x19,0x77}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x84,0x19,0xa9}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x84,0x19,0xad}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x84,0x1a,0x00}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x84,0x1a,0x10}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x84,0x1a,0x11}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x84,0x1a,0x1c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x84,0x1a,0x2f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x84,0x1a,0x35}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x84,0x1a,0x40}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x84,0x1a,0x42}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x84,0x1a,0x4c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x84,0x1a,0x54}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x84,0x1b,0x8b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0xc9,0x28,0x1b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0xc9,0x45,0x46}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0xc9,0xe8,0x70}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x67,0x46,0xc0,0x80}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x67,0xc3,0x04,0x3b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x67,0xd6,0x92,0x09}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x67,0xe6,0xb9,0x04}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x67,0xe6,0xbb,0x02}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0x0d,0xf5,0xbe}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0x80,0xe4,0x4e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0x9a,0xbd,0x18}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xa8,0x90,0x1b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xa8,0xa7,0x22}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xac,0xbe,0xa5}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xdd,0x0a,0xc9}, 8334},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xdf,0x0c,0x8b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xec,0xfe,0x19}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xee,0x83,0x74}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xee,0x86,0x1c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xef,0x92,0x4c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xf3,0x18,0xec}, 44231},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x07,0x80}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x18,0x72}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x19,0x9e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x60,0xa3}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x61,0x4f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x62,0x15}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x68,0x06}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x68,0x22}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x68,0x24}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x68,0x27}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x68,0x31}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x68,0x54}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x68,0xa7}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x68,0xab}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x68,0xe5}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x68,0xea}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x68,0xf1}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x68,0xf9}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x07}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x09}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x0b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x0d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x12}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x17}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x18}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x22}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x2d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x2e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x2f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x30}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x32}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x35}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x37}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x38}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x39}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x3b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x3d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x40}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x41}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x4a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x4b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x67}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x80}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0xa0}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0xa7}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0xc5}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x24,0x5f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x26,0xb5}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x34,0x08}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x34,0x53}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x34,0x8e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x34,0x99}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x34,0xaa}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x34,0xbf}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x34,0xd8}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x34,0xe7}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x34,0xeb}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x35,0x02}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x35,0x05}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x38,0x0d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x38,0x18}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x38,0x1b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x38,0x1d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x38,0x51}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x38,0xb7}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x38,0xbf}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x38,0xeb}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x39,0x0a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x39,0x12}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x39,0x21}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x39,0x2e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x39,0x3f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x39,0x6e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x4a,0x13}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x4a,0x35}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x4a,0x48}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x4b,0xc9}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x66,0xe5}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x53,0x71,0x03}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x53,0x75,0xdd}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0x06,0xb5,0xa9}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0x17,0xa7,0x96}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0x17,0xb8,0x21}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0xa7,0x50,0x72}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0xaa,0xe7,0x99}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0xac,0x09,0x8b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0xac,0xfd,0x78}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0xbd,0x24,0x04}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0xc2,0x2d,0xc5}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6c,0x1d,0xbf,0xc2}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6c,0x3b,0x02,0xd0}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6c,0x3d,0xcf,0x74}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6c,0x4b,0xd5,0x39}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6c,0xc8,0xff,0xc8}, 8338},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0x6a,0x3e,0x5c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0x83,0x4c,0xd8}, 8334},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0x92,0xad,0x04}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xe9,0x3a,0x2e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xec,0x58,0xf5}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6e,0x0a,0x51,0xcf}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6e,0x0a,0x51,0xdf}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6e,0x0a,0xbd,0x71}, 18333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6e,0x5a,0x18,0xd7}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6f,0x45,0xa5,0xad}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6f,0xdc,0x5d,0xd5}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x70,0x4a,0x39,0xb3}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x71,0xeb,0x68,0x9a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x72,0x5a,0x6b,0x77}, 8334},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x74,0x3e,0x0c,0x06}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x74,0x3e,0x0c,0xf9}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x74,0x3e,0x0d,0x8e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x74,0x3e,0x0d,0x96}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x74,0x3e,0x0d,0xb1}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x74,0x3e,0x0d,0xb3}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x74,0x3e,0x0d,0xb6}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x74,0x3e,0x0d,0xb7}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x74,0x3e,0x0d,0xba}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x74,0x3e,0x0d,0xc6}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x74,0x3e,0x0d,0xce}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x74,0x3e,0x0d,0xcf}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x74,0x3e,0x0d,0xd1}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x74,0x3e,0x0d,0xd2}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x74,0x3e,0x0d,0xdb}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x74,0x3e,0x0d,0xde}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x74,0x3e,0x0d,0xe0}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x74,0x3e,0x0e,0x9b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x74,0xce,0x50,0x21}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x75,0x02,0x85,0xf6}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa4,0x53}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa4,0x6c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa4,0x7c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa4,0x93}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa4,0xc1}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa5,0xfa}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x14}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x2e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x32}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x34}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x3a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x3f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x41}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x42}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x44}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x47}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x49}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x4e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x50}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x52}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x55}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x56}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x58}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x5c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x5d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x5e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x65}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x6a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x6c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x6d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x6e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x71}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x73}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x74}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa9,0x62}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa9,0xaa}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa9,0xc7}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa9,0xdd}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0xbe,0x55,0xe8}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0xed,0x1e,0xcc}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0xf4,0xcc,0xe1}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x09,0x74,0x32}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x0f,0x64,0x78}, 8334},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0x80,0x01}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0x85,0x15}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0x88,0x11}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0x88,0x45}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0x88,0x66}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0x88,0xd5}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0x88,0xfc}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0x89,0x0c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0x89,0x1f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0x89,0x36}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0x89,0x51}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0x89,0x68}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0x89,0x81}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0x89,0x8a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0x89,0x93}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xa0,0x13}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xa0,0x7c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xa0,0x92}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xa0,0xeb}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xa0,0xf4}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xa1,0x0a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xa1,0x0e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xa1,0x0f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xa1,0x15}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xac,0x0e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xac,0xa7}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0x08}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0x58}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0x6c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0x6f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0x72}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0x83}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0x8a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0x9e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0xa1}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0xa4}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0xac}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0xb8}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0xba}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0xbb}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0xbe}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0xc0}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0xc1}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0xc2}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0xc5}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0xc8}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0xca}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0xcd}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0xd4}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xd4,0xa5}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xf5,0x75}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x1c,0x41,0x57}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x1c,0x4b,0xd3}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x1c,0x9b,0x39}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x62,0xde,0xcf}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x62,0xdf,0x19}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x37,0xa4,0x3c}, 7112},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x3c,0x80,0x80}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4c,0x1f,0x63}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4c,0x9d,0xde}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4c,0xc8,0x5f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4c,0xc9,0xa1}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4c,0xca,0x0f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4c,0xca,0x78}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4c,0xcb,0x35}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4c,0xcb,0x49}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4c,0xcb,0x7c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4c,0xcb,0x7d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4c,0xcb,0x8b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4c,0xd5,0xef}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4d,0x40,0xab}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4d,0x45,0x6b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4d,0x45,0xc5}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4d,0x45,0xc6}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4d,0x45,0xde}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4d,0xec,0x1d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4d,0xec,0x20}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4d,0xec,0x94}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4d,0xec,0xa6}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4d,0xec,0xcc}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4d,0xec,0xee}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4d,0xec,0xf8}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4d,0xed,0x00}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4d,0xed,0x05}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4d,0xed,0x0d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4d,0xed,0x92}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4e,0x3a,0xce}, 8444},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4e,0xfc,0x08}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4f,0x43,0x81}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x5c,0xfe,0x3a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x79,0x34,0xee,0x57}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x79,0x85,0x60,0xf1}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x79,0xdc,0xe0,0xeb}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7a,0x87,0x53,0xec}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7a,0x94,0x54,0x1e}, 8123},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7a,0xe4,0x60,0x3a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7b,0x09,0x92,0xaf}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7c,0x96,0x52,0x71}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7e,0x3c,0xcd,0xe5}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7e,0x55,0x34,0x0d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0xc7,0x8a,0x27}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0xc7,0x90,0xe8}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0xc7,0xb1,0x81}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x82,0xb4,0x7b,0x62}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x83,0xd7,0x90,0x9a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x86,0xf9,0x95,0x29}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x87,0x13,0xf5,0x5d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x88,0x20,0xbc,0xf2}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x88,0x20,0xcd,0x39}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x88,0x90,0xa9,0xb9}, 8133},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x88,0xf3,0x0e,0xf1}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x88,0xf3,0x10,0x82}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x88,0xf3,0x3a,0x86}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x88,0xf3,0x92,0x45}, 8343},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x88,0xf3,0xad,0x59}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x89,0x4a,0x1e,0x63}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x89,0x63,0xd5,0xe1}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x89,0xe2,0x6d,0xa9}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8a,0x44,0x50,0x78}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8a,0x44,0xa9,0xd5}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8a,0x44,0xe3,0xcb}, 8443},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8a,0x44,0xeb,0xe0}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8a,0xc5,0xc1,0x9a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8a,0xc5,0xcc,0x94}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8a,0xc9,0x8a,0x94}, 38333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0x3b,0x58,0x05}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0x3b,0x6c,0x5b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0x3b,0x9f,0x5f}, 8335},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0xa2,0x15,0x25}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0xa2,0x15,0x50}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0xa2,0x76,0x44}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0xa2,0xac,0xe0}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0xa2,0xb3,0x20}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0xa2,0xb4,0x18}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0xa2,0xb9,0x8f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0xa2,0xc2,0x31}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0xa2,0xcf,0x41}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0xa2,0xd9,0xca}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0xa2,0xdb,0xb4}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0xa2,0xef,0xd0}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0xc4,0x6a,0x76}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8d,0xa8,0xa8,0x1a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8d,0xe2,0x79,0xad}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8e,0x2c,0x8b,0xda}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x90,0x4c,0x27,0xe9}, 8335},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x90,0x4c,0x33,0x23}, 8335},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x90,0x4c,0x9a,0x8a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x90,0x4c,0xaa,0xa3}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x90,0x4c,0xdc,0x11}, 9090},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x90,0xd9,0x27,0x49}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x90,0xd9,0x43,0x44}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x90,0xd9,0x49,0x56}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x92,0x91,0x24,0x56}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x92,0x94,0x49,0x77}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x94,0x42,0x3a,0xba}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x94,0x67,0x07,0x77}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x94,0xfb,0xb6,0x52}, 8233},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x95,0x38,0x4f,0x46}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x95,0x38,0x59,0x99}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x95,0x38,0xc6,0xe8}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x95,0xca,0xd0,0xa0}, 14797},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x95,0xca,0xd3,0x11}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x95,0xd2,0xee,0x1f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x96,0x5f,0x20,0x97}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x97,0xfa,0x79,0x12}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9d,0x61,0x69,0x05}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9e,0x45,0x4d,0x83}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9e,0x45,0xfb,0x2a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9e,0x81,0xd4,0xec}, 8335},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9f,0x64,0xf3,0x35}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9f,0x94,0x5c,0xf0}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa1,0x61,0xf8,0xa3}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xd5,0x1e,0x2c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xdc,0x2f,0x96}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xf2,0xa8,0x24}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xf2,0xa8,0x37}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xf2,0xa8,0x39}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xf2,0xa8,0x3b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xf3,0xf3,0x36}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xf9,0xe5,0x99}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa3,0xac,0x93,0xfe}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa3,0xac,0xa5,0x74}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa3,0xac,0xae,0xa4}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa3,0xac,0xb0,0x35}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa3,0xac,0xba,0x31}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa4,0x84,0x79,0x2c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa5,0xe3,0x0c,0xc9}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa5,0xe3,0x19,0x8c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa5,0xe3,0x7a,0x3e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa5,0xe3,0x97,0x84}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa7,0x72,0x9c,0x22}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa7,0xa0,0x24,0x68}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xaa,0xfe,0xec,0x87}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xab,0x62,0x74,0x53}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xab,0xd9,0x38,0xc0}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0x60,0xa1,0xf5}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0x61,0xd0,0x33}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0x68,0x08,0x05}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0x68,0x08,0x07}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0x68,0x2d,0x49}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0x68,0x2e,0x17}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0x68,0x3b,0x16}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0x68,0x7b,0x95}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0x68,0x8a,0x6e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0x68,0x8c,0x12}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0x68,0x93,0x1d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0x68,0x97,0x42}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0x68,0x9d,0x5b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0x68,0x9d,0xad}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0x68,0x9f,0x98}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0x68,0xa1,0x9c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0xde,0x4e,0x87}, 18232},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0x17,0xe4,0xea}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0x20,0xfc,0xd4}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xd0,0x94,0x8a}, 38333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xd4,0xc2,0x5d}, 8344},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xd4,0xca,0x21}, 18337},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xe0,0xf0,0x26}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xe0,0xf0,0x2d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xe6,0x86,0xcd}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xf6,0xe5,0x2a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xff,0x71,0x77}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xff,0xf8,0xe8}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xae,0x07,0x77,0x84}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xae,0x73,0xde,0x2a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xaf,0x7e,0x26,0x2c}, 8334},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xaf,0x8a,0x25,0xd1}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xaf,0xd1,0xda,0x4f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x09,0x08,0xe6}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x09,0x16,0xf0}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x09,0x24,0x86}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x09,0x33,0x78}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x09,0x9a,0x6e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x18,0xe8,0x8f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x19,0xbb,0x03}, 8334},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x1a,0xe8,0x4d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x1f,0x06,0x93}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x1f,0xcf,0x85}, 8337},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x3a,0x72,0xeb}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0xc5,0xfb,0xdc}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x15,0x00,0xf1}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x15,0x76,0x21}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x21,0xe7,0x02}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x3f,0x3c,0x07}, 9090},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x4e,0xc3,0x86}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x4f,0xa8,0xfc}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x77,0x41,0x3e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x77,0x42,0xa9}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x8c,0xa5,0x22}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0xa9,0xf9,0xb9}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0xda,0x73,0xa9}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0xee,0xe2,0xd1}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb4,0xac,0xec,0xdb}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb4,0xda,0x04,0xf6}, 8343},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb5,0x76,0x52,0x54}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb6,0x8b,0x56,0xa3}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb6,0x95,0x9e,0x7f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb7,0x88,0xec,0x17}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb8,0x46,0x21,0xc2}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb8,0x49,0x80,0xfe}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x15,0xd9,0x06}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x1a,0xc5,0x05}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x32,0xbf,0x44}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x35,0x9a,0xe5}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x38,0x14,0x7e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x45,0x34,0xb4}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x64,0xf9,0x03}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x91,0x80,0x5b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x9a,0x9c,0x3a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0xaa,0x73,0x66}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0xca,0xa3,0x44}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbb,0xc0,0xfb,0xf5}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x20,0x67,0xa5}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x28,0x5d,0xcd}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x44,0x26,0xd2}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x44,0x28,0x1c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x71,0x54,0x74}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0xa5,0xc8,0x50}, 8334},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0xc0,0x97,0xb1}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0xc1,0x8b,0xf6}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0xc3,0x6a,0xc7}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0xc9,0x68,0x7c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0xf1,0x3a,0xf5}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0xff,0x1f,0x1c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0x51,0xf9,0x6e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0x63,0x0c,0x2f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0xa9,0x07,0x57}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0xa9,0x07,0x64}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0xa9,0x07,0xdc}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0xcb,0xe4,0x5b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x1d,0xbb,0x32}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x46,0x12,0xa2}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x46,0x7d,0x05}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x6b,0xc0,0x77}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x6f,0xff,0x1e}, 8341},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x7c,0xb0,0x25}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x96,0x34,0x05}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x9f,0x1d,0x37}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0xc6,0x66,0x23}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0xea,0xe1,0x9c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0x0e,0xf6,0x57}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0x0e,0xf6,0x58}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0x0e,0xf6,0xcd}, 8444},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0x58,0x6b,0x41}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0x58,0x6b,0x66}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0x95,0x5a,0x13}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0x8c,0xd7,0x08}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0x9a,0xe3,0x58}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc4,0x36,0x29,0x09}, 52442},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc4,0x36,0x29,0x15}, 52442},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0x1b,0x44,0x56}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0x1b,0x53,0xd2}, 13020},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0x30,0x95,0x71}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0x32,0x99,0x27}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0x54,0xad,0x5a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0xf5,0x3d,0xa6}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0xf5,0x3e,0xd0}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0xf5,0x3f,0x37}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc7,0x15,0x95,0x31}, 2087},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc7,0x24,0x7a,0xe2}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc7,0x26,0x55,0xbd}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc7,0x3c,0x7b,0x05}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc9,0x44,0x31,0xc8}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xca,0x99,0xdc,0x26}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcb,0x3c,0x02,0x44}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcb,0x7a,0xf0,0xfa}, 8433},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcc,0x6f,0x26,0x74}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcf,0x9a,0xde,0x2e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcf,0xac,0x7e,0xba}, 8433},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd0,0x55,0xf1,0x0a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd0,0x6e,0x5d,0x4c}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0x06,0x8b,0x31}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0xa0,0x1b,0x36}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0xc5,0xab,0x11}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd3,0x16,0x1d,0x22}, 19263},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd3,0xee,0x0d,0x0a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x20,0xe6,0xdb}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x2f,0xeb,0xfb}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x2f,0xec,0x5b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x38,0x78,0xcb}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x69,0xa0,0x2f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x75,0xd6,0x66}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0xab,0xbb,0xe4}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0xb6,0xb7,0x1d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x3b,0x95,0xf4}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x42,0x1c,0xaa}, 8353},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x71,0xc1,0x21}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x77,0x61,0x29}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x77,0x6c,0xb3}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x88,0x49,0xcf}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x88,0x56,0xd5}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x95,0x9f,0x0f}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0xc4,0xff,0x37}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0xca,0x87,0xa1}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0xef,0xd5,0x2b}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0xef,0xd8,0xa2}, 9090},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0xf0,0xb6,0x77}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0x92,0xfb,0x0e}, 18333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0xbd,0x9a,0x3a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0xda,0xeb,0x5d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0xf9,0x5c,0xbf}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x0a,0x69,0x5d}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x29,0x3c,0xf2}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x4c,0x5d,0x0e}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x4e,0x05,0x53}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x67,0x91,0xe1}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0xb6,0xc7,0x15}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xda,0x91,0x5d,0x7a}, 8333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xdc,0xe9,0x23,0xb6}, 8333}
- };
- static SeedSpec6 pnSeed6_test[] = {
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x09,0x96,0x70}, 9696},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x0a,0x4a,0x72}, 18333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0xe6,0x8c,0x79}, 18333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0xb8,0x98,0xad}, 18333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0xc1,0x85,0xf4}, 18333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6a,0xf8,0x2d}, 18333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x65,0xf0,0x47}, 18333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x1f,0xe8}, 18333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5b,0xc6,0xae}, 18333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x33,0xfe,0xdb,0xd6}, 18333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x32,0x55,0x9d}, 18333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xf9,0x33,0x6d}, 18333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xcd,0xb3,0xa1}, 18333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0xec,0xc6,0x07}, 18433},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0x7c,0x04,0x59}, 38333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xc6,0xc2,0xa6}, 18333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xee,0xc6,0xa5}, 18333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4f,0x35,0x22}, 18333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0xc7,0x90,0xe8}, 18333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x82,0xd3,0xa2,0x7c}, 18333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x90,0xd9,0x49,0x56}, 18333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x96,0x5f,0x22,0x61}, 18333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9e,0x45,0x77,0x23}, 18333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x09,0x59,0xd9}, 9696},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x09,0x9a,0x6e}, 18333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x0c,0x07,0x77}, 18333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x28,0x5d,0xcd}, 18333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcf,0x9a,0xc4,0x95}, 18333},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcf,0x9a,0xd2,0xde}, 10201},
- - {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xda,0xf4,0x92,0x6f}, 18333}
- };
- #endif // BITCOIN_CHAINPARAMSSEEDS_H
- diff --git a/src/clientversion.cpp b/src/clientversion.cpp
- index 01621f4..d6a9825 100644
- --- a/src/clientversion.cpp
- +++ b/src/clientversion.cpp
- @@ -13,7 +13,7 @@
- * for both bitcoind and bitcoin-abc, to make it harder for attackers to
- * target servers or GUI users specifically.
- */
- -const std::string CLIENT_NAME("Bitcoin ABC");
- +const std::string CLIENT_NAME("Bitcoin Candy");
- /**
- * Client version number
- @@ -43,10 +43,11 @@ const std::string CLIENT_NAME("Bitcoin ABC");
- #endif
- //! git will put "#define GIT_ARCHIVE 1" on the next line inside archives.
- -//! $Format:%n#define GIT_ARCHIVE 1$
- +//!
- +#define GIT_ARCHIVE 1
- #ifdef GIT_ARCHIVE
- -#define GIT_COMMIT_ID "$Format:%h$"
- -#define GIT_COMMIT_DATE "$Format:%cD$"
- +#define GIT_COMMIT_ID "c41ba103a"
- +#define GIT_COMMIT_DATE "Thu, 8 Feb 2018 00:41:21 +0800"
- #endif
- #define BUILD_DESC_WITH_SUFFIX(maj, min, rev, build, suffix) \
- diff --git a/src/config/CMakeLists.txt b/src/config/CMakeLists.txt
- index 298e827..fb6349d 100644
- --- a/src/config/CMakeLists.txt
- +++ b/src/config/CMakeLists.txt
- @@ -7,7 +7,7 @@ include(CheckIncludeFiles)
- include(CheckSymbolExists)
- # Package informations
- -set(PACKAGE_NAME "Bitcoin ABC")
- +set(PACKAGE_NAME "Bitcoin Candy")
- # Version
- set(CLIENT_VERSION_MAJOR 0)
- diff --git a/src/consensus/params.h b/src/consensus/params.h
- index b555715..58b6bec 100644
- --- a/src/consensus/params.h
- +++ b/src/consensus/params.h
- @@ -50,7 +50,13 @@ struct Params {
- int BIP66Height;
- /** Block height at which UAHF kicks in */
- int uahfHeight;
- + /** Block height at which CDHF kicks in --add by hmc*/
- + int cdyHeight;
- /** Block height at which the new DAA becomes active */
- + /** The first post-fork block of Bitcoin blockchain. **/
- + uint256 BitcoinPostforkBlock;
- + uint32_t BitcoinPostforkTime;
- +
- int daaHeight;
- /** Block height at which OP_RETURN replay protection stops */
- int antiReplayOpReturnSunsetHeight;
- @@ -67,13 +73,22 @@ struct Params {
- BIP9Deployment vDeployments[MAX_VERSION_BITS_DEPLOYMENTS];
- /** Proof of work parameters */
- uint256 powLimit;
- + uint256 powLimitLegacy;
- + uint256 powLimitStart;
- + const uint256& PowLimit(bool postfork) const { return postfork ? powLimit : powLimitLegacy; }
- bool fPowAllowMinDifficultyBlocks;
- bool fPowNoRetargeting;
- int64_t nPowTargetSpacing;
- - int64_t nPowTargetTimespan;
- - int64_t DifficultyAdjustmentInterval() const {
- - return nPowTargetTimespan / nPowTargetSpacing;
- - }
- + int64_t nPowTargetSpacingCDY;
- + int64_t nPowTargetTimespanLegacy;
- + int64_t DifficultyAdjustmentInterval() const { return nPowTargetTimespanLegacy / nPowTargetSpacing; }
- + //Zcash logic for diff adjustment
- + int64_t nPowAveragingWindow;
- + int64_t nPowMaxAdjustDown;
- + int64_t nPowMaxAdjustUp;
- + int64_t AveragingWindowTimespan() const { return nPowAveragingWindow * nPowTargetSpacingCDY; }
- + int64_t MinActualTimespan() const { return (AveragingWindowTimespan() * (100 - nPowMaxAdjustUp )) / 100; }
- + int64_t MaxActualTimespan() const { return (AveragingWindowTimespan() * (100 + nPowMaxAdjustDown)) / 100; }
- uint256 nMinimumChainWork;
- uint256 defaultAssumeValid;
- };
- diff --git a/src/core_io.h b/src/core_io.h
- index 1ad776b..8071d95 100644
- --- a/src/core_io.h
- +++ b/src/core_io.h
- @@ -20,7 +20,7 @@ CScript ParseScript(const std::string &s);
- std::string ScriptToAsmStr(const CScript &script,
- const bool fAttemptSighashDecode = false);
- bool DecodeHexTx(CMutableTransaction &tx, const std::string &strHexTx);
- -bool DecodeHexBlk(CBlock &, const std::string &strHexBlk);
- +bool DecodeHexBlk(CBlock&, const std::string& strHexBlk, bool fLegacyFormat);
- uint256 ParseHashUV(const UniValue &v, const std::string &strName);
- uint256 ParseHashStr(const std::string &, const std::string &strName);
- std::vector<uint8_t> ParseHexUV(const UniValue &v, const std::string &strName);
- diff --git a/src/core_read.cpp b/src/core_read.cpp
- index fac6159..a2f8c55 100644
- --- a/src/core_read.cpp
- +++ b/src/core_read.cpp
- @@ -106,13 +106,14 @@ bool DecodeHexTx(CMutableTransaction &tx, const std::string &strHexTx) {
- return true;
- }
- -bool DecodeHexBlk(CBlock &block, const std::string &strHexBlk) {
- +bool DecodeHexBlk(CBlock &block, const std::string &strHexBlk, bool fLegacyFormat) {
- if (!IsHex(strHexBlk)) {
- return false;
- }
- std::vector<uint8_t> blockData(ParseHex(strHexBlk));
- - CDataStream ssBlock(blockData, SER_NETWORK, PROTOCOL_VERSION);
- + int ser_flags = fLegacyFormat ? SERIALIZE_BLOCK_LEGACY : 0;
- + CDataStream ssBlock(blockData, SER_NETWORK, PROTOCOL_VERSION | ser_flags);
- try {
- ssBlock >> block;
- } catch (const std::exception &) {
- diff --git a/src/crypto/common.h b/src/crypto/common.h
- index db8e685..0901c6e 100644
- --- a/src/crypto/common.h
- +++ b/src/crypto/common.h
- @@ -11,8 +11,11 @@
- #include <cstdint>
- #include <cstring>
- +#include <assert.h>
- #include "compat/endian.h"
- +#include "sodium.h"
- +
- static inline uint16_t ReadLE16(const uint8_t *ptr) {
- uint16_t x;
- @@ -92,4 +95,41 @@ uint64_t static inline CountBits(uint64_t x) {
- return ret;
- }
- +int inline init_and_check_sodium()
- +{
- + if (sodium_init() == -1) {
- + return -1;
- + }
- +
- + // What follows is a runtime test that ensures the version of libsodium
- + // we're linked against checks that signatures are canonical (s < L).
- + const unsigned char message[1] = { 0 };
- +
- + unsigned char pk[crypto_sign_PUBLICKEYBYTES];
- + unsigned char sk[crypto_sign_SECRETKEYBYTES];
- + unsigned char sig[crypto_sign_BYTES];
- +
- + crypto_sign_keypair(pk, sk);
- + crypto_sign_detached(sig, NULL, message, sizeof(message), sk);
- +
- + assert(crypto_sign_verify_detached(sig, message, sizeof(message), pk) == 0);
- +
- + // Copied from libsodium/crypto_sign/ed25519/ref10/open.c
- + static const unsigned char L[32] = {
- + 0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58,
- + 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14,
- + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10};
- +
- + // Add L to S, which starts at sig[32].
- + unsigned int s = 0;
- + for (size_t i = 0; i < 32; i++) {
- + s = sig[32 + i] + L[i] + (s >> 8);
- + sig[32 + i] = s & 0xff;
- + }
- +
- + assert(crypto_sign_verify_detached(sig, message, sizeof(message), pk) != 0);
- +
- + return 0;
- +}
- #endif // BITCOIN_CRYPTO_COMMON_H
- diff --git a/src/crypto/equihash.cpp b/src/crypto/equihash.cpp
- new file mode 100644
- index 0000000..ead0df8
- --- /dev/null
- +++ b/src/crypto/equihash.cpp
- @@ -0,0 +1,810 @@
- +// Copyright (c) 2016 Jack Grigg
- +// Copyright (c) 2016 The Zcash developers
- +// Distributed under the MIT software license, see the accompanying
- +// file COPYING or http://www.opensource.org/licenses/mit-license.php.
- +
- +// Implementation of the Equihash Proof-of-Work algorithm.
- +//
- +// Reference
- +// =========
- +// Alex Biryukov and Dmitry Khovratovich
- +// Equihash: Asymmetric Proof-of-Work Based on the Generalized Birthday Problem
- +// NDSS ??6, 21-24 February 2016, San Diego, CA, USA
- +// https://www.internetsociety.org/sites/default/files/blogs-media/equihash-asymmetric-proof-of-work-based-generalized-birthday-problem.pdf
- +
- +#if defined(HAVE_CONFIG_H)
- +#include "config/bitcoin-config.h"
- +#endif
- +
- +#include "crypto/equihash.h"
- +
- +#ifndef NO_UTIL_LOG
- +#include "util.h"
- +#else
- +#define LogPrint(...)
- +#endif
- +
- +#include <algorithm>
- +#include <iostream>
- +#include <stdexcept>
- +
- +#include <boost/optional.hpp>
- +
- +EhSolverCancelledException solver_cancelled;
- +
- +template<unsigned int N, unsigned int K>
- +int Equihash<N,K>::InitialiseState(eh_HashState& base_state)
- +{
- + uint32_t le_N = htole32(N);
- + uint32_t le_K = htole32(K);
- + unsigned char personalization[crypto_generichash_blake2b_PERSONALBYTES] = {};
- + memcpy(personalization, "ZcashPoW", 8);
- + memcpy(personalization+8, &le_N, 4);
- + memcpy(personalization+12, &le_K, 4);
- + return crypto_generichash_blake2b_init_salt_personal(&base_state,
- + NULL, 0, // No key.
- + (512/N)*N/8,
- + NULL, // No salt.
- + personalization);
- +}
- +
- +void GenerateHash(const eh_HashState& base_state, eh_index g,
- + unsigned char* hash, size_t hLen)
- +{
- + eh_HashState state;
- + state = base_state;
- + eh_index lei = htole32(g);
- + crypto_generichash_blake2b_update(&state, (const unsigned char*) &lei,
- + sizeof(eh_index));
- + crypto_generichash_blake2b_final(&state, hash, hLen);
- +}
- +
- +void ExpandArray(const unsigned char* in, size_t in_len,
- + unsigned char* out, size_t out_len,
- + size_t bit_len, size_t byte_pad)
- +{
- + assert(bit_len >= 8);
- + assert(8*sizeof(uint32_t) >= 7+bit_len);
- +
- + size_t out_width { (bit_len+7)/8 + byte_pad };
- + assert(out_len == 8*out_width*in_len/bit_len);
- +
- + uint32_t bit_len_mask { ((uint32_t)1 << bit_len) - 1 };
- +
- + // The acc_bits least-significant bits of acc_value represent a bit sequence
- + // in big-endian order.
- + size_t acc_bits = 0;
- + uint32_t acc_value = 0;
- +
- + size_t j = 0;
- + for (size_t i = 0; i < in_len; i++) {
- + acc_value = (acc_value << 8) | in[i];
- + acc_bits += 8;
- +
- + // When we have bit_len or more bits in the accumulator, write the next
- + // output element.
- + if (acc_bits >= bit_len) {
- + acc_bits -= bit_len;
- + for (size_t x = 0; x < byte_pad; x++) {
- + out[j+x] = 0;
- + }
- + for (size_t x = byte_pad; x < out_width; x++) {
- + out[j+x] = (
- + // Big-endian
- + acc_value >> (acc_bits+(8*(out_width-x-1)))
- + ) & (
- + // Apply bit_len_mask across byte boundaries
- + (bit_len_mask >> (8*(out_width-x-1))) & 0xFF
- + );
- + }
- + j += out_width;
- + }
- + }
- +}
- +
- +void CompressArray(const unsigned char* in, size_t in_len,
- + unsigned char* out, size_t out_len,
- + size_t bit_len, size_t byte_pad)
- +{
- + assert(bit_len >= 8);
- + assert(8*sizeof(uint32_t) >= 7+bit_len);
- +
- + size_t in_width { (bit_len+7)/8 + byte_pad };
- + assert(out_len == bit_len*in_len/(8*in_width));
- +
- + uint32_t bit_len_mask { ((uint32_t)1 << bit_len) - 1 };
- +
- + // The acc_bits least-significant bits of acc_value represent a bit sequence
- + // in big-endian order.
- + size_t acc_bits = 0;
- + uint32_t acc_value = 0;
- +
- + size_t j = 0;
- + for (size_t i = 0; i < out_len; i++) {
- + // When we have fewer than 8 bits left in the accumulator, read the next
- + // input element.
- + if (acc_bits < 8) {
- + acc_value = acc_value << bit_len;
- + for (size_t x = byte_pad; x < in_width; x++) {
- + acc_value = acc_value | (
- + (
- + // Apply bit_len_mask across byte boundaries
- + in[j+x] & ((bit_len_mask >> (8*(in_width-x-1))) & 0xFF)
- + ) << (8*(in_width-x-1))); // Big-endian
- + }
- + j += in_width;
- + acc_bits += bit_len;
- + }
- +
- + acc_bits -= 8;
- + out[i] = (acc_value >> acc_bits) & 0xFF;
- + }
- +}
- +
- +// Big-endian so that lexicographic array comparison is equivalent to integer
- +// comparison
- +void EhIndexToArray(const eh_index i, unsigned char* array)
- +{
- + BOOST_STATIC_ASSERT(sizeof(eh_index) == 4);
- + eh_index bei = htobe32(i);
- + memcpy(array, &bei, sizeof(eh_index));
- +}
- +
- +// Big-endian so that lexicographic array comparison is equivalent to integer
- +// comparison
- +eh_index ArrayToEhIndex(const unsigned char* array)
- +{
- + BOOST_STATIC_ASSERT(sizeof(eh_index) == 4);
- + eh_index bei;
- + memcpy(&bei, array, sizeof(eh_index));
- + return be32toh(bei);
- +}
- +
- +eh_trunc TruncateIndex(const eh_index i, const unsigned int ilen)
- +{
- + // Truncate to 8 bits
- + BOOST_STATIC_ASSERT(sizeof(eh_trunc) == 1);
- + return (i >> (ilen - 8)) & 0xff;
- +}
- +
- +eh_index UntruncateIndex(const eh_trunc t, const eh_index r, const unsigned int ilen)
- +{
- + eh_index i{t};
- + return (i << (ilen - 8)) | r;
- +}
- +
- +std::vector<eh_index> GetIndicesFromMinimal(std::vector<unsigned char> minimal,
- + size_t cBitLen)
- +{
- + assert(((cBitLen+1)+7)/8 <= sizeof(eh_index));
- + size_t lenIndices { 8*sizeof(eh_index)*minimal.size()/(cBitLen+1) };
- + size_t bytePad { sizeof(eh_index) - ((cBitLen+1)+7)/8 };
- + std::vector<unsigned char> array(lenIndices);
- + ExpandArray(minimal.data(), minimal.size(),
- + array.data(), lenIndices, cBitLen+1, bytePad);
- + std::vector<eh_index> ret;
- + for (size_t i = 0; i < lenIndices; i += sizeof(eh_index)) {
- + ret.push_back(ArrayToEhIndex(array.data()+i));
- + }
- + return ret;
- +}
- +
- +std::vector<unsigned char> GetMinimalFromIndices(std::vector<eh_index> indices,
- + size_t cBitLen)
- +{
- + assert(((cBitLen+1)+7)/8 <= sizeof(eh_index));
- + size_t lenIndices { indices.size()*sizeof(eh_index) };
- + size_t minLen { (cBitLen+1)*lenIndices/(8*sizeof(eh_index)) };
- + size_t bytePad { sizeof(eh_index) - ((cBitLen+1)+7)/8 };
- + std::vector<unsigned char> array(lenIndices);
- + for (size_t i = 0; i < indices.size(); i++) {
- + EhIndexToArray(indices[i], array.data()+(i*sizeof(eh_index)));
- + }
- + std::vector<unsigned char> ret(minLen);
- + CompressArray(array.data(), lenIndices,
- + ret.data(), minLen, cBitLen+1, bytePad);
- + return ret;
- +}
- +
- +template<size_t WIDTH>
- +StepRow<WIDTH>::StepRow(const unsigned char* hashIn, size_t hInLen,
- + size_t hLen, size_t cBitLen)
- +{
- + assert(hLen <= WIDTH);
- + ExpandArray(hashIn, hInLen, hash, hLen, cBitLen);
- +}
- +
- +template<size_t WIDTH> template<size_t W>
- +StepRow<WIDTH>::StepRow(const StepRow<W>& a)
- +{
- + BOOST_STATIC_ASSERT(W <= WIDTH);
- + std::copy(a.hash, a.hash+W, hash);
- +}
- +
- +template<size_t WIDTH>
- +FullStepRow<WIDTH>::FullStepRow(const unsigned char* hashIn, size_t hInLen,
- + size_t hLen, size_t cBitLen, eh_index i) :
- + StepRow<WIDTH> {hashIn, hInLen, hLen, cBitLen}
- +{
- + EhIndexToArray(i, hash+hLen);
- +}
- +
- +template<size_t WIDTH> template<size_t W>
- +FullStepRow<WIDTH>::FullStepRow(const FullStepRow<W>& a, const FullStepRow<W>& b, size_t len, size_t lenIndices, size_t trim) :
- + StepRow<WIDTH> {a}
- +{
- + assert(len+lenIndices <= W);
- + assert(len-trim+(2*lenIndices) <= WIDTH);
- + for (size_t i = trim; i < len; i++)
- + hash[i-trim] = a.hash[i] ^ b.hash[i];
- + if (a.IndicesBefore(b, len, lenIndices)) {
- + std::copy(a.hash+len, a.hash+len+lenIndices, hash+len-trim);
- + std::copy(b.hash+len, b.hash+len+lenIndices, hash+len-trim+lenIndices);
- + } else {
- + std::copy(b.hash+len, b.hash+len+lenIndices, hash+len-trim);
- + std::copy(a.hash+len, a.hash+len+lenIndices, hash+len-trim+lenIndices);
- + }
- +}
- +
- +template<size_t WIDTH>
- +FullStepRow<WIDTH>& FullStepRow<WIDTH>::operator=(const FullStepRow<WIDTH>& a)
- +{
- + std::copy(a.hash, a.hash+WIDTH, hash);
- + return *this;
- +}
- +
- +template<size_t WIDTH>
- +bool StepRow<WIDTH>::IsZero(size_t len)
- +{
- + // This doesn't need to be constant time.
- + for (size_t i = 0; i < len; i++) {
- + if (hash[i] != 0)
- + return false;
- + }
- + return true;
- +}
- +
- +template<size_t WIDTH>
- +std::vector<unsigned char> FullStepRow<WIDTH>::GetIndices(size_t len, size_t lenIndices,
- + size_t cBitLen) const
- +{
- + assert(((cBitLen+1)+7)/8 <= sizeof(eh_index));
- + size_t minLen { (cBitLen+1)*lenIndices/(8*sizeof(eh_index)) };
- + size_t bytePad { sizeof(eh_index) - ((cBitLen+1)+7)/8 };
- + std::vector<unsigned char> ret(minLen);
- + CompressArray(hash+len, lenIndices, ret.data(), minLen, cBitLen+1, bytePad);
- + return ret;
- +}
- +
- +template<size_t WIDTH>
- +bool HasCollision(StepRow<WIDTH>& a, StepRow<WIDTH>& b, size_t l)
- +{
- + // This doesn't need to be constant time.
- + for (size_t j = 0; j < l; j++) {
- + if (a.hash[j] != b.hash[j])
- + return false;
- + }
- + return true;
- +}
- +
- +template<size_t WIDTH>
- +TruncatedStepRow<WIDTH>::TruncatedStepRow(const unsigned char* hashIn, size_t hInLen,
- + size_t hLen, size_t cBitLen,
- + eh_index i, unsigned int ilen) :
- + StepRow<WIDTH> {hashIn, hInLen, hLen, cBitLen}
- +{
- + hash[hLen] = TruncateIndex(i, ilen);
- +}
- +
- +template<size_t WIDTH> template<size_t W>
- +TruncatedStepRow<WIDTH>::TruncatedStepRow(const TruncatedStepRow<W>& a, const TruncatedStepRow<W>& b, size_t len, size_t lenIndices, size_t trim) :
- + StepRow<WIDTH> {a}
- +{
- + assert(len+lenIndices <= W);
- + assert(len-trim+(2*lenIndices) <= WIDTH);
- + for (size_t i = trim; i < len; i++)
- + hash[i-trim] = a.hash[i] ^ b.hash[i];
- + if (a.IndicesBefore(b, len, lenIndices)) {
- + std::copy(a.hash+len, a.hash+len+lenIndices, hash+len-trim);
- + std::copy(b.hash+len, b.hash+len+lenIndices, hash+len-trim+lenIndices);
- + } else {
- + std::copy(b.hash+len, b.hash+len+lenIndices, hash+len-trim);
- + std::copy(a.hash+len, a.hash+len+lenIndices, hash+len-trim+lenIndices);
- + }
- +}
- +
- +template<size_t WIDTH>
- +TruncatedStepRow<WIDTH>& TruncatedStepRow<WIDTH>::operator=(const TruncatedStepRow<WIDTH>& a)
- +{
- + std::copy(a.hash, a.hash+WIDTH, hash);
- + return *this;
- +}
- +
- +template<size_t WIDTH>
- +std::shared_ptr<eh_trunc> TruncatedStepRow<WIDTH>::GetTruncatedIndices(size_t len, size_t lenIndices) const
- +{
- + std::shared_ptr<eh_trunc> p (new eh_trunc[lenIndices], std::default_delete<eh_trunc[]>());
- + std::copy(hash+len, hash+len+lenIndices, p.get());
- + return p;
- +}
- +
- +template<unsigned int N, unsigned int K>
- +bool Equihash<N,K>::BasicSolve(const eh_HashState& base_state,
- + const std::function<bool(std::vector<unsigned char>)> validBlock,
- + const std::function<bool(EhSolverCancelCheck)> cancelled)
- +{
- + eh_index init_size { 1 << (CollisionBitLength + 1) };
- +
- + // 1) Generate first list
- + LogPrint(BCLog::POW, "Generating first list\n");
- + size_t hashLen = HashLength;
- + size_t lenIndices = sizeof(eh_index);
- + std::vector<FullStepRow<FullWidth>> X;
- + X.reserve(init_size);
- + unsigned char tmpHash[HashOutput];
- + for (eh_index g = 0; X.size() < init_size; g++) {
- + GenerateHash(base_state, g, tmpHash, HashOutput);
- + for (eh_index i = 0; i < IndicesPerHashOutput && X.size() < init_size; i++) {
- + X.emplace_back(tmpHash+(i*N/8), N/8, HashLength,
- + CollisionBitLength, (g*IndicesPerHashOutput)+i);
- + }
- + if (cancelled(ListGeneration)) throw solver_cancelled;
- + }
- +
- + // 3) Repeat step 2 until 2n/(k+1) bits remain
- + for (unsigned int r = 1; r < K && X.size() > 0; r++) {
- + LogPrint(BCLog::POW, "Round %u:\n", r);
- + // 2a) Sort the list
- + LogPrint(BCLog::POW, "- Sorting list\n");
- + std::sort(X.begin(), X.end(), CompareSR(CollisionByteLength));
- + if (cancelled(ListSorting)) throw solver_cancelled;
- +
- + LogPrint(BCLog::POW, "- Finding collisions\n");
- + size_t i = 0;
- + size_t posFree = 0;
- + std::vector<FullStepRow<FullWidth>> Xc;
- + while (i < X.size() - 1) {
- + // 2b) Find next set of unordered pairs with collisions on the next n/(k+1) bits
- + size_t j = 1;
- + while (i+j < X.size() &&
- + HasCollision(X[i], X[i+j], CollisionByteLength)) {
- + j++;
- + }
- +
- + // 2c) Calculate tuples (X_i ^ X_j, (i, j))
- + for (size_t l = 0; l < j - 1; l++) {
- + for (size_t m = l + 1; m < j; m++) {
- + if (DistinctIndices(X[i+l], X[i+m], hashLen, lenIndices)) {
- + Xc.emplace_back(X[i+l], X[i+m], hashLen, lenIndices, CollisionByteLength);
- + }
- + }
- + }
- +
- + // 2d) Store tuples on the table in-place if possible
- + while (posFree < i+j && Xc.size() > 0) {
- + X[posFree++] = Xc.back();
- + Xc.pop_back();
- + }
- +
- + i += j;
- + if (cancelled(ListColliding)) throw solver_cancelled;
- + }
- +
- + // 2e) Handle edge case where final table entry has no collision
- + while (posFree < X.size() && Xc.size() > 0) {
- + X[posFree++] = Xc.back();
- + Xc.pop_back();
- + }
- +
- + if (Xc.size() > 0) {
- + // 2f) Add overflow to end of table
- + X.insert(X.end(), Xc.begin(), Xc.end());
- + } else if (posFree < X.size()) {
- + // 2g) Remove empty space at the end
- + X.erase(X.begin()+posFree, X.end());
- + X.shrink_to_fit();
- + }
- +
- + hashLen -= CollisionByteLength;
- + lenIndices *= 2;
- + if (cancelled(RoundEnd)) throw solver_cancelled;
- + }
- +
- + // k+1) Find a collision on last 2n(k+1) bits
- + LogPrint(BCLog::POW, "Final round:\n");
- + if (X.size() > 1) {
- + LogPrint(BCLog::POW, "- Sorting list\n");
- + std::sort(X.begin(), X.end(), CompareSR(hashLen));
- + if (cancelled(FinalSorting)) throw solver_cancelled;
- + LogPrint(BCLog::POW, "- Finding collisions\n");
- + size_t i = 0;
- + while (i < X.size() - 1) {
- + size_t j = 1;
- + while (i+j < X.size() &&
- + HasCollision(X[i], X[i+j], hashLen)) {
- + j++;
- + }
- +
- + for (size_t l = 0; l < j - 1; l++) {
- + for (size_t m = l + 1; m < j; m++) {
- + FullStepRow<FinalFullWidth> res(X[i+l], X[i+m], hashLen, lenIndices, 0);
- + if (DistinctIndices(X[i+l], X[i+m], hashLen, lenIndices)) {
- + auto soln = res.GetIndices(hashLen, 2*lenIndices, CollisionBitLength);
- + assert(soln.size() == equihash_solution_size(N, K));
- + if (validBlock(soln)) {
- + return true;
- + }
- + }
- + }
- + }
- +
- + i += j;
- + if (cancelled(FinalColliding)) throw solver_cancelled;
- + }
- + } else
- + LogPrint(BCLog::POW, "- List is empty\n");
- +
- + return false;
- +}
- +
- +template<size_t WIDTH>
- +void CollideBranches(std::vector<FullStepRow<WIDTH>>& X, const size_t hlen, const size_t lenIndices, const unsigned int clen, const unsigned int ilen, const eh_trunc lt, const eh_trunc rt)
- +{
- + size_t i = 0;
- + size_t posFree = 0;
- + std::vector<FullStepRow<WIDTH>> Xc;
- + while (i < X.size() - 1) {
- + // 2b) Find next set of unordered pairs with collisions on the next n/(k+1) bits
- + size_t j = 1;
- + while (i+j < X.size() &&
- + HasCollision(X[i], X[i+j], clen)) {
- + j++;
- + }
- +
- + // 2c) Calculate tuples (X_i ^ X_j, (i, j))
- + for (size_t l = 0; l < j - 1; l++) {
- + for (size_t m = l + 1; m < j; m++) {
- + if (DistinctIndices(X[i+l], X[i+m], hlen, lenIndices)) {
- + if (IsValidBranch(X[i+l], hlen, ilen, lt) && IsValidBranch(X[i+m], hlen, ilen, rt)) {
- + Xc.emplace_back(X[i+l], X[i+m], hlen, lenIndices, clen);
- + } else if (IsValidBranch(X[i+m], hlen, ilen, lt) && IsValidBranch(X[i+l], hlen, ilen, rt)) {
- + Xc.emplace_back(X[i+m], X[i+l], hlen, lenIndices, clen);
- + }
- + }
- + }
- + }
- +
- + // 2d) Store tuples on the table in-place if possible
- + while (posFree < i+j && Xc.size() > 0) {
- + X[posFree++] = Xc.back();
- + Xc.pop_back();
- + }
- +
- + i += j;
- + }
- +
- + // 2e) Handle edge case where final table entry has no collision
- + while (posFree < X.size() && Xc.size() > 0) {
- + X[posFree++] = Xc.back();
- + Xc.pop_back();
- + }
- +
- + if (Xc.size() > 0) {
- + // 2f) Add overflow to end of table
- + X.insert(X.end(), Xc.begin(), Xc.end());
- + } else if (posFree < X.size()) {
- + // 2g) Remove empty space at the end
- + X.erase(X.begin()+posFree, X.end());
- + X.shrink_to_fit();
- + }
- +}
- +
- +template<unsigned int N, unsigned int K>
- +bool Equihash<N,K>::OptimisedSolve(const eh_HashState& base_state,
- + const std::function<bool(std::vector<unsigned char>)> validBlock,
- + const std::function<bool(EhSolverCancelCheck)> cancelled)
- +{
- + eh_index init_size { 1 << (CollisionBitLength + 1) };
- + eh_index recreate_size { UntruncateIndex(1, 0, CollisionBitLength + 1) };
- +
- + // First run the algorithm with truncated indices
- +
- + const eh_index soln_size { 1 << K };
- + std::vector<std::shared_ptr<eh_trunc>> partialSolns;
- + size_t invalidCount = 0;
- + {
- +
- + // 1) Generate first list
- + LogPrint(BCLog::POW, "Generating first list\n");
- + size_t hashLen = HashLength;
- + size_t lenIndices = sizeof(eh_trunc);
- + std::vector<TruncatedStepRow<TruncatedWidth>> Xt;
- + Xt.reserve(init_size);
- + unsigned char tmpHash[HashOutput];
- + for (eh_index g = 0; Xt.size() < init_size; g++) {
- + GenerateHash(base_state, g, tmpHash, HashOutput);
- + for (eh_index i = 0; i < IndicesPerHashOutput && Xt.size() < init_size; i++) {
- + Xt.emplace_back(tmpHash+(i*N/8), N/8, HashLength, CollisionBitLength,
- + (g*IndicesPerHashOutput)+i, CollisionBitLength + 1);
- + }
- + if (cancelled(ListGeneration)) throw solver_cancelled;
- + }
- +
- + // 3) Repeat step 2 until 2n/(k+1) bits remain
- + for (size_t r = 1; r < K && Xt.size() > 0; r++) {
- + LogPrint(BCLog::POW, "Round %zu:\n", r);
- + // 2a) Sort the list
- + LogPrint(BCLog::POW, "- Sorting list\n");
- + std::sort(Xt.begin(), Xt.end(), CompareSR(CollisionByteLength));
- + if (cancelled(ListSorting)) throw solver_cancelled;
- +
- + LogPrint(BCLog::POW, "- Finding collisions\n");
- + size_t i = 0;
- + size_t posFree = 0;
- + std::vector<TruncatedStepRow<TruncatedWidth>> Xc;
- + while (i < Xt.size() - 1) {
- + // 2b) Find next set of unordered pairs with collisions on the next n/(k+1) bits
- + size_t j = 1;
- + while (i+j < Xt.size() &&
- + HasCollision(Xt[i], Xt[i+j], CollisionByteLength)) {
- + j++;
- + }
- +
- + // 2c) Calculate tuples (X_i ^ X_j, (i, j))
- + //bool checking_for_zero = (i == 0 && Xt[0].IsZero(hashLen));
- + for (size_t l = 0; l < j - 1; l++) {
- + for (size_t m = l + 1; m < j; m++) {
- + // We truncated, so don't check for distinct indices here
- + TruncatedStepRow<TruncatedWidth> Xi {Xt[i+l], Xt[i+m],
- + hashLen, lenIndices,
- + CollisionByteLength};
- + if (!(Xi.IsZero(hashLen-CollisionByteLength) &&
- + IsProbablyDuplicate<soln_size>(Xi.GetTruncatedIndices(hashLen-CollisionByteLength, 2*lenIndices),
- + 2*lenIndices))) {
- + Xc.emplace_back(Xi);
- + }
- + }
- + }
- +
- + // 2d) Store tuples on the table in-place if possible
- + while (posFree < i+j && Xc.size() > 0) {
- + Xt[posFree++] = Xc.back();
- + Xc.pop_back();
- + }
- +
- + i += j;
- + if (cancelled(ListColliding)) throw solver_cancelled;
- + }
- +
- + // 2e) Handle edge case where final table entry has no collision
- + while (posFree < Xt.size() && Xc.size() > 0) {
- + Xt[posFree++] = Xc.back();
- + Xc.pop_back();
- + }
- +
- + if (Xc.size() > 0) {
- + // 2f) Add overflow to end of table
- + Xt.insert(Xt.end(), Xc.begin(), Xc.end());
- + } else if (posFree < Xt.size()) {
- + // 2g) Remove empty space at the end
- + Xt.erase(Xt.begin()+posFree, Xt.end());
- + Xt.shrink_to_fit();
- + }
- +
- + hashLen -= CollisionByteLength;
- + lenIndices *= 2;
- + if (cancelled(RoundEnd)) throw solver_cancelled;
- + }
- +
- + // k+1) Find a collision on last 2n(k+1) bits
- + LogPrint(BCLog::POW, "Final round:\n");
- + if (Xt.size() > 1) {
- + LogPrint(BCLog::POW, "- Sorting list\n");
- + std::sort(Xt.begin(), Xt.end(), CompareSR(hashLen));
- + if (cancelled(FinalSorting)) throw solver_cancelled;
- + LogPrint(BCLog::POW, "- Finding collisions\n");
- + size_t i = 0;
- + while (i < Xt.size() - 1) {
- + size_t j = 1;
- + while (i+j < Xt.size() &&
- + HasCollision(Xt[i], Xt[i+j], hashLen)) {
- + j++;
- + }
- +
- + for (size_t l = 0; l < j - 1; l++) {
- + for (size_t m = l + 1; m < j; m++) {
- + TruncatedStepRow<FinalTruncatedWidth> res(Xt[i+l], Xt[i+m],
- + hashLen, lenIndices, 0);
- + auto soln = res.GetTruncatedIndices(hashLen, 2*lenIndices);
- + if (!IsProbablyDuplicate<soln_size>(soln, 2*lenIndices)) {
- + partialSolns.push_back(soln);
- + }
- + }
- + }
- +
- + i += j;
- + if (cancelled(FinalColliding)) throw solver_cancelled;
- + }
- + } else
- + LogPrint(BCLog::POW, "- List is empty\n");
- +
- + } // Ensure Xt goes out of scope and is destroyed
- +
- + LogPrint(BCLog::POW, "Found %d partial solutions\n", partialSolns.size());
- +
- + // Now for each solution run the algorithm again to recreate the indices
- + LogPrint(BCLog::POW, "Culling solutions\n");
- + for (std::shared_ptr<eh_trunc> partialSoln : partialSolns) {
- + std::set<std::vector<unsigned char>> solns;
- + size_t hashLen;
- + size_t lenIndices;
- + unsigned char tmpHash[HashOutput];
- + std::vector<boost::optional<std::vector<FullStepRow<FinalFullWidth>>>> X;
- + X.reserve(K+1);
- +
- + // 3) Repeat steps 1 and 2 for each partial index
- + for (eh_index i = 0; i < soln_size; i++) {
- + // 1) Generate first list of possibilities
- + std::vector<FullStepRow<FinalFullWidth>> icv;
- + icv.reserve(recreate_size);
- + for (eh_index j = 0; j < recreate_size; j++) {
- + eh_index newIndex { UntruncateIndex(partialSoln.get()[i], j, CollisionBitLength + 1) };
- + if (j == 0 || newIndex % IndicesPerHashOutput == 0) {
- + GenerateHash(base_state, newIndex/IndicesPerHashOutput,
- + tmpHash, HashOutput);
- + }
- + icv.emplace_back(tmpHash+((newIndex % IndicesPerHashOutput) * N/8),
- + N/8, HashLength, CollisionBitLength, newIndex);
- + if (cancelled(PartialGeneration)) throw solver_cancelled;
- + }
- + boost::optional<std::vector<FullStepRow<FinalFullWidth>>> ic = icv;
- +
- + // 2a) For each pair of lists:
- + hashLen = HashLength;
- + lenIndices = sizeof(eh_index);
- + size_t rti = i;
- + for (size_t r = 0; r <= K; r++) {
- + // 2b) Until we are at the top of a subtree:
- + if (r < X.size()) {
- + if (X[r]) {
- + // 2c) Merge the lists
- + ic->reserve(ic->size() + X[r]->size());
- + ic->insert(ic->end(), X[r]->begin(), X[r]->end());
- + std::sort(ic->begin(), ic->end(), CompareSR(hashLen));
- + if (cancelled(PartialSorting)) throw solver_cancelled;
- + size_t lti = rti-(1<<r);
- + CollideBranches(*ic, hashLen, lenIndices,
- + CollisionByteLength,
- + CollisionBitLength + 1,
- + partialSoln.get()[lti], partialSoln.get()[rti]);
- +
- + // 2d) Check if this has become an invalid solution
- + if (ic->size() == 0)
- + goto invalidsolution;
- +
- + X[r] = boost::none;
- + hashLen -= CollisionByteLength;
- + lenIndices *= 2;
- + rti = lti;
- + } else {
- + X[r] = *ic;
- + break;
- + }
- + } else {
- + X.push_back(ic);
- + break;
- + }
- + if (cancelled(PartialSubtreeEnd)) throw solver_cancelled;
- + }
- + if (cancelled(PartialIndexEnd)) throw solver_cancelled;
- + }
- +
- + // We are at the top of the tree
- + assert(X.size() == K+1);
- + for (FullStepRow<FinalFullWidth> row : *X[K]) {
- + auto soln = row.GetIndices(hashLen, lenIndices, CollisionBitLength);
- + assert(soln.size() == equihash_solution_size(N, K));
- + solns.insert(soln);
- + }
- + for (auto soln : solns) {
- + if (validBlock(soln))
- + return true;
- + }
- + if (cancelled(PartialEnd)) throw solver_cancelled;
- + continue;
- +
- +invalidsolution:
- + invalidCount++;
- + }
- + LogPrint(BCLog::POW, "- Number of invalid solutions found: %zu\n", invalidCount);
- +
- + return false;
- +}
- +
- +template<unsigned int N, unsigned int K>
- +bool Equihash<N,K>::IsValidSolution(const eh_HashState& base_state, std::vector<unsigned char> soln)
- +{
- + if (soln.size() != SolutionWidth) {
- + LogPrint(BCLog::POW, "Invalid solution length: %d (expected %d)\n",
- + soln.size(), SolutionWidth);
- + return false;
- + }
- +
- + std::vector<FullStepRow<FinalFullWidth>> X;
- + X.reserve(1 << K);
- + unsigned char tmpHash[HashOutput];
- + for (eh_index i : GetIndicesFromMinimal(soln, CollisionBitLength)) {
- + GenerateHash(base_state, i/IndicesPerHashOutput, tmpHash, HashOutput);
- + X.emplace_back(tmpHash+((i % IndicesPerHashOutput) * N/8),
- + N/8, HashLength, CollisionBitLength, i);
- + }
- +
- + size_t hashLen = HashLength;
- + size_t lenIndices = sizeof(eh_index);
- + while (X.size() > 1) {
- + std::vector<FullStepRow<FinalFullWidth>> Xc;
- + for (size_t i = 0; i < X.size(); i += 2) {
- + if (!HasCollision(X[i], X[i+1], CollisionByteLength)) {
- + LogPrint(BCLog::POW, "Invalid solution: invalid collision length between StepRows\n");
- + LogPrint(BCLog::POW, "X[i] = %s\n", X[i].GetHex(hashLen));
- + LogPrint(BCLog::POW, "X[i+1] = %s\n", X[i+1].GetHex(hashLen));
- + return false;
- + }
- + if (X[i+1].IndicesBefore(X[i], hashLen, lenIndices)) {
- + LogPrint(BCLog::POW, "Invalid solution: Index tree incorrectly ordered\n");
- + return false;
- + }
- + if (!DistinctIndices(X[i], X[i+1], hashLen, lenIndices)) {
- + LogPrint(BCLog::POW, "Invalid solution: duplicate indices\n");
- + return false;
- + }
- + Xc.emplace_back(X[i], X[i+1], hashLen, lenIndices, CollisionByteLength);
- + }
- + X = Xc;
- + hashLen -= CollisionByteLength;
- + lenIndices *= 2;
- + }
- +
- + assert(X.size() == 1);
- + return X[0].IsZero(hashLen);
- +}
- +
- +// Explicit instantiations for Equihash<96,3>
- +template int Equihash<96,3>::InitialiseState(eh_HashState& base_state);
- +template bool Equihash<96,3>::BasicSolve(const eh_HashState& base_state,
- + const std::function<bool(std::vector<unsigned char>)> validBlock,
- + const std::function<bool(EhSolverCancelCheck)> cancelled);
- +template bool Equihash<96,3>::OptimisedSolve(const eh_HashState& base_state,
- + const std::function<bool(std::vector<unsigned char>)> validBlock,
- + const std::function<bool(EhSolverCancelCheck)> cancelled);
- +template bool Equihash<96,3>::IsValidSolution(const eh_HashState& base_state, std::vector<unsigned char> soln);
- +
- +// Explicit instantiations for Equihash<200,9>
- +template int Equihash<200,9>::InitialiseState(eh_HashState& base_state);
- +template bool Equihash<200,9>::BasicSolve(const eh_HashState& base_state,
- + const std::function<bool(std::vector<unsigned char>)> validBlock,
- + const std::function<bool(EhSolverCancelCheck)> cancelled);
- +template bool Equihash<200,9>::OptimisedSolve(const eh_HashState& base_state,
- + const std::function<bool(std::vector<unsigned char>)> validBlock,
- + const std::function<bool(EhSolverCancelCheck)> cancelled);
- +template bool Equihash<200,9>::IsValidSolution(const eh_HashState& base_state, std::vector<unsigned char> soln);
- +
- +// Explicit instantiations for Equihash<96,5>
- +template int Equihash<96,5>::InitialiseState(eh_HashState& base_state);
- +template bool Equihash<96,5>::BasicSolve(const eh_HashState& base_state,
- + const std::function<bool(std::vector<unsigned char>)> validBlock,
- + const std::function<bool(EhSolverCancelCheck)> cancelled);
- +template bool Equihash<96,5>::OptimisedSolve(const eh_HashState& base_state,
- + const std::function<bool(std::vector<unsigned char>)> validBlock,
- + const std::function<bool(EhSolverCancelCheck)> cancelled);
- +template bool Equihash<96,5>::IsValidSolution(const eh_HashState& base_state, std::vector<unsigned char> soln);
- +
- +// Explicit instantiations for Equihash<48,5>
- +template int Equihash<48,5>::InitialiseState(eh_HashState& base_state);
- +template bool Equihash<48,5>::BasicSolve(const eh_HashState& base_state,
- + const std::function<bool(std::vector<unsigned char>)> validBlock,
- + const std::function<bool(EhSolverCancelCheck)> cancelled);
- +template bool Equihash<48,5>::OptimisedSolve(const eh_HashState& base_state,
- + const std::function<bool(std::vector<unsigned char>)> validBlock,
- + const std::function<bool(EhSolverCancelCheck)> cancelled);
- +template bool Equihash<48,5>::IsValidSolution(const eh_HashState& base_state, std::vector<unsigned char> soln);
- diff --git a/src/crypto/equihash.h b/src/crypto/equihash.h
- new file mode 100644
- index 0000000..85058e2
- --- /dev/null
- +++ b/src/crypto/equihash.h
- @@ -0,0 +1,276 @@
- +// Copyright (c) 2016 Jack Grigg
- +// Copyright (c) 2016 The Zcash developers
- +// Distributed under the MIT software license, see the accompanying
- +// file COPYING or http://www.opensource.org/licenses/mit-license.php.
- +
- +#ifndef BITCOIN_EQUIHASH_H
- +#define BITCOIN_EQUIHASH_H
- +
- +#include "compat/endian.h"
- +#include "crypto/sha256.h"
- +#include "utilstrencodings.h"
- +
- +#include "sodium.h"
- +
- +#include <cstring>
- +#include <exception>
- +#include <functional>
- +#include <memory>
- +#include <set>
- +#include <vector>
- +
- +#include <boost/static_assert.hpp>
- +
- +typedef crypto_generichash_blake2b_state eh_HashState;
- +typedef uint32_t eh_index;
- +typedef uint8_t eh_trunc;
- +
- +void ExpandArray(const unsigned char* in, size_t in_len,
- + unsigned char* out, size_t out_len,
- + size_t bit_len, size_t byte_pad=0);
- +void CompressArray(const unsigned char* in, size_t in_len,
- + unsigned char* out, size_t out_len,
- + size_t bit_len, size_t byte_pad=0);
- +
- +eh_index ArrayToEhIndex(const unsigned char* array);
- +eh_trunc TruncateIndex(const eh_index i, const unsigned int ilen);
- +
- +std::vector<eh_index> GetIndicesFromMinimal(std::vector<unsigned char> minimal,
- + size_t cBitLen);
- +std::vector<unsigned char> GetMinimalFromIndices(std::vector<eh_index> indices,
- + size_t cBitLen);
- +
- +template<size_t WIDTH>
- +class StepRow
- +{
- + template<size_t W>
- + friend class StepRow;
- + friend class CompareSR;
- +
- +protected:
- + unsigned char hash[WIDTH];
- +
- +public:
- + StepRow(const unsigned char* hashIn, size_t hInLen,
- + size_t hLen, size_t cBitLen);
- + ~StepRow() { }
- +
- + template<size_t W>
- + StepRow(const StepRow<W>& a);
- +
- + bool IsZero(size_t len);
- + std::string GetHex(size_t len) { return HexStr(hash, hash+len); }
- +
- + template<size_t W>
- + friend bool HasCollision(StepRow<W>& a, StepRow<W>& b, size_t l);
- +};
- +
- +class CompareSR
- +{
- +private:
- + size_t len;
- +
- +public:
- + CompareSR(size_t l) : len {l} { }
- +
- + template<size_t W>
- + inline bool operator()(const StepRow<W>& a, const StepRow<W>& b) { return memcmp(a.hash, b.hash, len) < 0; }
- +};
- +
- +template<size_t WIDTH>
- +bool HasCollision(StepRow<WIDTH>& a, StepRow<WIDTH>& b, size_t l);
- +
- +template<size_t WIDTH>
- +class FullStepRow : public StepRow<WIDTH>
- +{
- + template<size_t W>
- + friend class FullStepRow;
- +
- + using StepRow<WIDTH>::hash;
- +
- +public:
- + FullStepRow(const unsigned char* hashIn, size_t hInLen,
- + size_t hLen, size_t cBitLen, eh_index i);
- + ~FullStepRow() { }
- +
- + FullStepRow(const FullStepRow<WIDTH>& a) : StepRow<WIDTH> {a} { }
- + template<size_t W>
- + FullStepRow(const FullStepRow<W>& a, const FullStepRow<W>& b, size_t len, size_t lenIndices, size_t trim);
- + FullStepRow& operator=(const FullStepRow<WIDTH>& a);
- +
- + inline bool IndicesBefore(const FullStepRow<WIDTH>& a, size_t len, size_t lenIndices) const { return memcmp(hash+len, a.hash+len, lenIndices) < 0; }
- + std::vector<unsigned char> GetIndices(size_t len, size_t lenIndices,
- + size_t cBitLen) const;
- +
- + template<size_t W>
- + friend bool DistinctIndices(const FullStepRow<W>& a, const FullStepRow<W>& b,
- + size_t len, size_t lenIndices);
- + template<size_t W>
- + friend bool IsValidBranch(const FullStepRow<W>& a, const size_t len, const unsigned int ilen, const eh_trunc t);
- +};
- +
- +template<size_t WIDTH>
- +class TruncatedStepRow : public StepRow<WIDTH>
- +{
- + template<size_t W>
- + friend class TruncatedStepRow;
- +
- + using StepRow<WIDTH>::hash;
- +
- +public:
- + TruncatedStepRow(const unsigned char* hashIn, size_t hInLen,
- + size_t hLen, size_t cBitLen,
- + eh_index i, unsigned int ilen);
- + ~TruncatedStepRow() { }
- +
- + TruncatedStepRow(const TruncatedStepRow<WIDTH>& a) : StepRow<WIDTH> {a} { }
- + template<size_t W>
- + TruncatedStepRow(const TruncatedStepRow<W>& a, const TruncatedStepRow<W>& b, size_t len, size_t lenIndices, size_t trim);
- + TruncatedStepRow& operator=(const TruncatedStepRow<WIDTH>& a);
- +
- + inline bool IndicesBefore(const TruncatedStepRow<WIDTH>& a, size_t len, size_t lenIndices) const { return memcmp(hash+len, a.hash+len, lenIndices) < 0; }
- + std::shared_ptr<eh_trunc> GetTruncatedIndices(size_t len, size_t lenIndices) const;
- +};
- +
- +enum EhSolverCancelCheck
- +{
- + ListGeneration,
- + ListSorting,
- + ListColliding,
- + RoundEnd,
- + FinalSorting,
- + FinalColliding,
- + PartialGeneration,
- + PartialSorting,
- + PartialSubtreeEnd,
- + PartialIndexEnd,
- + PartialEnd
- +};
- +
- +class EhSolverCancelledException : public std::exception
- +{
- + virtual const char* what() const throw() {
- + return "Equihash solver was cancelled";
- + }
- +};
- +
- +inline constexpr size_t max(const size_t A, const size_t B) { return A > B ? A : B; }
- +
- +inline constexpr size_t equihash_solution_size(unsigned int N, unsigned int K) {
- + return (1 << K)*(N/(K+1)+1)/8;
- +}
- +
- +template<unsigned int N, unsigned int K>
- +class Equihash
- +{
- +private:
- + BOOST_STATIC_ASSERT(K < N);
- + BOOST_STATIC_ASSERT(N % 8 == 0);
- + BOOST_STATIC_ASSERT((N/(K+1)) + 1 < 8*sizeof(eh_index));
- +
- +public:
- + enum : size_t { IndicesPerHashOutput=512/N };
- + enum : size_t { HashOutput=IndicesPerHashOutput*N/8 };
- + enum : size_t { CollisionBitLength=N/(K+1) };
- + enum : size_t { CollisionByteLength=(CollisionBitLength+7)/8 };
- + enum : size_t { HashLength=(K+1)*CollisionByteLength };
- + enum : size_t { FullWidth=2*CollisionByteLength+sizeof(eh_index)*(1 << (K-1)) };
- + enum : size_t { FinalFullWidth=2*CollisionByteLength+sizeof(eh_index)*(1 << (K)) };
- + enum : size_t { TruncatedWidth=max(HashLength+sizeof(eh_trunc), 2*CollisionByteLength+sizeof(eh_trunc)*(1 << (K-1))) };
- + enum : size_t { FinalTruncatedWidth=max(HashLength+sizeof(eh_trunc), 2*CollisionByteLength+sizeof(eh_trunc)*(1 << (K))) };
- + enum : size_t { SolutionWidth=(1 << K)*(CollisionBitLength+1)/8 };
- +
- + Equihash() { }
- +
- + int InitialiseState(eh_HashState& base_state);
- + bool BasicSolve(const eh_HashState& base_state,
- + const std::function<bool(std::vector<unsigned char>)> validBlock,
- + const std::function<bool(EhSolverCancelCheck)> cancelled);
- + bool OptimisedSolve(const eh_HashState& base_state,
- + const std::function<bool(std::vector<unsigned char>)> validBlock,
- + const std::function<bool(EhSolverCancelCheck)> cancelled);
- + bool IsValidSolution(const eh_HashState& base_state, std::vector<unsigned char> soln);
- +};
- +
- +#include "equihash.tcc"
- +
- +static Equihash<96,3> Eh96_3;
- +static Equihash<200,9> Eh200_9;
- +static Equihash<96,5> Eh96_5;
- +static Equihash<48,5> Eh48_5;
- +
- +#define EhInitialiseState(n, k, base_state) \
- + if (n == 96 && k == 3) { \
- + Eh96_3.InitialiseState(base_state); \
- + } else if (n == 200 && k == 9) { \
- + Eh200_9.InitialiseState(base_state); \
- + } else if (n == 96 && k == 5) { \
- + Eh96_5.InitialiseState(base_state); \
- + } else if (n == 48 && k == 5) { \
- + Eh48_5.InitialiseState(base_state); \
- + } else { \
- + throw std::invalid_argument("Unsupported Equihash parameters"); \
- + }
- +
- +inline bool EhBasicSolve(unsigned int n, unsigned int k, const eh_HashState& base_state,
- + const std::function<bool(std::vector<unsigned char>)> validBlock,
- + const std::function<bool(EhSolverCancelCheck)> cancelled)
- +{
- + if (n == 96 && k == 3) {
- + return Eh96_3.BasicSolve(base_state, validBlock, cancelled);
- + } else if (n == 200 && k == 9) {
- + return Eh200_9.BasicSolve(base_state, validBlock, cancelled);
- + } else if (n == 96 && k == 5) {
- + return Eh96_5.BasicSolve(base_state, validBlock, cancelled);
- + } else if (n == 48 && k == 5) {
- + return Eh48_5.BasicSolve(base_state, validBlock, cancelled);
- + } else {
- + throw std::invalid_argument("Unsupported Equihash parameters");
- + }
- +}
- +
- +inline bool EhBasicSolveUncancellable(unsigned int n, unsigned int k, const eh_HashState& base_state,
- + const std::function<bool(std::vector<unsigned char>)> validBlock)
- +{
- + return EhBasicSolve(n, k, base_state, validBlock,
- + [](EhSolverCancelCheck pos) { return false; });
- +}
- +
- +inline bool EhOptimisedSolve(unsigned int n, unsigned int k, const eh_HashState& base_state,
- + const std::function<bool(std::vector<unsigned char>)> validBlock,
- + const std::function<bool(EhSolverCancelCheck)> cancelled)
- +{
- + if (n == 96 && k == 3) {
- + return Eh96_3.OptimisedSolve(base_state, validBlock, cancelled);
- + } else if (n == 200 && k == 9) {
- + return Eh200_9.OptimisedSolve(base_state, validBlock, cancelled);
- + } else if (n == 96 && k == 5) {
- + return Eh96_5.OptimisedSolve(base_state, validBlock, cancelled);
- + } else if (n == 48 && k == 5) {
- + return Eh48_5.OptimisedSolve(base_state, validBlock, cancelled);
- + } else {
- + throw std::invalid_argument("Unsupported Equihash parameters");
- + }
- +}
- +
- +inline bool EhOptimisedSolveUncancellable(unsigned int n, unsigned int k, const eh_HashState& base_state,
- + const std::function<bool(std::vector<unsigned char>)> validBlock)
- +{
- + return EhOptimisedSolve(n, k, base_state, validBlock,
- + [](EhSolverCancelCheck pos) { return false; });
- +}
- +
- +#define EhIsValidSolution(n, k, base_state, soln, ret) \
- + if (n == 96 && k == 3) { \
- + ret = Eh96_3.IsValidSolution(base_state, soln); \
- + } else if (n == 200 && k == 9) { \
- + ret = Eh200_9.IsValidSolution(base_state, soln); \
- + } else if (n == 96 && k == 5) { \
- + ret = Eh96_5.IsValidSolution(base_state, soln); \
- + } else if (n == 48 && k == 5) { \
- + ret = Eh48_5.IsValidSolution(base_state, soln); \
- + } else { \
- + throw std::invalid_argument("Unsupported Equihash parameters"); \
- + }
- +
- +#endif // BITCOIN_EQUIHASH_H
- diff --git a/src/crypto/equihash.tcc b/src/crypto/equihash.tcc
- new file mode 100644
- index 0000000..e2185b7
- --- /dev/null
- +++ b/src/crypto/equihash.tcc
- @@ -0,0 +1,49 @@
- +// Copyright (c) 2016 Jack Grigg
- +// Copyright (c) 2016 The Zcash developers
- +// Distributed under the MIT software license, see the accompanying
- +// file COPYING or http://www.opensource.org/licenses/mit-license.php.
- +
- +#include <algorithm>
- +#include <cassert>
- +
- +// Checks if the intersection of a.indices and b.indices is empty
- +template<size_t WIDTH>
- +bool DistinctIndices(const FullStepRow<WIDTH>& a, const FullStepRow<WIDTH>& b, size_t len, size_t lenIndices)
- +{
- + for(size_t i = 0; i < lenIndices; i += sizeof(eh_index)) {
- + for(size_t j = 0; j < lenIndices; j += sizeof(eh_index)) {
- + if (memcmp(a.hash+len+i, b.hash+len+j, sizeof(eh_index)) == 0) {
- + return false;
- + }
- + }
- + }
- + return true;
- +}
- +
- +template<size_t MAX_INDICES>
- +bool IsProbablyDuplicate(std::shared_ptr<eh_trunc> indices, size_t lenIndices)
- +{
- + assert(lenIndices <= MAX_INDICES);
- + bool checked_index[MAX_INDICES] = {false};
- + size_t count_checked = 0;
- + for (size_t z = 0; z < lenIndices; z++) {
- + // Skip over indices we have already paired
- + if (!checked_index[z]) {
- + for (size_t y = z+1; y < lenIndices; y++) {
- + if (!checked_index[y] && indices.get()[z] == indices.get()[y]) {
- + // Pair found
- + checked_index[y] = true;
- + count_checked += 2;
- + break;
- + }
- + }
- + }
- + }
- + return count_checked == lenIndices;
- +}
- +
- +template<size_t WIDTH>
- +bool IsValidBranch(const FullStepRow<WIDTH>& a, const size_t len, const unsigned int ilen, const eh_trunc t)
- +{
- + return TruncateIndex(ArrayToEhIndex(a.hash+len), ilen) == t;
- +}
- diff --git a/src/init.cpp b/src/init.cpp
- index 62e66cb..e256353 100644
- --- a/src/init.cpp
- +++ b/src/init.cpp
- @@ -567,6 +567,8 @@ std::string HelpMessage(HelpMessageMode mode) {
- "MiB per 24h), 0 = no limit (default: %d)"),
- DEFAULT_MAX_UPLOAD_TARGET));
- + strUsage += HelpMessageOpt("-bootstrap", _("Enables Bitcoin Candy bootstrap mode. Allows CDY client to connect to Bitcoin p2p network to download blockahin history."));
- + strUsage += HelpMessageOpt("-skiphardforkibd", _("Skip Initial Block Download when reaching hardfork block."));
- #ifdef ENABLE_WALLET
- strUsage += CWallet::GetWalletHelpString(showDebug);
- #endif
- @@ -866,8 +868,8 @@ std::string HelpMessage(HelpMessageMode mode) {
- std::string LicenseInfo() {
- const std::string URL_SOURCE_CODE =
- - "<https://github.com/Bitcoin-ABC/bitcoin-abc>";
- - const std::string URL_WEBSITE = "<https://www.bitcoinabc.org>";
- + "<https://github.com/bitcoincandyteam/bitcoincandy>";
- + const std::string URL_WEBSITE = "<http://www.bitcoincandy.one";
- return CopyrightHolders(
- strprintf(_("Copyright (C) %i-%i"), 2009, COPYRIGHT_YEAR) +
- @@ -1677,6 +1679,9 @@ bool AppInitMain(Config &config, boost::thread_group &threadGroup,
- }
- }
- + //fCDYBootstrapping = GetBoolArg("-bootstrap", false);
- + //fSkipHardforkIBD = GetBoolArg("-skiphardforkibd", false);
- +
- // Start the lightweight task scheduler thread
- CScheduler::Function serviceLoop =
- boost::bind(&CScheduler::serviceQueue, &scheduler);
- @@ -1873,6 +1878,9 @@ bool AppInitMain(Config &config, boost::thread_group &threadGroup,
- GetArg("-maxuploadtarget", DEFAULT_MAX_UPLOAD_TARGET) * 1024 * 1024;
- }
- + //if (fCDYBootstrapping)
- + // nLocalServices = ServiceFlags(nLocalServices & ~NODE_BITCOIN_CASH);
- +
- // Step 7: load block chain
- fReindex = GetBoolArg("-reindex", false);
- @@ -2113,8 +2121,7 @@ bool AppInitMain(Config &config, boost::thread_group &threadGroup,
- // Encoded addresses using cashaddr instead of base58
- // Activates by default on Jan, 14
- - config.SetCashAddrEncoding(
- - GetBoolArg("-usecashaddr", GetAdjustedTime() > 1515900000));
- + config.SetCashAddrEncoding(false); // disabled for bitcoin candy
- // Step 8: load wallet
- #ifdef ENABLE_WALLET
- diff --git a/src/miner.cpp b/src/miner.cpp
- index 287200b..290331b 100644
- --- a/src/miner.cpp
- +++ b/src/miner.cpp
- @@ -202,17 +202,29 @@ BlockAssembler::CreateNewBlock(const CScript &scriptPubKeyIn) {
- pblock->vtx[0] = MakeTransactionRef(coinbaseTx);
- pblocktemplate->vTxFees[0] = -1 * nFees;
- - uint64_t nSerializeSize =
- - GetSerializeSize(*pblock, SER_NETWORK, PROTOCOL_VERSION);
- + const Consensus::Params& params = chainparams.GetConsensus();
- + int ser_flags = (nHeight < params.cdyHeight) ? SERIALIZE_BLOCK_LEGACY : 0;
- + uint64_t nSerializeSize = GetSerializeSize(*pblock, SER_NETWORK, PROTOCOL_VERSION | ser_flags);
- LogPrintf("CreateNewBlock(): total size: %u txs: %u fees: %ld sigops %d\n",
- nSerializeSize, nBlockTx, nFees, nBlockSigOps);
- + arith_uint256 nonce;
- + if (nHeight >= params.cdyHeight) {
- + // Randomise nonce for new block foramt.
- + nonce = UintToArith256(GetRandHash());
- + // Clear the top and bottom 16 bits (for local use as thread flags and counters)
- + nonce <<= 32;
- + nonce >>= 16;
- + }
- // Fill in header.
- pblock->hashPrevBlock = pindexPrev->GetBlockHash();
- + pblock->nHeight = pindexPrev->nHeight + 1;
- + memset(pblock->nReserved, 0, sizeof(pblock->nReserved));
- UpdateTime(pblock, *config, pindexPrev);
- pblock->nBits = GetNextWorkRequired(pindexPrev, pblock, *config);
- - pblock->nNonce = 0;
- + pblock->nNonce = ArithToUint256(nonce);
- + pblock->nSolution.clear();
- pblocktemplate->vTxSigOpsCount[0] =
- GetSigOpCountWithoutP2SH(*pblock->vtx[0]);
- diff --git a/src/net.cpp b/src/net.cpp
- index 527a1a2..331e32c 100644
- --- a/src/net.cpp
- +++ b/src/net.cpp
- @@ -91,7 +91,7 @@ void CConnman::AddOneShot(const std::string &strDest) {
- }
- unsigned short GetListenPort() {
- - return (unsigned short)(GetArg("-port", Params().GetDefaultPort()));
- + return (unsigned short)(GetArg("-port", Params().GetDefaultPort(fCDYBootstrapping)));//Yang
- }
- // find 'best' local address for a particular peer
- @@ -351,7 +351,7 @@ CNode *CConnman::ConnectNode(CAddress addrConnect, const char *pszDest,
- SOCKET hSocket;
- bool proxyConnectionFailed = false;
- if (pszDest ? ConnectSocketByName(addrConnect, hSocket, pszDest,
- - Params().GetDefaultPort(),
- + Params().GetDefaultPort(fCDYBootstrapping),
- nConnectTimeout, &proxyConnectionFailed)
- : ConnectSocket(addrConnect, hSocket, nConnectTimeout,
- &proxyConnectionFailed)) {
- @@ -390,6 +390,10 @@ CNode *CConnman::ConnectNode(CAddress addrConnect, const char *pszDest,
- new CNode(id, nLocalServices, GetBestHeight(), hSocket, addrConnect,
- CalculateKeyedNetGroup(addrConnect), nonce,
- pszDest ? pszDest : "", false);
- + if (fCDYBootstrapping) {
- + pnode->fUsesCDYMagic = false;
- + }
- +
- pnode->nServicesExpected =
- ServiceFlags(addrConnect.nServices & nRelevantServices);
- pnode->AddRef();
- @@ -670,6 +674,7 @@ void CNode::copyStats(CNodeStats &stats) {
- X(nRecvBytes);
- }
- X(fWhitelisted);
- + X(fUsesCDYMagic);
- // It is common for nodes with good ping times to suddenly become lagged,
- // due to a new block arriving or other large transfer. Merely reporting
- @@ -706,7 +711,7 @@ bool CNode::ReceiveMsgBytes(const char *pch, unsigned int nBytes,
- while (nBytes > 0) {
- // Get current incomplete message, or create a new one.
- if (vRecvMsg.empty() || vRecvMsg.back().complete()) {
- - vRecvMsg.push_back(CNetMessage(Params().NetMagic(), SER_NETWORK,
- + vRecvMsg.push_back(CNetMessage(GetMagic(Params()), SER_NETWORK,
- INIT_PROTO_VERSION));
- }
- @@ -1684,7 +1689,7 @@ void CConnman::ThreadDNSAddressSeed() {
- for (const CNetAddr &ip : vIPs) {
- int nOneDay = 24 * 3600;
- CAddress addr =
- - CAddress(CService(ip, Params().GetDefaultPort()),
- + CAddress(CService(ip, Params().GetDefaultPort(fCDYBootstrapping)),
- requiredServiceBits);
- // Use a random age between 3 and 7 days old.
- addr.nTime = GetTime() - 3 * nOneDay - GetRand(4 * nOneDay);
- @@ -1891,7 +1896,9 @@ void CConnman::ThreadOpenConnections() {
- // do not allow non-default ports, unless after 50 invalid addresses
- // selected already.
- - if (addr.GetPort() != Params().GetDefaultPort() && nTries < 50) {
- + if ((addr.GetPort() != Params().GetDefaultPort() ||
- + (fCDYBootstrapping && addr.GetPort() != Params().GetDefaultPort(true)))
- + && nTries < 50) {
- continue;
- }
- @@ -1954,7 +1961,7 @@ std::vector<AddedNodeInfo> CConnman::GetAddedNodeInfo() {
- for (const std::string &strAddNode : lAddresses) {
- CService service(
- - LookupNumeric(strAddNode.c_str(), Params().GetDefaultPort()));
- + LookupNumeric(strAddNode.c_str(), Params().GetDefaultPort(fCDYBootstrapping)));
- if (service.IsValid()) {
- // strAddNode is an IP:port
- auto it = mapConnected.find(service);
- @@ -2006,7 +2013,7 @@ void CConnman::ThreadOpenAddedConnections() {
- // IP/port.
- tried = true;
- CService service(LookupNumeric(info.strAddedNode.c_str(),
- - Params().GetDefaultPort()));
- + Params().GetDefaultPort(fCDYBootstrapping)));
- OpenNetworkConnection(CAddress(service, NODE_NONE), false,
- &grant, info.strAddedNode.c_str(), false,
- false, true);
- @@ -2842,6 +2849,7 @@ CNode::CNode(NodeId idIn, ServiceFlags nLocalServicesIn,
- nPingUsecStart = 0;
- nPingUsecTime = 0;
- fPingQueued = false;
- + fUsesCDYMagic = true;
- nMinPingUsecTime = std::numeric_limits<int64_t>::max();
- minFeeFilter = Amount(0);
- lastSentFeeFilter = Amount(0);
- @@ -2926,7 +2934,7 @@ void CConnman::PushMessage(CNode *pnode, CSerializedNetMsg &&msg) {
- std::vector<uint8_t> serializedHeader;
- serializedHeader.reserve(CMessageHeader::HEADER_SIZE);
- uint256 hash = Hash(msg.data.data(), msg.data.data() + nMessageSize);
- - CMessageHeader hdr(Params().NetMagic(), msg.command.c_str(), nMessageSize);
- + CMessageHeader hdr(pnode->GetMagic(Params()), msg.command.c_str(), nMessageSize);
- memcpy(hdr.pchChecksum, hash.begin(), CMessageHeader::CHECKSUM_SIZE);
- CVectorWriter{SER_NETWORK, INIT_PROTO_VERSION, serializedHeader, 0, hdr};
- diff --git a/src/net.h b/src/net.h
- index d54b4e8..ffe7f95 100644
- --- a/src/net.h
- +++ b/src/net.h
- @@ -91,7 +91,7 @@ static const bool DEFAULT_BLOCKSONLY = false;
- // Force DNS seed use ahead of UAHF fork, to ensure peers are found
- // as long as seeders are working.
- // TODO: Change this back to false after the forked network is stable.
- -static const bool DEFAULT_FORCEDNSSEED = true;
- +static const bool DEFAULT_FORCEDNSSEED = false;
- static const size_t DEFAULT_MAXRECEIVEBUFFER = 5 * 1000;
- static const size_t DEFAULT_MAXSENDBUFFER = 1 * 1000;
- @@ -520,6 +520,7 @@ public:
- double dMinPing;
- std::string addrLocal;
- CAddress addr;
- + bool fUsesCDYMagic;
- };
- class CNetMessage {
- @@ -700,6 +701,8 @@ public:
- std::atomic<int64_t> nMinPingUsecTime;
- // Whether a ping is requested.
- std::atomic<bool> fPingQueued;
- + // Whether the node uses the bitcoin candy magic to communicate.
- + std::atomic<bool> fUsesCDYMagic;
- // Minimum fee rate with which to filter inv's to this node
- Amount minFeeFilter;
- CCriticalSection cs_feeFilter;
- @@ -749,6 +752,10 @@ public:
- void SetSendVersion(int nVersionIn);
- int GetSendVersion() const;
- + const CMessageHeader::MessageMagic& GetMagic(const CChainParams ¶ms) const {
- + return fUsesCDYMagic ? params.NetMagic() : params.NetMagicLegacy();
- + }
- +
- CService GetAddrLocal() const;
- //! May not be called more than once
- void SetAddrLocal(const CService &addrLocalIn);
- @@ -810,6 +817,8 @@ public:
- std::string GetAddrName() const;
- //! Sets the addrName only if it was not previously set
- void MaybeSetAddrName(const std::string &addrNameIn);
- +
- + bool IsLegacyBlockHeader(int version) { return version < CDY_HARD_FORK_VERSION; };
- };
- /**
- diff --git a/src/net_processing.cpp b/src/net_processing.cpp
- index 43b8f37..48dbf69 100644
- --- a/src/net_processing.cpp
- +++ b/src/net_processing.cpp
- @@ -525,8 +525,11 @@ void MaybeSetPeerAsAnnouncingHeaderAndIDs(NodeId nodeid, CConnman &connman) {
- // Requires cs_main
- bool CanDirectFetch(const Consensus::Params &consensusParams) {
- - return chainActive.Tip()->GetBlockTime() >
- - GetAdjustedTime() - consensusParams.nPowTargetSpacing * 20;
- + int64_t target_time = GetAdjustedTime();
- + if (fCDYBootstrapping && consensusParams.BitcoinPostforkTime > 0) {
- + target_time = consensusParams.BitcoinPostforkTime;
- + }
- + return chainActive.Tip()->GetBlockTime() > target_time - consensusParams.nPowTargetSpacing * 20;
- }
- // Requires cs_main
- @@ -637,6 +640,7 @@ void FindNextBlocksToDownload(NodeId nodeid, unsigned int count,
- for (const CBlockIndex *pindex : vToFetch) {
- if (!pindex->IsValid(BLOCK_VALID_TREE)) {
- // We consider the chain that this peer is on invalid.
- + LogPrintf("%s: Invalid block at height %d(%s)\n", __func__, pindex->nHeight, pindex->phashBlock->ToString());
- return;
- }
- if (pindex->nStatus & BLOCK_HAVE_DATA ||
- @@ -1232,6 +1236,8 @@ static void ProcessGetData(const Config &config, CNode *pfrom,
- assert(!"cannot load block from disk");
- }
- + int legacy_block_flag = (pfrom->IsLegacyBlockHeader(pfrom->GetSendVersion())
- + ? SERIALIZE_BLOCK_LEGACY : 0);
- if (inv.type == MSG_BLOCK) {
- connman.PushMessage(
- pfrom, msgMaker.Make(NetMsgType::BLOCK, block));
- @@ -1248,7 +1254,7 @@ static void ProcessGetData(const Config &config, CNode *pfrom,
- }
- if (sendMerkleBlock) {
- connman.PushMessage(
- - pfrom, msgMaker.Make(NetMsgType::MERKLEBLOCK,
- + pfrom, msgMaker.Make(legacy_block_flag,NetMsgType::MERKLEBLOCK,
- merkleBlock));
- // CMerkleBlock just contains hashes, so also push
- // any transactions in the block the client did not
- @@ -1265,7 +1271,7 @@ static void ProcessGetData(const Config &config, CNode *pfrom,
- for (PairType &pair : merkleBlock.vMatchedTxn) {
- connman.PushMessage(
- pfrom,
- - msgMaker.Make(NetMsgType::TX,
- + msgMaker.Make(legacy_block_flag,NetMsgType::TX,
- *block.vtx[pair.first]));
- }
- }
- @@ -1277,7 +1283,7 @@ static void ProcessGetData(const Config &config, CNode *pfrom,
- // against a compact block, and we don't feel like
- // constructing the object for them, so instead we
- // respond with the full, non-compact block.
- - int nSendFlags = 0;
- + int nSendFlags = legacy_block_flag;
- if (CanDirectFetch(consensusParams) &&
- mi->second->nHeight >=
- chainActive.Height() - MAX_CMPCTBLOCK_DEPTH) {
- @@ -1599,6 +1605,9 @@ static bool ProcessMessage(const Config &config, CNode *pfrom,
- pfrom->addr.ToString().c_str(), cleanSubVer, pfrom->nVersion,
- pfrom->nStartingHeight, addrMe.ToString(), pfrom->id,
- remoteAddr);
- + if (pfrom->fUsesCDYMagic) {
- + LogPrintf("peer %d uses CDY magic in its headers\n", pfrom->id);
- + }
- int64_t nTimeOffset = nTime - GetTime();
- pfrom->nTimeOffset = nTimeOffset;
- @@ -1701,6 +1710,8 @@ static bool ProcessMessage(const Config &config, CNode *pfrom,
- return true;
- }
- + if (addr.GetPort() != chainparams.GetDefaultPort()) continue;
- +
- if ((addr.nServices & REQUIRED_SERVICES) != REQUIRED_SERVICES) {
- continue;
- }
- @@ -2041,8 +2052,9 @@ static bool ProcessMessage(const Config &config, CNode *pfrom,
- // will re-announce the new block via headers (or compact blocks again)
- // in the SendMessages logic.
- nodestate->pindexBestHeaderSent = pindex ? pindex : chainActive.Tip();
- - connman.PushMessage(pfrom,
- - msgMaker.Make(NetMsgType::HEADERS, vHeaders));
- +
- + int legacy_block_flag = pfrom->IsLegacyBlockHeader(pfrom->GetSendVersion()) ? SERIALIZE_BLOCK_LEGACY : 0;
- + connman.PushMessage(pfrom, msgMaker.Make(legacy_block_flag, NetMsgType::HEADERS, vHeaders));
- }
- else if (strCommand == NetMsgType::TX) {
- @@ -2604,12 +2616,17 @@ static bool ProcessMessage(const Config &config, CNode *pfrom,
- }
- }
- - // Ignore headers received while importing
- - else if (strCommand == NetMsgType::HEADERS && !fImporting && !fReindex) {
- +
- + else if (strCommand == NetMsgType::HEADERS && !fImporting && !fReindex) // Ignore headers received while importing
- + {
- + // Deserialize in legacy format.
- + int legacy_block_flag = pfrom->IsLegacyBlockHeader(pfrom->GetRecvVersion()) ? SERIALIZE_BLOCK_LEGACY : 0;
- + int original_version = vRecv.GetVersion();
- + vRecv.SetVersion(original_version | legacy_block_flag);
- +
- std::vector<CBlockHeader> headers;
- - // Bypass the normal CBlock deserialization, as we don't want to risk
- - // deserializing 2000 full blocks.
- + // Bypass the normal CBlock deserialization, as we don't want to risk deserializing 2000 full blocks.
- unsigned int nCount = ReadCompactSize(vRecv);
- if (nCount > MAX_HEADERS_RESULTS) {
- LOCK(cs_main);
- @@ -2619,9 +2636,9 @@ static bool ProcessMessage(const Config &config, CNode *pfrom,
- headers.resize(nCount);
- for (unsigned int n = 0; n < nCount; n++) {
- vRecv >> headers[n];
- - // Ignore tx count; assume it is 0.
- - ReadCompactSize(vRecv);
- + ReadCompactSize(vRecv); // ignore tx count; assume it is 0.
- }
- + vRecv.SetVersion(original_version);
- if (nCount == 0) {
- // Nothing interesting. Stop asking this peers for more headers.
- @@ -2648,10 +2665,16 @@ static bool ProcessMessage(const Config &config, CNode *pfrom,
- mapBlockIndex.end() &&
- nCount < MAX_BLOCKS_TO_ANNOUNCE) {
- nodestate->nUnconnectingHeaders++;
- + //Yang Setting stop_hash according to the fork block hash
- + uint256 stop_hash;
- + if (fCDYBootstrapping) {
- + stop_hash = chainparams.GetConsensus().BitcoinPostforkBlock;
- + }
- +
- connman.PushMessage(pfrom, msgMaker.Make(NetMsgType::GETHEADERS,
- chainActive.GetLocator(
- pindexBestHeader),
- - uint256()));
- + stop_hash));
- LogPrint("net", "received header %s: missing prev block %s, "
- "sending getheaders (%d) to end (peer=%d, "
- "nUnconnectingHeaders=%d)\n",
- @@ -2687,13 +2710,24 @@ static bool ProcessMessage(const Config &config, CNode *pfrom,
- CValidationState state;
- if (!ProcessNewBlockHeaders(config, headers, state, &pindexLast)) {
- + if (fCDYBootstrapping && pindexLast != nullptr) {
- + LogPrint("net", "though found invalid headers, continue with valid headers for CDY bootstrapping.\n");
- + }
- + else
- + {
- +
- int nDoS;
- - if (state.IsInvalid(nDoS)) {
- - if (nDoS > 0) {
- + if (state.IsInvalid(nDoS))
- + {
- + if (nDoS > 0)
- + {
- LOCK(cs_main);
- Misbehaving(pfrom, nDoS, state.GetRejectReason());
- }
- + //if(chainActive.Height()>config.GetChainParams().GetConsensus().cdyHeight)
- return error("invalid header received");
- + //else return true;
- + }
- }
- }
- @@ -2720,10 +2754,15 @@ static bool ProcessMessage(const Config &config, CNode *pfrom,
- "net",
- "more getheaders (%d) to end to peer=%d (startheight:%d)\n",
- pindexLast->nHeight, pfrom->id, pfrom->nStartingHeight);
- + uint256 stop_hash;
- + if (fCDYBootstrapping) {
- + stop_hash = chainparams.GetConsensus().BitcoinPostforkBlock;
- + }
- +
- connman.PushMessage(
- pfrom, msgMaker.Make(NetMsgType::GETHEADERS,
- chainActive.GetLocator(pindexLast),
- - uint256()));
- + stop_hash));
- }
- bool fCanDirectFetch = CanDirectFetch(chainparams.GetConsensus());
- @@ -2802,8 +2841,14 @@ static bool ProcessMessage(const Config &config, CNode *pfrom,
- else if (strCommand == NetMsgType::BLOCK && !fImporting &&
- !fReindex) // Ignore blocks received while importing
- {
- + // Deserialize in legacy format.
- + int legacy_block_flag = pfrom->IsLegacyBlockHeader(pfrom->GetRecvVersion()) ? SERIALIZE_BLOCK_LEGACY : 0;
- + int original_version = vRecv.GetVersion();
- + vRecv.SetVersion(original_version | legacy_block_flag);
- +
- std::shared_ptr<CBlock> pblock = std::make_shared<CBlock>();
- vRecv >> *pblock;
- + vRecv.SetVersion(original_version);
- LogPrint("net", "received block %s peer=%d\n",
- pblock->GetHash().ToString(), pfrom->id);
- @@ -3127,10 +3172,19 @@ bool ProcessMessages(const Config &config, CNode *pfrom, CConnman &connman,
- msg.SetVersion(pfrom->GetRecvVersion());
- + // This is a new peer. Before doing anything, we need to detect what magic
- + // the peer is using.
- + if (pfrom->nVersion == 0) {
- + if (memcmp(std::begin(msg.hdr.pchMessageStart), std::begin(chainparams.NetMagic()), CMessageHeader::MESSAGE_START_SIZE) == 0) {
- + pfrom->fUsesCDYMagic = true;
- + } else if (fCDYBootstrapping) {
- + // Allow to connect to Bitcoin clients when bootstrapping.
- + pfrom->fUsesCDYMagic = false;
- + }
- + }
- +
- // Scan for message start
- - if (memcmp(std::begin(msg.hdr.pchMessageStart),
- - std::begin(chainparams.NetMagic()),
- - CMessageHeader::MESSAGE_START_SIZE) != 0) {
- + if (memcmp(std::begin(msg.hdr.pchMessageStart), std::begin(pfrom->GetMagic(chainparams)), CMessageHeader::MESSAGE_START_SIZE) != 0) {
- LogPrintf("PROCESSMESSAGE: INVALID MESSAGESTART %s peer=%d\n",
- SanitizeString(msg.hdr.GetCommand()), pfrom->id);
- pfrom->fDisconnect = true;
- @@ -3139,7 +3193,7 @@ bool ProcessMessages(const Config &config, CNode *pfrom, CConnman &connman,
- // Read header
- CMessageHeader &hdr = msg.hdr;
- - if (!hdr.IsValid(chainparams.NetMagic())) {
- + if (!hdr.IsValid(pfrom->GetMagic(chainparams))) {
- LogPrintf("PROCESSMESSAGE: ERRORS IN HEADER %s peer=%d\n",
- SanitizeString(hdr.GetCommand()), pfrom->id);
- return fMoreWork;
- @@ -3355,10 +3409,9 @@ bool SendMessages(const Config &config, CNode *pto, CConnman &connman,
- LogPrint("net",
- "initial getheaders (%d) to peer=%d (startheight:%d)\n",
- pindexStart->nHeight, pto->id, pto->nStartingHeight);
- - connman.PushMessage(
- - pto,
- - msgMaker.Make(NetMsgType::GETHEADERS,
- - chainActive.GetLocator(pindexStart), uint256()));
- + uint256 stop_hash;
- + if (fCDYBootstrapping) stop_hash = consensusParams.BitcoinPostforkBlock;
- + connman.PushMessage(pto, msgMaker.Make(NetMsgType::GETHEADERS, chainActive.GetLocator(pindexStart), stop_hash));
- }
- }
- @@ -3485,8 +3538,10 @@ bool SendMessages(const Config &config, CNode *pto, CConnman &connman,
- __func__, vHeaders.front().GetHash().ToString(),
- pto->id);
- }
- - connman.PushMessage(
- - pto, msgMaker.Make(NetMsgType::HEADERS, vHeaders));
- + int legacy_block_flag = pto->IsLegacyBlockHeader(pto->GetSendVersion()) ? SERIALIZE_BLOCK_LEGACY : 0;
- + connman.PushMessage(pto, msgMaker.Make(legacy_block_flag, NetMsgType::HEADERS, vHeaders));
- +
- +
- state.pindexBestHeaderSent = pBestIndex;
- } else {
- fRevertToInv = true;
- diff --git a/src/netbase.cpp b/src/netbase.cpp
- index ef116a4..8867720 100644
- --- a/src/netbase.cpp
- +++ b/src/netbase.cpp
- @@ -35,6 +35,8 @@ static proxyType nameProxy;
- static CCriticalSection cs_proxyInfos;
- int nConnectTimeout = DEFAULT_CONNECT_TIMEOUT;
- bool fNameLookup = DEFAULT_NAME_LOOKUP;
- +bool fSkipHardforkIBD = false;
- +bool fCDYBootstrapping = false;
- // Need ample time for negotiation for very slow proxies such as Tor
- // (milliseconds)
- diff --git a/src/netbase.h b/src/netbase.h
- index 762327b..fb11c98 100644
- --- a/src/netbase.h
- +++ b/src/netbase.h
- @@ -19,6 +19,8 @@
- extern int nConnectTimeout;
- extern bool fNameLookup;
- +extern bool fCDYBootstrapping;
- +extern bool fSkipHardforkIBD;
- //! -timeout default
- static const int DEFAULT_CONNECT_TIMEOUT = 5000;
- diff --git a/src/pow.cpp b/src/pow.cpp
- index 8ddbc45..3d92792 100644
- --- a/src/pow.cpp
- +++ b/src/pow.cpp
- @@ -11,11 +11,16 @@
- #include "chainparams.h"
- #include "config.h"
- #include "consensus/params.h"
- +//#include "chainparams.h"
- +#include "crypto/equihash.h"
- #include "primitives/block.h"
- +#include "streams.h"
- #include "uint256.h"
- #include "util.h"
- #include "validation.h"
- +unsigned int BitcoinGetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHeader *pblock, const Consensus::Params& params);
- +
- /**
- * Compute the next required proof of work using the legacy Bitcoin difficulty
- * adjustment + Emergency Difficulty Adjustment (EDA).
- @@ -34,12 +39,12 @@ static uint32_t GetNextEDAWorkRequired(const CBlockIndex *pindexPrev,
- const CBlockIndex *pindexFirst = pindexPrev->GetAncestor(nHeightFirst);
- assert(pindexFirst);
- - return CalculateNextWorkRequired(pindexPrev,
- - pindexFirst->GetBlockTime(), config);
- + return CalculateBCCNextWorkRequired(pindexPrev,
- + pindexFirst->GetBlockTime(), params);
- }
- const uint32_t nProofOfWorkLimit =
- - UintToArith256(params.powLimit).GetCompact();
- + UintToArith256(params.PowLimit(false)).GetCompact();
- if (params.fPowAllowMinDifficultyBlocks) {
- // Special difficulty rule for testnet:
- @@ -95,75 +100,74 @@ static uint32_t GetNextEDAWorkRequired(const CBlockIndex *pindexPrev,
- uint32_t GetNextWorkRequired(const CBlockIndex *pindexPrev,
- const CBlockHeader *pblock, const Config &config) {
- const Consensus::Params ¶ms = config.GetChainParams().GetConsensus();
- -
- + assert(pindexPrev != nullptr);
- + int nHeight = pindexPrev->nHeight + 1;
- + bool postfork = nHeight >= params.cdyHeight;
- + unsigned int nProofOfWorkLimit = UintToArith256(params.PowLimit(postfork)).GetCompact();
- // Genesis block
- if (pindexPrev == nullptr) {
- return UintToArith256(params.powLimit).GetCompact();
- }
- - // Special rule for regtest: we never retarget.
- - if (params.fPowNoRetargeting) {
- - return pindexPrev->nBits;
- - }
- -
- + if (postfork == false) {
- + // LogPrintf("Before hard fork, get bitcoin NextWorkRequired.\n");
- if (IsDAAEnabled(config, pindexPrev)) {
- return GetNextCashWorkRequired(pindexPrev, pblock, config);
- }
- -
- + else if (IsUAHFenabled(config, pindexPrev))
- return GetNextEDAWorkRequired(pindexPrev, pblock, config);
- + else
- + return BitcoinGetNextWorkRequired(pindexPrev, pblock, params);
- + }
- + else if (nHeight< params.cdyHeight + params.nPowAveragingWindow) //Yang our fork start with small pow
- + {
- + return nProofOfWorkLimit;
- }
- -uint32_t CalculateNextWorkRequired(const CBlockIndex *pindexPrev,
- - int64_t nFirstBlockTime,
- - const Config &config) {
- - const Consensus::Params ¶ms = config.GetChainParams().GetConsensus();
- -
- + // Special rule for regtest: we never retarget.
- if (params.fPowNoRetargeting) {
- return pindexPrev->nBits;
- }
- - // Limit adjustment step
- - int64_t nActualTimespan = pindexPrev->GetBlockTime() - nFirstBlockTime;
- - if (nActualTimespan < params.nPowTargetTimespan / 4) {
- - nActualTimespan = params.nPowTargetTimespan / 4;
- + const CBlockIndex* pindexFirst = pindexPrev;
- + arith_uint256 bnTot {0};
- + for (int i = 0; pindexFirst && i < params.nPowAveragingWindow; i++) {
- + arith_uint256 bnTmp;
- + bnTmp.SetCompact(pindexFirst->nBits);
- + bnTot += bnTmp;
- + pindexFirst = pindexFirst->pprev;
- }
- - if (nActualTimespan > params.nPowTargetTimespan * 4) {
- - nActualTimespan = params.nPowTargetTimespan * 4;
- - }
- + if (pindexFirst == NULL)
- + return nProofOfWorkLimit;
- - // Retarget
- - const arith_uint256 bnPowLimit = UintToArith256(params.powLimit);
- - arith_uint256 bnNew;
- - bnNew.SetCompact(pindexPrev->nBits);
- - bnNew *= nActualTimespan;
- - bnNew /= params.nPowTargetTimespan;
- + arith_uint256 bnAvg {bnTot / params.nPowAveragingWindow};
- - if (bnNew > bnPowLimit) bnNew = bnPowLimit;
- - return bnNew.GetCompact();
- + return CalculateNextWorkRequired(bnAvg, pindexPrev->GetMedianTimePast(), pindexFirst->GetMedianTimePast(), params);
- }
- -bool CheckProofOfWork(uint256 hash, uint32_t nBits, const Config &config) {
- - bool fNegative;
- - bool fOverflow;
- - arith_uint256 bnTarget;
- +unsigned int CalculateNextWorkRequired(arith_uint256 bnAvg, int64_t nLastBlockTime, int64_t nFirstBlockTime, const Consensus::Params& params)
- +{
- - bnTarget.SetCompact(nBits, &fNegative, &fOverflow);
- + // Limit adjustment
- + int64_t nActualTimespan = nLastBlockTime - nFirstBlockTime;
- - // Check range
- - if (fNegative || bnTarget == 0 || fOverflow ||
- - bnTarget >
- - UintToArith256(config.GetChainParams().GetConsensus().powLimit)) {
- - return false;
- - }
- + if (nActualTimespan < params.MinActualTimespan())
- + nActualTimespan = params.MinActualTimespan();
- + if (nActualTimespan > params.MaxActualTimespan())
- + nActualTimespan = params.MaxActualTimespan();
- - // Check proof of work matches claimed amount
- - if (UintToArith256(hash) > bnTarget) {
- - return false;
- - }
- + // Retarget
- + const arith_uint256 bnPowLimit = UintToArith256(params.PowLimit(true));
- + arith_uint256 bnNew {bnAvg};
- + bnNew /= params.AveragingWindowTimespan();
- + bnNew *= nActualTimespan;
- - return true;
- + if (bnNew > bnPowLimit)
- + bnNew = bnPowLimit;
- +
- + return bnNew.GetCompact();
- }
- /**
- @@ -288,3 +292,140 @@ uint32_t GetNextCashWorkRequired(const CBlockIndex *pindexPrev,
- return nextTarget.GetCompact();
- }
- +
- +// Depricated for Bitcoin Cash X
- +unsigned int CalculateBCCNextWorkRequired(const CBlockIndex* pindexLast, int64_t nFirstBlockTime, const Consensus::Params& params)
- +{
- + if (params.fPowNoRetargeting)
- + return pindexLast->nBits;
- +
- +
- + // Limit adjustment step
- + int64_t nActualTimespan = pindexLast->GetBlockTime() - nFirstBlockTime;
- + if (nActualTimespan < params.nPowTargetTimespanLegacy / 4) {
- + nActualTimespan = params.nPowTargetTimespanLegacy / 4;
- + }
- +
- + if (nActualTimespan > params.nPowTargetTimespanLegacy * 4) {
- + nActualTimespan = params.nPowTargetTimespanLegacy * 4;
- + }
- +
- + // Retarget
- + const arith_uint256 bnPowLimit = UintToArith256(params.powLimitLegacy);
- + arith_uint256 bnNew;
- + bnNew.SetCompact(pindexLast->nBits);
- + bnNew *= nActualTimespan;
- + bnNew /= params.nPowTargetTimespanLegacy;
- +
- + if (bnNew > bnPowLimit) bnNew = bnPowLimit;
- + return bnNew.GetCompact();
- +}
- +
- +bool CheckEquihashSolution(const CBlockHeader *pblock, const CChainParams& params)
- +{
- + unsigned int n = params.EquihashN();
- + unsigned int k = params.EquihashK();
- +
- + // Hash state
- + crypto_generichash_blake2b_state state;
- + EhInitialiseState(n, k, state);
- +
- + // I = the block header minus nonce and solution.
- + CEquihashInput I{*pblock};
- + // I||V
- + CDataStream ss(SER_NETWORK, PROTOCOL_VERSION);
- + ss << I;
- + ss << pblock->nNonce;
- +
- + // H(I||V||...
- + crypto_generichash_blake2b_update(&state, (unsigned char*)&ss[0], ss.size());
- +
- + bool isValid;
- + EhIsValidSolution(n, k, state, pblock->nSolution, isValid);
- + if (!isValid)
- + return error("CheckEquihashSolution(): invalid solution");
- +
- + return true;
- +}
- +
- +bool CheckProofOfWork(uint256 hash, uint32_t nBits, bool postfork, const Config &config) {
- + const Consensus::Params ¶ms = config.GetChainParams().GetConsensus();
- + bool fNegative;
- + bool fOverflow;
- + arith_uint256 bnTarget;
- +
- + bnTarget.SetCompact(nBits, &fNegative, &fOverflow);
- + // if (postfork) printf("Params hash :%s\n", hash.GetHex().c_str());
- + // Check range
- + if (fNegative || bnTarget == 0 || fOverflow || bnTarget > UintToArith256(params.PowLimit(postfork)))
- + return false;
- +
- + // Check proof of work matches claimed amount
- + if (UintToArith256(hash) > bnTarget)
- + return false;
- +
- + return true;
- +}
- +
- +// Depricated for Bitcoin CDY
- +unsigned int BitcoinCalculateNextWorkRequired(const CBlockIndex* pindexLast, int64_t nFirstBlockTime, const Consensus::Params& params)
- +{
- + if (params.fPowNoRetargeting)
- + return pindexLast->nBits;
- +
- + // Limit adjustment step
- + int64_t nActualTimespan = pindexLast->GetBlockTime() - nFirstBlockTime;
- + if (nActualTimespan < params.nPowTargetTimespanLegacy/4)
- + nActualTimespan = params.nPowTargetTimespanLegacy/4;
- + if (nActualTimespan > params.nPowTargetTimespanLegacy*4)
- + nActualTimespan = params.nPowTargetTimespanLegacy*4;
- +
- + // Retarget
- + const arith_uint256 bnPowLimit = UintToArith256(params.PowLimit(false));
- + arith_uint256 bnNew;
- + bnNew.SetCompact(pindexLast->nBits);
- + bnNew *= nActualTimespan;
- + bnNew /= params.nPowTargetTimespanLegacy;
- +
- + if (bnNew > bnPowLimit)
- + bnNew = bnPowLimit;
- +
- + return bnNew.GetCompact();
- +}
- +
- +// Deprecated for Bitcoin CDY
- +unsigned int BitcoinGetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHeader *pblock, const Consensus::Params& params)
- +{
- + assert(pindexLast != nullptr);
- + unsigned int nProofOfWorkLimit = UintToArith256(params.PowLimit(false)).GetCompact();
- +
- + // Only change once per difficulty adjustment interval
- + if ((pindexLast->nHeight+1) % params.DifficultyAdjustmentInterval() != 0)
- + {
- + if (params.fPowAllowMinDifficultyBlocks)
- + {
- + // Special difficulty rule for testnet:
- + // If the new block's timestamp is more than 2* 10 minutes
- + // then allow mining of a min-difficulty block.
- + if (pblock->GetBlockTime() > pindexLast->GetBlockTime() + params.nPowTargetSpacing*2)
- + return nProofOfWorkLimit;
- + else
- + {
- + // Return the last non-special-min-difficulty-rules-block
- + const CBlockIndex* pindex = pindexLast;
- + while (pindex->pprev && pindex->nHeight % params.DifficultyAdjustmentInterval() != 0 && pindex->nBits == nProofOfWorkLimit)
- + pindex = pindex->pprev;
- + return pindex->nBits;
- + }
- + }
- + return pindexLast->nBits;
- + }
- +
- + // Go back by what we want to be 14 days worth of blocks
- + int nHeightFirst = pindexLast->nHeight - (params.DifficultyAdjustmentInterval()-1);
- + assert(nHeightFirst >= 0);
- + const CBlockIndex* pindexFirst = pindexLast->GetAncestor(nHeightFirst);
- + assert(pindexFirst);
- +
- + return BitcoinCalculateNextWorkRequired(pindexLast, pindexFirst->GetBlockTime(), params);
- +}
- diff --git a/src/pow.h b/src/pow.h
- index d7a7cab..9ac72cf 100644
- --- a/src/pow.h
- +++ b/src/pow.h
- @@ -5,6 +5,8 @@
- #ifndef BITCOIN_POW_H
- #define BITCOIN_POW_H
- +#include "arith_uint256.h"
- +#include "consensus/params.h"
- #include <cstdint>
- @@ -12,18 +14,22 @@ class CBlockHeader;
- class CBlockIndex;
- class Config;
- class uint256;
- +class CChainParams;
- uint32_t GetNextWorkRequired(const CBlockIndex *pindexPrev,
- const CBlockHeader *pblock, const Config &config);
- -uint32_t CalculateNextWorkRequired(const CBlockIndex *pindexPrev,
- - int64_t nFirstBlockTime,
- - const Config &config);
- +unsigned int CalculateNextWorkRequired(arith_uint256 bnAvg, int64_t nLastBlockTime, int64_t nFirstBlockTime, const Consensus::Params& params);
- +
- +/** Check whether the Equihash solution in a block header is valid */
- +bool CheckEquihashSolution(const CBlockHeader *pblock, const CChainParams&);
- +
- +unsigned int CalculateBCCNextWorkRequired(const CBlockIndex* pindexLast, int64_t nFirstBlockTime, const Consensus::Params& params);
- /**
- * Check whether a block hash satisfies the proof-of-work requirement specified
- * by nBits
- */
- -bool CheckProofOfWork(uint256 hash, uint32_t nBits, const Config &config);
- +bool CheckProofOfWork(uint256 hash, uint32_t nBits, bool postfork, const Config &config);
- /**
- * Bitcoin cash's difficulty adjustment mechanism.
- diff --git a/src/primitives/block.cpp b/src/primitives/block.cpp
- index 7a3b249..2fe7270 100644
- --- a/src/primitives/block.cpp
- +++ b/src/primitives/block.cpp
- @@ -5,22 +5,39 @@
- #include "primitives/block.h"
- +#include "chainparams.h"
- +#include "consensus/params.h"
- #include "crypto/common.h"
- #include "hash.h"
- #include "tinyformat.h"
- #include "utilstrencodings.h"
- +uint256 CBlockHeader::GetHash(const Consensus::Params& params) const
- +{
- + int version;
- + if (nHeight >= (uint32_t)params.cdyHeight) {
- + version = PROTOCOL_VERSION;
- + } else {
- + version = PROTOCOL_VERSION | SERIALIZE_BLOCK_LEGACY;
- + }
- + CHashWriter writer(SER_GETHASH, version);
- + ::Serialize(writer, *this);
- + return writer.GetHash();
- +}
- uint256 CBlockHeader::GetHash() const {
- - return SerializeHash(*this);
- + const Consensus::Params& consensusParams = Params().GetConsensus();
- + return GetHash(consensusParams);
- }
- std::string CBlock::ToString() const {
- std::stringstream s;
- - s << strprintf("CBlock(hash=%s, ver=0x%08x, hashPrevBlock=%s, "
- - "hashMerkleRoot=%s, nTime=%u, nBits=%08x, nNonce=%u, "
- - "vtx=%u)\n",
- - GetHash().ToString(), nVersion, hashPrevBlock.ToString(),
- - hashMerkleRoot.ToString(), nTime, nBits, nNonce, vtx.size());
- + s << strprintf("CBlock(hash=%s, ver=0x%08x, hashPrevBlock=%s, hashMerkleRoot=%s, nHeight=%u, nTime=%u, nBits=%08x, nNonce=%s, vtx=%u)\n",
- + GetHash().ToString(),
- + nVersion,
- + hashPrevBlock.ToString(),
- + hashMerkleRoot.ToString(),
- + nHeight, nTime, nBits, nNonce.GetHex(),
- + vtx.size());
- for (unsigned int i = 0; i < vtx.size(); i++) {
- s << " " << vtx[i]->ToString() << "\n";
- }
- diff --git a/src/primitives/block.h b/src/primitives/block.h
- index c594a97..ea44e47 100644
- --- a/src/primitives/block.h
- +++ b/src/primitives/block.h
- @@ -6,9 +6,18 @@
- #ifndef BITCOIN_PRIMITIVES_BLOCK_H
- #define BITCOIN_PRIMITIVES_BLOCK_H
- +#include "arith_uint256.h"
- #include "primitives/transaction.h"
- #include "serialize.h"
- #include "uint256.h"
- +#include "version.h"
- +#include <string.h>
- +
- +namespace Consensus {
- + struct Params;
- +};
- +
- +static const int SERIALIZE_BLOCK_LEGACY = 0x04000000;
- /**
- * Nodes collect new transactions into a block, hash them into a hash tree, and
- @@ -21,12 +30,16 @@
- class CBlockHeader {
- public:
- // header
- + static const size_t HEADER_SIZE = 4+32+32+4+4+4; // Excluding Equihash solution
- int32_t nVersion;
- uint256 hashPrevBlock;
- uint256 hashMerkleRoot;
- + uint32_t nHeight;
- + uint32_t nReserved[7];
- uint32_t nTime;
- uint32_t nBits;
- - uint32_t nNonce;
- + uint256 nNonce;
- + std::vector<unsigned char> nSolution; // Equihash solution.
- CBlockHeader() { SetNull(); }
- @@ -34,26 +47,44 @@ public:
- template <typename Stream, typename Operation>
- inline void SerializationOp(Stream &s, Operation ser_action) {
- + bool new_format = !(s.GetVersion() & SERIALIZE_BLOCK_LEGACY);
- READWRITE(this->nVersion);
- READWRITE(hashPrevBlock);
- READWRITE(hashMerkleRoot);
- + if (new_format) {
- + READWRITE(nHeight);
- + for(size_t i = 0; i < (sizeof(nReserved) / sizeof(nReserved[0])); i++) {
- + READWRITE(nReserved[i]);
- + }
- + }
- READWRITE(nTime);
- READWRITE(nBits);
- + if (new_format) {
- READWRITE(nNonce);
- + READWRITE(nSolution);
- + } else {
- + uint32_t legacy_nonce = (uint32_t)nNonce.GetUint64(0);
- + READWRITE(legacy_nonce);
- + nNonce = ArithToUint256(arith_uint256(legacy_nonce));
- + }
- }
- void SetNull() {
- nVersion = 0;
- hashPrevBlock.SetNull();
- hashMerkleRoot.SetNull();
- + nHeight = 0;
- + memset(nReserved, 0, sizeof(nReserved));
- nTime = 0;
- nBits = 0;
- - nNonce = 0;
- + nNonce.SetNull();
- + nSolution.clear();
- }
- bool IsNull() const { return (nBits == 0); }
- uint256 GetHash() const;
- + uint256 GetHash(const Consensus::Params& params) const;
- int64_t GetBlockTime() const { return (int64_t)nTime; }
- };
- @@ -92,14 +123,45 @@ public:
- block.nVersion = nVersion;
- block.hashPrevBlock = hashPrevBlock;
- block.hashMerkleRoot = hashMerkleRoot;
- + block.nHeight = nHeight;
- + memcpy(block.nReserved, nReserved, sizeof(block.nReserved));
- block.nTime = nTime;
- block.nBits = nBits;
- block.nNonce = nNonce;
- + block.nSolution = nSolution;
- return block;
- }
- std::string ToString() const;
- };
- +/**
- + * Custom serializer for CBlockHeader that omits the nonce and solution, for use
- + * as input to Equihash.
- + */
- +class CEquihashInput : private CBlockHeader
- +{
- +public:
- + CEquihashInput(const CBlockHeader &header)
- + {
- + CBlockHeader::SetNull();
- + *((CBlockHeader*)this) = header;
- + }
- +
- + ADD_SERIALIZE_METHODS;
- +
- + template <typename Stream, typename Operation>
- + inline void SerializationOp(Stream& s, Operation ser_action) {
- + READWRITE(this->nVersion);
- + READWRITE(hashPrevBlock);
- + READWRITE(hashMerkleRoot);
- + READWRITE(nHeight);
- + for(size_t i = 0; i < (sizeof(nReserved) / sizeof(nReserved[0])); i++) {
- + READWRITE(nReserved[i]);
- + }
- + READWRITE(nTime);
- + READWRITE(nBits);
- + }
- +};
- /**
- * Describes a place in the block chain to another node such that if the other
- diff --git a/src/primitives/transaction.cpp b/src/primitives/transaction.cpp
- index 9c23f89..e599b3c 100644
- --- a/src/primitives/transaction.cpp
- +++ b/src/primitives/transaction.cpp
- @@ -48,9 +48,9 @@ CTxOut::CTxOut(const Amount &nValueIn, CScript scriptPubKeyIn) {
- }
- std::string CTxOut::ToString() const {
- - return strprintf("CTxOut(nValue=%d.%08d, scriptPubKey=%s)",
- - nValue.GetSatoshis() / COIN.GetSatoshis(),
- - nValue.GetSatoshis() % COIN.GetSatoshis(),
- + return strprintf("CTxOut(nValue=%d.%05d, scriptPubKey=%s)",
- + nValue.GetSatoshis() / (COIN.GetSatoshis() / COIN_MULTIPLE),
- + nValue.GetSatoshis() % (COIN.GetSatoshis() / COIN_MULTIPLE),
- HexStr(scriptPubKey).substr(0, 30));
- }
- diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp
- index 86173c9..69d70fa 100644
- --- a/src/rpc/blockchain.cpp
- +++ b/src/rpc/blockchain.cpp
- @@ -12,6 +12,7 @@
- #include "coins.h"
- #include "config.h"
- #include "consensus/validation.h"
- +#include "consensus/params.h"
- #include "hash.h"
- #include "policy/policy.h"
- #include "primitives/transaction.h"
- @@ -56,13 +57,49 @@ static double GetDifficultyFromBits(uint32_t nBits) {
- return dDiff;
- }
- +double GetDifficultyINTERNAL(const CBlockIndex* blockindex)
- +{
- + // Floating point number that is a multiple of the minimum difficulty,
- + // minimum difficulty = 1.0.
- +
- + uint32_t bits = blockindex->nBits;
- +
- + uint32_t powLimit =
- + UintToArith256(Params().GetConsensus().powLimit).GetCompact();
- + int nShift = (bits >> 24) & 0xff;
- + int nShiftAmount = (powLimit >> 24) & 0xff;
- +
- + double dDiff =
- + (double)(powLimit & 0x00ffffff) /
- + (double)(bits & 0x00ffffff);
- +
- + while (nShift < nShiftAmount)
- + {
- + dDiff *= 256.0;
- + nShift++;
- + }
- + while (nShift > nShiftAmount)
- + {
- + dDiff /= 256.0;
- + nShift--;
- + }
- +
- + return dDiff;
- +}
- +
- double GetDifficulty(const CBlockIndex *blockindex) {
- // Floating point number that is a multiple of the minimum difficulty,
- // minimum difficulty = 1.0.
- if (blockindex == nullptr) {
- + if (chainActive.Tip() == nullptr)
- return 1.0;
- + else
- + blockindex = chainActive.Tip();
- }
- + if (blockindex->nHeight >= Params().GetConsensus().cdyHeight) {
- + return GetDifficultyINTERNAL(blockindex);
- + }
- return GetDifficultyFromBits(blockindex->nBits);
- }
- @@ -83,7 +120,9 @@ UniValue blockheaderToJSON(const CBlockIndex *blockindex) {
- result.push_back(Pair("time", int64_t(blockindex->nTime)));
- result.push_back(
- Pair("mediantime", int64_t(blockindex->GetMedianTimePast())));
- - result.push_back(Pair("nonce", uint64_t(blockindex->nNonce)));
- + result.push_back(Pair("nonceUint32", (uint64_t)((uint32_t)blockindex->nNonce.GetUint64(0))));
- + result.push_back(Pair("nonce", blockindex->nNonce.GetHex()));
- + result.push_back(Pair("solution", HexStr(blockindex->nSolution)));
- result.push_back(Pair("bits", strprintf("%08x", blockindex->nBits)));
- result.push_back(Pair("difficulty", GetDifficulty(blockindex)));
- result.push_back(Pair("chainwork", blockindex->nChainWork.GetHex()));
- @@ -109,8 +148,9 @@ UniValue blockToJSON(const Config &config, const CBlock &block,
- confirmations = chainActive.Height() - blockindex->nHeight + 1;
- }
- result.push_back(Pair("confirmations", confirmations));
- - result.push_back(Pair(
- - "size", (int)::GetSerializeSize(block, SER_NETWORK, PROTOCOL_VERSION)));
- + const Consensus::Params& consensusParams = config.GetChainParams().GetConsensus();
- + int ser_flags = (blockindex->nHeight < consensusParams.cdyHeight) ? SERIALIZE_BLOCK_LEGACY : 0;
- + result.push_back(Pair("size", (int)::GetSerializeSize(block, SER_NETWORK, PROTOCOL_VERSION | ser_flags)));
- result.push_back(Pair("height", blockindex->nHeight));
- result.push_back(Pair("version", block.nVersion));
- result.push_back(Pair("versionHex", strprintf("%08x", block.nVersion)));
- @@ -127,9 +167,9 @@ UniValue blockToJSON(const Config &config, const CBlock &block,
- }
- result.push_back(Pair("tx", txs));
- result.push_back(Pair("time", block.GetBlockTime()));
- - result.push_back(
- - Pair("mediantime", int64_t(blockindex->GetMedianTimePast())));
- - result.push_back(Pair("nonce", uint64_t(block.nNonce)));
- + result.push_back(Pair("mediantime", (int64_t)blockindex->GetMedianTimePast()));
- + result.push_back(Pair("nonceUint32", (uint64_t)((uint32_t)block.nNonce.GetUint64(0))));
- + result.push_back(Pair("nonce", block.nNonce.GetHex()));
- result.push_back(Pair("bits", strprintf("%08x", block.nBits)));
- result.push_back(Pair("difficulty", GetDifficulty(blockindex)));
- result.push_back(Pair("chainwork", blockindex->nChainWork.GetHex()));
- @@ -691,8 +731,8 @@ UniValue getblockheader(const Config &config, const JSONRPCRequest &request) {
- "blockheader <hash>.\n"
- "\nArguments:\n"
- "1. \"hash\" (string, required) The block hash\n"
- - "2. verbose (boolean, optional, default=true) true for a "
- - "json object, false for the hex encoded data\n"
- + "2. \"verbose\" (boolean, optional, default=true) true for a json object, false for the hex encoded data\n"
- + "3. \"legacy\" (boolean, optional, default=false) indicates if the block should be in legacy format\n"
- "\nResult (for verbose = true):\n"
- "{\n"
- " \"hash\" : \"hash\", (string) the block hash (same as "
- @@ -736,8 +776,12 @@ UniValue getblockheader(const Config &config, const JSONRPCRequest &request) {
- uint256 hash(uint256S(strHash));
- bool fVerbose = true;
- - if (request.params.size() > 1) {
- + if (!request.params[1].isNull())
- fVerbose = request.params[1].get_bool();
- +
- + bool legacy_format = false;
- + if (request.params.size() == 3 && request.params[2].get_bool() == true) {
- + legacy_format = true;
- }
- if (mapBlockIndex.count(hash) == 0) {
- @@ -747,7 +791,8 @@ UniValue getblockheader(const Config &config, const JSONRPCRequest &request) {
- CBlockIndex *pblockindex = mapBlockIndex[hash];
- if (!fVerbose) {
- - CDataStream ssBlock(SER_NETWORK, PROTOCOL_VERSION);
- + int ser_flags = legacy_format ? SERIALIZE_BLOCK_LEGACY : 0;
- + CDataStream ssBlock(SER_NETWORK, PROTOCOL_VERSION | ser_flags);
- ssBlock << pblockindex->GetBlockHeader();
- std::string strHex = HexStr(ssBlock.begin(), ssBlock.end());
- return strHex;
- @@ -758,18 +803,20 @@ UniValue getblockheader(const Config &config, const JSONRPCRequest &request) {
- UniValue getblock(const Config &config, const JSONRPCRequest &request) {
- if (request.fHelp || request.params.size() < 1 ||
- - request.params.size() > 2) {
- + request.params.size() > 3) {
- throw std::runtime_error(
- - "getblock \"blockhash\" ( verbose )\n"
- + "getblock \"blockhash\" ( verbose legacy )\n"
- "\nIf verbose is false, returns a string that is serialized, "
- "hex-encoded data for block 'hash'.\n"
- "If verbose is true, returns an Object with information about "
- "block <hash>.\n"
- "\nArguments:\n"
- "1. \"blockhash\" (string, required) The block hash\n"
- - "2. verbose (boolean, optional, default=true) true "
- - "for a json object, false for the hex encoded data\n"
- - "\nResult (for verbose = true):\n"
- + "2. \"verbosity\" (numeric, optional, default=1) 0 for hex encoded data, 1 for a json object, and 2 for json object with transaction data\n"
- + "3. \"legacy\" (boolean, optional, default=false) indicates if the block should be in legacy format\n"
- + "\nResult (for verbosity = 0):\n"
- + "\"data\" (string) A string that is serialized, hex-encoded data for block 'hash'.\n"
- + "\nResult (for verbosity = 1):\n"
- "{\n"
- " \"hash\" : \"hash\", (string) the block hash (same as "
- "provided)\n"
- @@ -814,22 +861,26 @@ UniValue getblock(const Config &config, const JSONRPCRequest &request) {
- std::string strHash = request.params[0].get_str();
- uint256 hash(uint256S(strHash));
- - bool fVerbose = true;
- - if (request.params.size() > 1) {
- - fVerbose = request.params[1].get_bool();
- + int verbosity = 1;
- + if (!request.params[1].isNull()) {
- + if(request.params[1].isNum())
- + verbosity = request.params[1].get_int();
- + else
- + verbosity = request.params[1].get_bool() ? 1 : 0;
- + }
- + bool legacy_format = false;
- + if (request.params.size() == 3 && request.params[2].get_bool() == true) {
- + legacy_format = true;
- }
- - if (mapBlockIndex.count(hash) == 0) {
- + if (mapBlockIndex.count(hash) == 0)
- throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Block not found");
- - }
- CBlock block;
- CBlockIndex *pblockindex = mapBlockIndex[hash];
- - if (fHavePruned && !(pblockindex->nStatus & BLOCK_HAVE_DATA) &&
- - pblockindex->nTx > 0) {
- + if (fHavePruned && !(pblockindex->nStatus & BLOCK_HAVE_DATA) && pblockindex->nTx > 0)
- throw JSONRPCError(RPC_MISC_ERROR, "Block not available (pruned data)");
- - }
- if (!ReadBlockFromDisk(block, pblockindex, config)) {
- // Block not found on disk. This could be because we have the block
- @@ -839,15 +890,15 @@ UniValue getblock(const Config &config, const JSONRPCRequest &request) {
- throw JSONRPCError(RPC_MISC_ERROR, "Block not found on disk");
- }
- - if (!fVerbose) {
- - CDataStream ssBlock(SER_NETWORK,
- - PROTOCOL_VERSION | RPCSerializationFlags());
- + if (verbosity <= 0) {
- + int ser_flags = legacy_format ? SERIALIZE_BLOCK_LEGACY : 0;
- + CDataStream ssBlock(SER_NETWORK, PROTOCOL_VERSION | ser_flags | RPCSerializationFlags());
- ssBlock << block;
- std::string strHex = HexStr(ssBlock.begin(), ssBlock.end());
- return strHex;
- }
- - return blockToJSON(config, block, pblockindex);
- + return blockToJSON(config, block, pblockindex, verbosity >= 2);
- }
- struct CCoinsStats {
- @@ -1629,9 +1680,9 @@ static const CRPCCommand commands[] = {
- { "blockchain", "getblockchaininfo", getblockchaininfo, true, {} },
- { "blockchain", "getbestblockhash", getbestblockhash, true, {} },
- { "blockchain", "getblockcount", getblockcount, true, {} },
- - { "blockchain", "getblock", getblock, true, {"blockhash","verbose"} },
- + { "blockchain", "getblock", getblock, true, {"blockhash","verbosity|verbose","legacy"} },
- { "blockchain", "getblockhash", getblockhash, true, {"height"} },
- - { "blockchain", "getblockheader", getblockheader, true, {"blockhash","verbose"} },
- + { "blockchain", "getblockheader", getblockheader, true, {"blockhash","verbose","legacy"} },
- { "blockchain", "getchaintips", getchaintips, true, {} },
- { "blockchain", "getdifficulty", getdifficulty, true, {} },
- { "blockchain", "getmempoolancestors", getmempoolancestors, true, {"txid","verbose"} },
- diff --git a/src/rpc/mining.cpp b/src/rpc/mining.cpp
- index dabb147..2902609 100644
- --- a/src/rpc/mining.cpp
- +++ b/src/rpc/mining.cpp
- @@ -11,6 +11,7 @@
- #include "consensus/params.h"
- #include "consensus/validation.h"
- #include "core_io.h"
- +#include "crypto/equihash.h"
- #include "dstencode.h"
- #include "init.h"
- #include "miner.h"
- @@ -114,6 +115,8 @@ static UniValue generateBlocks(const Config &config,
- int nGenerate, uint64_t nMaxTries,
- bool keepScript) {
- static const int nInnerLoopCount = 0x100000;
- + static const int nInnerLoopEquihashMask = 0xFFFF;
- + static const int nInnerLoopEquihashCount = 0xFFFF;
- int nHeightStart = 0;
- int nHeightEnd = 0;
- int nHeight = 0;
- @@ -128,11 +131,11 @@ static UniValue generateBlocks(const Config &config,
- unsigned int nExtraNonce = 0;
- UniValue blockHashes(UniValue::VARR);
- + const CChainParams& params = config.GetChainParams();
- + unsigned int n = params.EquihashN();
- + unsigned int k = params.EquihashK();
- while (nHeight < nHeightEnd) {
- - std::unique_ptr<CBlockTemplate> pblocktemplate(
- - BlockAssembler(config, Params())
- - .CreateNewBlock(coinbaseScript->reserveScript));
- -
- + std::unique_ptr<CBlockTemplate> pblocktemplate(BlockAssembler(config, Params()).CreateNewBlock(coinbaseScript->reserveScript));
- if (!pblocktemplate.get()) {
- throw JSONRPCError(RPC_INTERNAL_ERROR, "Couldn't create new block");
- }
- @@ -143,18 +146,60 @@ static UniValue generateBlocks(const Config &config,
- LOCK(cs_main);
- IncrementExtraNonce(config, pblock, chainActive.Tip(), nExtraNonce);
- }
- -
- - while (nMaxTries > 0 && pblock->nNonce < nInnerLoopCount &&
- - !CheckProofOfWork(pblock->GetHash(), pblock->nBits, config)) {
- - ++pblock->nNonce;
- + if (pblock->nHeight < (uint32_t)params.GetConsensus().cdyHeight) {
- + // Solve sha256d.
- + while (nMaxTries > 0 && (int)pblock->nNonce.GetUint64(0) < nInnerLoopCount &&
- + !CheckProofOfWork(pblock->GetHash(), pblock->nBits, false, config)) {
- + pblock->nNonce = ArithToUint256(UintToArith256(pblock->nNonce) + 1);
- + --nMaxTries;
- + }
- + } else {
- + // Solve Equihash.
- + crypto_generichash_blake2b_state eh_state;
- + EhInitialiseState(n, k, eh_state);
- +
- + // I = the block header minus nonce and solution.
- + CEquihashInput I{*pblock};
- + CDataStream ss(SER_NETWORK, PROTOCOL_VERSION);
- + ss << I;
- +
- + // H(I||...
- + crypto_generichash_blake2b_update(&eh_state, (unsigned char*)&ss[0], ss.size());
- +
- + while (nMaxTries > 0 &&
- + ((int)pblock->nNonce.GetUint64(0) & nInnerLoopEquihashMask) < nInnerLoopEquihashCount) {
- + // Yes, there is a chance every nonce could fail to satisfy the -regtest
- + // target -- 1 in 2^(2^256). That ain't gonna happen
- + pblock->nNonce = ArithToUint256(UintToArith256(pblock->nNonce) + 1);
- +
- + // H(I||V||...
- + crypto_generichash_blake2b_state curr_state;
- + curr_state = eh_state;
- + crypto_generichash_blake2b_update(&curr_state,
- + pblock->nNonce.begin(),
- + pblock->nNonce.size());
- +
- + // (x_1, x_2, ...) = A(I, V, n, k)
- + std::function<bool(std::vector<unsigned char>)> validBlock =
- + [&config,&pblock](std::vector<unsigned char> soln) {
- + pblock->nSolution = soln;
- + // TODO(h4x3rotab): Add metrics counter like Zcash? `solutionTargetChecks.increment();`
- + // TODO(h4x3rotab): Maybe switch to EhBasicSolve and better deal with `nMaxTries`?
- + return CheckProofOfWork(pblock->GetHash(), pblock->nBits, true, config);
- + };
- + bool found = EhBasicSolveUncancellable(n, k, curr_state, validBlock);
- --nMaxTries;
- + // TODO(h4x3rotab): Add metrics counter like Zcash? `ehSolverRuns.increment();`
- + if (found) {
- + break;
- + }
- + }
- }
- if (nMaxTries == 0) {
- break;
- }
- -
- - if (pblock->nNonce == nInnerLoopCount) {
- + if ((int)pblock->nNonce.GetUint64(0) == nInnerLoopCount) {
- continue;
- }
- @@ -526,18 +571,16 @@ static UniValue getblocktemplate(const Config &config,
- }
- lpval = find_value(oparam, "longpollid");
- - if (strMode == "proposal") {
- + if (strMode == "proposal" || strMode == "proposal_legacy")
- + {
- const UniValue &dataval = find_value(oparam, "data");
- - if (!dataval.isStr()) {
- - throw JSONRPCError(RPC_TYPE_ERROR,
- - "Missing data String key for proposal");
- - }
- + if (!dataval.isStr())
- + throw JSONRPCError(RPC_TYPE_ERROR, "Missing data String key for proposal");
- CBlock block;
- - if (!DecodeHexBlk(block, dataval.get_str())) {
- - throw JSONRPCError(RPC_DESERIALIZATION_ERROR,
- - "Block decode failed");
- - }
- + bool legacy_format = (strMode == "proposal_legacy");
- + if (!DecodeHexBlk(block, dataval.get_str(), legacy_format))
- + throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "Block decode failed");
- uint256 hash = block.GetHash();
- BlockMap::iterator mi = mapBlockIndex.find(hash);
- @@ -554,9 +597,10 @@ static UniValue getblocktemplate(const Config &config,
- CBlockIndex *const pindexPrev = chainActive.Tip();
- // TestBlockValidity only supports blocks built on the current Tip
- - if (block.hashPrevBlock != pindexPrev->GetBlockHash()) {
- + if (block.hashPrevBlock != pindexPrev->GetBlockHash())
- return "inconclusive-not-best-prevblk";
- - }
- + if (!legacy_format && block.nHeight != (uint32_t)pindexPrev->nHeight + 1)
- + return "inconclusive-bad-height";
- CValidationState state;
- TestBlockValidity(config, state, block, pindexPrev, false, true);
- return BIP22ValidationResult(config, state);
- @@ -683,7 +727,8 @@ static UniValue getblocktemplate(const Config &config,
- // Update nTime
- UpdateTime(pblock, config, pindexPrev);
- - pblock->nNonce = 0;
- + pblock->nNonce = uint256();
- + pblock->nSolution.clear();
- UniValue aCaps(UniValue::VARR);
- aCaps.push_back("proposal");
- @@ -855,7 +900,7 @@ protected:
- static UniValue submitblock(const Config &config,
- const JSONRPCRequest &request) {
- if (request.fHelp || request.params.size() < 1 ||
- - request.params.size() > 2) {
- + request.params.size() > 3) {
- throw std::runtime_error(
- "submitblock \"hexdata\" ( \"jsonparametersobject\" )\n"
- "\nAttempts to submit new block to network.\n"
- @@ -863,14 +908,9 @@ static UniValue submitblock(const Config &config,
- "See https://en.bitcoin.it/wiki/BIP_0022 for full specification.\n"
- "\nArguments\n"
- - "1. \"hexdata\" (string, required) the hex-encoded block "
- - "data to submit\n"
- - "2. \"parameters\" (string, optional) object of optional "
- - "parameters\n"
- - " {\n"
- - " \"workid\" : \"id\" (string, optional) if the server "
- - "provided a workid, it MUST be included with submissions\n"
- - " }\n"
- + "1. \"hexdata\" (string, required) the hex-encoded block data to submit\n"
- + "2. \"dummy\" (optional) dummy value, for compatibility with BIP22. This value is ignored.\n"
- + "3. \"legacy\" (boolean, optional) indicates if the block is in legacy foramt. default: false.\n"
- "\nResult:\n"
- "\nExamples:\n" +
- HelpExampleCli("submitblock", "\"mydata\"") +
- @@ -879,7 +919,11 @@ static UniValue submitblock(const Config &config,
- std::shared_ptr<CBlock> blockptr = std::make_shared<CBlock>();
- CBlock &block = *blockptr;
- - if (!DecodeHexBlk(block, request.params[0].get_str())) {
- + bool legacy_format = false;
- + if (request.params.size() == 3 && request.params[2].get_bool() == true) {
- + legacy_format = true;
- + }
- + if (!DecodeHexBlk(block, request.params[0].get_str(), legacy_format)) {
- throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "Block decode failed");
- }
- @@ -925,6 +969,40 @@ static UniValue submitblock(const Config &config,
- return BIP22ValidationResult(config, sc.state);
- }
- +UniValue getblocksubsidy(const Config &config, const JSONRPCRequest& request)
- +{
- + if (request.fHelp || request.params.size() > 1)
- + throw std::runtime_error(
- + "getblocksubsidy height\n"
- + "\nReturns block subsidy reward of block at index provided.\n"
- + "\nArguments:\n"
- + "1. height (numeric, optional) The block height. If not provided, defaults to the current height of the chain.\n"
- + "\nResult:\n"
- + "{\n"
- + "\"miner\": n, (numeric) The mining reward amount in satoshis.\n"
- + "\"founders\": f, (numeric) Always 0, for Zcash mining compatibility.\n"
- + "}\n"
- + "\nExamples:\n"
- + + HelpExampleCli("getblocksubsidy", "1000")
- + + HelpExampleRpc("getblocksubsidy", "1000")
- + );
- +
- + RPCTypeCheck(request.params, {UniValue::VNUM});
- +
- + LOCK(cs_main);
- + int nHeight = (request.params.size() == 1) ? request.params[0].get_int() : chainActive.Height();
- + if (nHeight < 0)
- + throw JSONRPCError(RPC_INVALID_PARAMETER, "Block height out of range.");
- +
- + UniValue result(UniValue::VOBJ);
- +
- + CAmount nReward = GetBlockSubsidy(nHeight, config.GetChainParams().GetConsensus()).GetSatoshis();
- + result.push_back(Pair("miner", nReward));
- + result.push_back(Pair("founders", 0));
- +
- + return result;
- +}
- +
- static UniValue estimatefee(const Config &config,
- const JSONRPCRequest &request) {
- if (request.fHelp || request.params.size() != 1) {
- @@ -1011,7 +1089,7 @@ static UniValue estimatesmartfee(const Config &config,
- "\nResult:\n"
- "{\n"
- " \"feerate\" : x.x, (numeric) estimate fee-per-kilobyte (in "
- - "BCH)\n"
- + "CDY)\n"
- " \"blocks\" : n (numeric) block number where estimate "
- "was found\n"
- "}\n"
- @@ -1090,6 +1168,7 @@ static const CRPCCommand commands[] = {
- {"mining", "prioritisetransaction", prioritisetransaction, true, {"txid", "priority_delta", "fee_delta"}},
- {"mining", "getblocktemplate", getblocktemplate, true, {"template_request"}},
- {"mining", "submitblock", submitblock, true, {"hexdata", "parameters"}},
- + {"mining", "getblocksubsidy", getblocksubsidy, true, {"height"}},
- {"generating", "generate", generate, true, {"nblocks", "maxtries"}},
- {"generating", "generatetoaddress", generatetoaddress, true, {"nblocks", "address", "maxtries"}},
- diff --git a/src/rpc/server.cpp b/src/rpc/server.cpp
- index ace8bc3..a19d0b7 100644
- --- a/src/rpc/server.cpp
- +++ b/src/rpc/server.cpp
- @@ -114,7 +114,7 @@ Amount AmountFromValue(const UniValue &value) {
- throw JSONRPCError(RPC_TYPE_ERROR, "Amount is not a number or string");
- int64_t n;
- - if (!ParseFixedPoint(value.getValStr(), 8, &n))
- + if (!ParseFixedPoint(value.getValStr(), COIN_DECIMAL_COUNT, &n))
- throw JSONRPCError(RPC_TYPE_ERROR, "Invalid amount");
- Amount amt(n);
- @@ -127,9 +127,9 @@ UniValue ValueFromAmount(const Amount &amount) {
- int64_t amt = amount.GetSatoshis();
- bool sign = amt < 0;
- int64_t n_abs = (sign ? -amt : amt);
- - int64_t quotient = n_abs / COIN.GetSatoshis();
- - int64_t remainder = n_abs % COIN.GetSatoshis();
- - return UniValue(UniValue::VNUM, strprintf("%s%d.%08d", sign ? "-" : "",
- + int64_t quotient = n_abs / (COIN.GetSatoshis() / COIN_MULTIPLE);
- + int64_t remainder = n_abs % (COIN.GetSatoshis() / COIN_MULTIPLE);
- + return UniValue(UniValue::VNUM, strprintf("%s%d.%05d", sign ? "-" : "",
- quotient, remainder));
- }
- diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp
- index 78b2edb..acb4c36 100644
- --- a/src/script/interpreter.cpp
- +++ b/src/script/interpreter.cpp
- @@ -1348,11 +1348,16 @@ PrecomputedTransactionData::PrecomputedTransactionData(
- hashOutputs = GetOutputsHash(txTo);
- }
- +//modified SignatureHash by hmc
- uint256 SignatureHash(const CScript &scriptCode, const CTransaction &txTo,
- unsigned int nIn, uint32_t nHashType, const Amount amount,
- const PrecomputedTransactionData *cache, uint32_t flags) {
- + uint32_t nForkHashType = nHashType;
- if ((nHashType & SIGHASH_FORKID) &&
- (flags & SCRIPT_ENABLE_SIGHASH_FORKID)) {
- +
- + if(flags & SCRIPT_ENABLE_CHANGE_FORKID)
- + nForkHashType |= FORKID_IN_USE << 8;
- uint256 hashPrevouts;
- uint256 hashSequence;
- uint256 hashOutputs;
- @@ -1395,7 +1400,7 @@ uint256 SignatureHash(const CScript &scriptCode, const CTransaction &txTo,
- // Locktime
- ss << txTo.nLockTime;
- // Sighash type
- - ss << nHashType;
- + ss << nForkHashType;
- return ss.GetHash();
- }
- @@ -1421,7 +1426,7 @@ uint256 SignatureHash(const CScript &scriptCode, const CTransaction &txTo,
- // Serialize and hash
- CHashWriter ss(SER_GETHASH, 0);
- - ss << txTmp << nHashType;
- + ss << txTmp << nForkHashType;
- return ss.GetHash();
- }
- diff --git a/src/script/interpreter.h b/src/script/interpreter.h
- index 5d56c14..7eecafc 100644
- --- a/src/script/interpreter.h
- +++ b/src/script/interpreter.h
- @@ -27,6 +27,16 @@ enum {
- SIGHASH_ANYONECANPAY = 0x80,
- };
- +//add by hmc
- +/** Fork IDs **/
- +enum
- +{
- + FORKID_BCC = 0,
- + FORKID_CDY = 0x6f, // 111
- +};
- +//add by hmc
- +static const uint32_t FORKID_IN_USE = FORKID_CDY;
- +
- /** Script verification flags */
- enum {
- SCRIPT_VERIFY_NONE = 0,
- @@ -115,15 +125,18 @@ enum {
- // Do we accept signature using SIGHASH_FORKID
- //
- SCRIPT_ENABLE_SIGHASH_FORKID = (1U << 16),
- +
- + //add by hmc
- + SCRIPT_ENABLE_CHANGE_FORKID = (1U << 17),
- };
- bool CheckSignatureEncoding(const std::vector<uint8_t> &vchSig, uint32_t flags,
- ScriptError *serror);
- -
- +//modyfied by hmc
- uint256 SignatureHash(const CScript &scriptCode, const CTransaction &txTo,
- unsigned int nIn, uint32_t nHashType, const Amount amount,
- const PrecomputedTransactionData *cache = nullptr,
- - uint32_t flags = SCRIPT_ENABLE_SIGHASH_FORKID);
- + uint32_t flags = SCRIPT_ENABLE_SIGHASH_FORKID | SCRIPT_ENABLE_CHANGE_FORKID);
- class BaseSignatureChecker {
- public:
- diff --git a/src/script/sign.cpp b/src/script/sign.cpp
- index c46f7c6..f0fdf23 100644
- --- a/src/script/sign.cpp
- +++ b/src/script/sign.cpp
- @@ -163,7 +163,7 @@ bool ProduceSignature(const BaseSignatureCreator &creator,
- // Test solution
- return solved &&
- VerifyScript(sigdata.scriptSig, fromPubKey,
- - STANDARD_SCRIPT_VERIFY_FLAGS, creator.Checker());
- + STANDARD_SCRIPT_VERIFY_FLAGS | SCRIPT_ENABLE_CHANGE_FORKID, creator.Checker());
- }
- SignatureData DataFromTransaction(const CMutableTransaction &tx,
- diff --git a/src/script/standard.h b/src/script/standard.h
- index 8e39bf3..c6de050 100644
- --- a/src/script/standard.h
- +++ b/src/script/standard.h
- @@ -41,6 +41,7 @@ extern unsigned nMaxDatacarrierBytes;
- * details.
- */
- static const uint32_t MANDATORY_SCRIPT_VERIFY_FLAGS =
- + SCRIPT_ENABLE_CHANGE_FORKID |
- SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_STRICTENC |
- SCRIPT_ENABLE_SIGHASH_FORKID | SCRIPT_VERIFY_LOW_S | SCRIPT_VERIFY_NULLFAIL;
- diff --git a/src/seeder/bitcoin.cpp b/src/seeder/bitcoin.cpp
- index f2f1c23..e9b7744 100644
- --- a/src/seeder/bitcoin.cpp
- +++ b/src/seeder/bitcoin.cpp
- @@ -13,7 +13,7 @@
- bool fTestNet;
- // The network magic to use.
- -CMessageHeader::MessageMagic netMagic = {0xe3, 0xe1, 0xf3, 0xe8};
- +CMessageHeader::MessageMagic netMagic = {0xe3, 0xc3, 0xc4, 0xd9};
- #define BITCOIN_SEED_NONCE 0x0539a019ca550825ULL
- @@ -100,7 +100,7 @@ class CSeederNode {
- CAddress me(myService, ServiceFlags(NODE_NETWORK | NODE_BITCOIN_CASH));
- BeginMessage("version");
- int nBestHeight = GetRequireHeight();
- - std::string ver = "/bitcoin-cash-seeder:0.15/";
- + std::string ver = "/bitcoin-candy-seeder:0.16/";
- vSend << PROTOCOL_VERSION << nLocalServices << nTime << you << me
- << nLocalNonce << ver << nBestHeight;
- EndMessage();
- diff --git a/src/seeder/bitcoin.h b/src/seeder/bitcoin.h
- index f7b7dd1..aee16bb 100644
- --- a/src/seeder/bitcoin.h
- +++ b/src/seeder/bitcoin.h
- @@ -13,7 +13,7 @@
- */
- extern bool fTestNet;
- static inline unsigned short GetDefaultPort(const bool testnet = fTestNet) {
- - return testnet ? 18333 : 8333;
- + return testnet ? 18367 : 8367;
- }
- // The network magic to use.
- diff --git a/src/seeder/main.cpp b/src/seeder/main.cpp
- index 877b5ba..5a814a0 100644
- --- a/src/seeder/main.cpp
- +++ b/src/seeder/main.cpp
- @@ -441,12 +441,9 @@ extern "C" void *ThreadStats(void *) {
- }
- static const std::string mainnet_seeds[] = {
- - "seed.bitcoinabc.org", "seed-abc.bitcoinforks.org", "seed.bitprim.org",
- - "seed.deadalnix.me", "seeder.criptolayer.net", ""};
- + "s1.bitcoincandy.one", "s2.bitcoincandy.one", "s3.bitcoincandy.one", ""};
- static const std::string testnet_seeds[] = {
- - "testnet-seed.bitcoinabc.org", "testnet-seed-abc.bitcoinforks.org",
- - "testnet-seed.bitprim.org", "testnet-seed.deadalnix.me",
- - "testnet-seeder.criptolayer.net", ""};
- + "ts1.bitcoincandy.one", ""};
- static const std::string *seeds = mainnet_seeds;
- const static unsigned int MAX_HOSTS_PER_SEED = 128;
- @@ -507,9 +504,9 @@ int main(int argc, char **argv) {
- if (opts.fUseTestNet) {
- printf("Using testnet.\n");
- netMagic[0] = 0xf4;
- - netMagic[1] = 0xe5;
- - netMagic[2] = 0xf3;
- - netMagic[3] = 0xf4;
- + netMagic[1] = 0x43;
- + netMagic[2] = 0x44;
- + netMagic[3] = 0x59;
- seeds = testnet_seeds;
- fTestNet = true;
- }
- diff --git a/src/test/equihash_tests.cpp b/src/test/equihash_tests.cpp
- new file mode 100644
- index 0000000..b487d87
- diff --git a/src/txdb.cpp b/src/txdb.cpp
- index adf062d..dc9c36a 100644
- --- a/src/txdb.cpp
- +++ b/src/txdb.cpp
- @@ -250,13 +250,17 @@ bool CBlockTreeDB::LoadBlockIndexGuts(
- pindexNew->nUndoPos = diskindex.nUndoPos;
- pindexNew->nVersion = diskindex.nVersion;
- pindexNew->hashMerkleRoot = diskindex.hashMerkleRoot;
- + memcpy(pindexNew->nReserved, diskindex.nReserved, sizeof(pindexNew->nReserved));
- pindexNew->nTime = diskindex.nTime;
- pindexNew->nBits = diskindex.nBits;
- pindexNew->nNonce = diskindex.nNonce;
- + pindexNew->nSolution = diskindex.nSolution;
- pindexNew->nStatus = diskindex.nStatus;
- pindexNew->nTx = diskindex.nTx;
- - if (!CheckProofOfWork(pindexNew->GetBlockHash(), pindexNew->nBits,
- + // TODO(h4x3rotab): Check Equihash solution? Not sure why Zcash doesn't do it here.
- + bool postfork = pindexNew->nHeight >= (uint32_t)config.GetChainParams().GetConsensus().cdyHeight;
- + if (!CheckProofOfWork(pindexNew->GetBlockHash(), pindexNew->nBits, postfork,
- config)) {
- return error("LoadBlockIndex(): CheckProofOfWork failed: %s",
- pindexNew->ToString());
- diff --git a/src/univalue/gen/gen.cpp b/src/univalue/gen/gen.cpp
- deleted file mode 100644
- index 85fe209..0000000
- +++ /dev/null
- @@ -1,82 +0,0 @@
- -// Copyright 2014 BitPay Inc.
- -// Distributed under the MIT software license, see the accompanying
- -// file COPYING or http://www.opensource.org/licenses/mit-license.php.
- -
- -//
- -// To re-create univalue_escapes.h:
- -// $ g++ -o gen gen.cpp
- -// $ ./gen > univalue_escapes.h
- -//
- -
- -#include <stdio.h>
- -#include <string.h>
- -#include "univalue.h"
- -
- -static bool initEscapes;
- -static std::string escapes[256];
- -
- -static void initJsonEscape()
- -{
- - // Escape all lower control characters (some get overridden with smaller sequences below)
- - for (int ch=0x00; ch<0x20; ++ch) {
- - char tmpbuf[20];
- - snprintf(tmpbuf, sizeof(tmpbuf), "\\u%04x", ch);
- - escapes[ch] = std::string(tmpbuf);
- - }
- -
- - escapes[(int)'"'] = "\\\"";
- - escapes[(int)'\\'] = "\\\\";
- - escapes[(int)'\b'] = "\\b";
- - escapes[(int)'\f'] = "\\f";
- - escapes[(int)'\n'] = "\\n";
- - escapes[(int)'\r'] = "\\r";
- - escapes[(int)'\t'] = "\\t";
- - escapes[(int)'\x7f'] = "\\u007f"; // U+007F DELETE
- -
- - initEscapes = true;
- -}
- -
- -static void outputEscape()
- -{
- - printf( "// Automatically generated file. Do not modify.\n"
- - "#ifndef BITCOIN_UNIVALUE_UNIVALUE_ESCAPES_H\n"
- - "#define BITCOIN_UNIVALUE_UNIVALUE_ESCAPES_H\n"
- - "static const char *escapes[256] = {\n");
- -
- - for (unsigned int i = 0; i < 256; i++) {
- - if (escapes[i].empty()) {
- - printf("\tNULL,\n");
- - } else {
- - printf("\t\"");
- -
- - unsigned int si;
- - for (si = 0; si < escapes[i].size(); si++) {
- - char ch = escapes[i][si];
- - switch (ch) {
- - case '"':
- - printf("\\\"");
- - break;
- - case '\\':
- - printf("\\\\");
- - break;
- - default:
- - printf("%c", escapes[i][si]);
- - break;
- - }
- - }
- -
- - printf("\",\n");
- - }
- - }
- -
- - printf( "};\n"
- - "#endif // BITCOIN_UNIVALUE_UNIVALUE_ESCAPES_H\n");
- -}
- -
- -int main (int argc, char *argv[])
- -{
- - initJsonEscape();
- - outputEscape();
- - return 0;
- -}
- -
- diff --git a/src/util.cpp b/src/util.cpp
- index 2551ba4..bcd46a1 100644
- --- a/src/util.cpp
- +++ b/src/util.cpp
- @@ -88,8 +88,8 @@
- #include <openssl/conf.h>
- #include <openssl/rand.h>
- -const char *const BITCOIN_CONF_FILENAME = "bitcoin.conf";
- -const char *const BITCOIN_PID_FILENAME = "bitcoind.pid";
- +const char *const BITCOIN_CONF_FILENAME = "bitcoincandy.conf";
- +const char *const BITCOIN_PID_FILENAME = "bcandyd.pid";
- CCriticalSection cs_args;
- std::map<std::string, std::string> mapArgs;
- @@ -106,6 +106,9 @@ bool fLogIPs = DEFAULT_LOGIPS;
- std::atomic<bool> fReopenDebugLog(false);
- CTranslationInterface translationInterface;
- +/** Log categories bitfield. */
- +std::atomic<uint32_t> logCategories(0);
- +
- /** Init OpenSSL library multithreading support */
- static CCriticalSection **ppmutexOpenSSL;
- void locking_callback(int mode, int i, const char *file,
- @@ -460,7 +463,7 @@ boost::filesystem::path GetDefaultDataDir() {
- // Unix: ~/.bitcoin
- #ifdef WIN32
- // Windows
- - return GetSpecialFolderPath(CSIDL_APPDATA) / "Bitcoin";
- + return GetSpecialFolderPath(CSIDL_APPDATA) / "BitcoinCandy";
- #else
- fs::path pathRet;
- char *pszHome = getenv("HOME");
- @@ -470,10 +473,10 @@ boost::filesystem::path GetDefaultDataDir() {
- pathRet = fs::path(pszHome);
- #ifdef MAC_OSX
- // Mac
- - return pathRet / "Library/Application Support/Bitcoin";
- + return pathRet / "Library/Application Support/BitcoinCandy";
- #else
- // Unix
- - return pathRet / ".bitcoin";
- + return pathRet / ".bitcoincandy";
- #endif
- #endif
- }
- @@ -819,8 +822,8 @@ std::string CopyrightHolders(const std::string &strPrefix) {
- // Check for untranslated substitution to make sure Bitcoin ABC copyright
- // is not removed by accident.
- if (strprintf(COPYRIGHT_HOLDERS, COPYRIGHT_HOLDERS_SUBSTITUTION)
- - .find("Bitcoin ABC") == std::string::npos) {
- - strCopyrightHolders += "\n" + strPrefix + "The Bitcoin ABC developers";
- + .find("Bitcoin Candy") == std::string::npos) {
- + strCopyrightHolders += "\n" + strPrefix + "The Bitcoin Candy developers";
- }
- return strCopyrightHolders;
- }
- diff --git a/src/util.h b/src/util.h
- index 821dd3c..8f80a86 100644
- --- a/src/util.h
- +++ b/src/util.h
- @@ -54,6 +54,8 @@ extern CTranslationInterface translationInterface;
- extern const char *const BITCOIN_CONF_FILENAME;
- extern const char *const BITCOIN_PID_FILENAME;
- +extern std::atomic<uint32_t> logCategories;
- +
- /**
- * Translation function: Call Translate signal on UI interface, which returns a
- * boost::optional result. If no translation slot is registered, nothing is
- @@ -67,6 +69,40 @@ inline std::string _(const char *psz) {
- void SetupEnvironment();
- bool SetupNetworking();
- +namespace BCLog {
- + enum LogFlags : uint32_t {
- + NONE = 0,
- + NET = (1 << 0),
- + TOR = (1 << 1),
- + MEMPOOL = (1 << 2),
- + HTTP = (1 << 3),
- + BENCH = (1 << 4),
- + ZMQ = (1 << 5),
- + DB = (1 << 6),
- + RPC = (1 << 7),
- + ESTIMATEFEE = (1 << 8),
- + ADDRMAN = (1 << 9),
- + SELECTCOINS = (1 << 10),
- + REINDEX = (1 << 11),
- + CMPCTBLOCK = (1 << 12),
- + RAND = (1 << 13),
- + PRUNE = (1 << 14),
- + PROXY = (1 << 15),
- + MEMPOOLREJ = (1 << 16),
- + LIBEVENT = (1 << 17),
- + COINDB = (1 << 18),
- + QT = (1 << 19),
- + LEVELDB = (1 << 20),
- + POW = (1 << 30),
- + ALL = ~(uint32_t)0,
- + };
- +}
- +/** Return true if log accepts specified category */
- +static inline bool LogAcceptCategory(uint32_t category)
- +{
- + return (logCategories.load(std::memory_order_relaxed) & category) != 0;
- +}
- +
- /** Return true if log accepts specified category */
- bool LogAcceptCategory(const char *category);
- /** Send a string to the log output */
- diff --git a/src/utilmoneystr.cpp b/src/utilmoneystr.cpp
- index 596d236..5501742 100644
- --- a/src/utilmoneystr.cpp
- +++ b/src/utilmoneystr.cpp
- @@ -14,9 +14,9 @@ std::string FormatMoney(const Amount &amt) {
- // number formatting.
- int64_t n = amt.GetSatoshis();
- int64_t n_abs = (n > 0 ? n : -n);
- - int64_t quotient = n_abs / COIN.GetSatoshis();
- - int64_t remainder = n_abs % COIN.GetSatoshis();
- - std::string str = strprintf("%d.%08d", quotient, remainder);
- + int64_t quotient = n_abs / (COIN.GetSatoshis() / COIN_MULTIPLE);
- + int64_t remainder = n_abs % (COIN.GetSatoshis() / COIN_MULTIPLE);
- + std::string str = strprintf("%d.%05d", quotient, remainder);
- // Right-trim excess zeros before the decimal point:
- int nTrim = 0;
- @@ -41,7 +41,7 @@ bool ParseMoney(const char *pszIn, Amount &nRet) {
- for (; *p; p++) {
- if (*p == '.') {
- p++;
- - int64_t nMult = 10 * CENT.GetSatoshis();
- + int64_t nMult = 10 * (CENT.GetSatoshis() / COIN_MULTIPLE);
- while (isdigit(*p) && (nMult > 0)) {
- nUnits += nMult * (*p++ - '0');
- nMult /= 10;
- @@ -56,9 +56,9 @@ bool ParseMoney(const char *pszIn, Amount &nRet) {
- if (!isspace(*p)) return false;
- // guard against 63 bit overflow
- if (strWhole.size() > 10) return false;
- - if (nUnits < 0 || nUnits > COIN.GetSatoshis()) return false;
- + if (nUnits < 0 || nUnits > (COIN.GetSatoshis() / COIN_MULTIPLE)) return false;
- int64_t nWhole = atoi64(strWhole);
- - Amount nValue = nWhole * COIN + Amount(nUnits);
- + Amount nValue = nWhole * (COIN / COIN_MULTIPLE) + Amount(nUnits);
- nRet = nValue;
- return true;
- diff --git a/src/validation.cpp b/src/validation.cpp
- index 9474aef..76e336d 100644
- --- a/src/validation.cpp
- +++ b/src/validation.cpp
- @@ -16,6 +16,7 @@
- #include "consensus/validation.h"
- #include "hash.h"
- #include "init.h"
- +#include "netbase.h"
- #include "policy/fees.h"
- #include "policy/policy.h"
- #include "pow.h"
- @@ -80,6 +81,7 @@ uint64_t nPruneTarget = 0;
- int64_t nMaxTipAge = DEFAULT_MAX_TIP_AGE;
- uint256 hashAssumeValid;
- +arith_uint256 nMinimumChainWork;
- CFeeRate minRelayTxFee = CFeeRate(DEFAULT_MIN_RELAY_TX_FEE);
- Amount maxTxFee = DEFAULT_TRANSACTION_MAXFEE;
- @@ -91,7 +93,7 @@ static void CheckBlockIndex(const Consensus::Params &consensusParams);
- /** Constant stuff for coinbase transactions we create: */
- CScript COINBASE_FLAGS;
- -const std::string strMessageMagic = "Bitcoin Signed Message:\n";
- +const std::string strMessageMagic = "Bitcoin Candy Signed Message:\n";
- // Internal stuff
- namespace {
- @@ -606,6 +608,18 @@ static bool IsCurrentForFeeEstimation() {
- return true;
- }
- +static bool IsCDHFenabled(const Config &config, int nHeight) {
- + return nHeight >= config.GetChainParams().GetConsensus().cdyHeight;
- +}
- +
- +bool IsCDHFenabled(const Config &config, const CBlockIndex *pindexPrev) {
- + if (pindexPrev == nullptr) {
- + return false;
- + }
- +
- + return IsCDHFenabled(config, pindexPrev->nHeight);
- +}
- +
- static bool IsUAHFenabled(const Config &config, int nHeight) {
- return nHeight >= config.GetChainParams().GetConsensus().uahfHeight;
- }
- @@ -1146,11 +1160,15 @@ bool ReadBlockFromDisk(CBlock &block, const CDiskBlockPos &pos,
- e.what(), pos.ToString());
- }
- - // Check the header
- - if (!CheckProofOfWork(block.GetHash(), block.nBits, config)) {
- - return error("ReadBlockFromDisk: Errors in block header at %s",
- - pos.ToString());
- + const Consensus::Params& consensusParams = Params().GetConsensus();
- + // Check Equihash solution
- + bool postfork = block.nHeight >= (uint32_t)consensusParams.cdyHeight;
- + if (postfork && !CheckEquihashSolution(&block, Params())) {
- + return error("ReadBlockFromDisk: Errors in block header at %s (bad Equihash solution)", pos.ToString());
- }
- + // Check the header
- + if (!CheckProofOfWork(block.GetHash(), block.nBits, postfork, config))
- + return error("ReadBlockFromDisk: Errors in block header at %s", pos.ToString());
- return true;
- }
- @@ -1171,11 +1189,24 @@ bool ReadBlockFromDisk(CBlock &block, const CBlockIndex *pindex,
- }
- Amount GetBlockSubsidy(int nHeight, const Consensus::Params &consensusParams) {
- - int halvings = nHeight / consensusParams.nSubsidyHalvingInterval;
- + int halvings;
- + if(nHeight>=consensusParams.cdyHeight) {
- + halvings = (consensusParams.cdyHeight + (nHeight - consensusParams.cdyHeight)/5) / consensusParams.nSubsidyHalvingInterval;
- + }
- + else halvings = nHeight / consensusParams.nSubsidyHalvingInterval;
- +
- // Force block reward to zero when right shift is undefined.
- + // Yang determine later if we use this or BTG premine window mechanism
- + if (nHeight == consensusParams.cdyHeight)
- + return 210000 * COIN;// * COIN_SCALE;
- +
- if (halvings >= 64) return Amount(0);
- - Amount nSubsidy = 50 * COIN;
- + Amount nSubsidy = 50 * COIN;// * COIN_SCALE;
- +
- + if(nHeight>=consensusParams.cdyHeight) {
- + nSubsidy = 10 * COIN;// * COIN_SCALE;
- + }
- // Subsidy is cut in half every 210,000 blocks which will occur
- // approximately every 4 years.
- return Amount(nSubsidy.GetSatoshis() >> halvings);
- @@ -1196,8 +1227,12 @@ bool IsInitialBlockDownload() {
- if (chainActive.Tip()->nChainWork <
- UintToArith256(chainParams.GetConsensus().nMinimumChainWork))
- return true;
- - if (chainActive.Tip()->GetBlockTime() < (GetTime() - nMaxTipAge))
- + if (fSkipHardforkIBD && chainActive.Tip()->nHeight + 1 >= (int)chainParams.GetConsensus().cdyHeight)
- + return false;
- + int64_t target_time = fCDYBootstrapping ? (int64_t)chainParams.GetConsensus().BitcoinPostforkTime : GetTime();
- + if (chainActive.Tip()->GetBlockTime() < (target_time - nMaxTipAge))
- return true;
- + LogPrintf("Leaving InitialBlockDownload (latching to false)\n");
- latchToFalse.store(true, std::memory_order_relaxed);
- return false;
- }
- @@ -1835,7 +1870,11 @@ static uint32_t GetBlockScriptFlags(const CBlockIndex *pindex,
- }
- // If the UAHF is enabled, we start accepting replay protected txns
- - if (IsUAHFenabled(config, pindex->pprev)) {
- + if(IsCDHFenabled(config, pindex->pprev)){
- + flags |= SCRIPT_VERIFY_STRICTENC;
- + flags |= SCRIPT_ENABLE_SIGHASH_FORKID;
- + flags |= SCRIPT_ENABLE_CHANGE_FORKID;
- + } else if (IsUAHFenabled(config, pindex->pprev)) {
- flags |= SCRIPT_VERIFY_STRICTENC;
- flags |= SCRIPT_ENABLE_SIGHASH_FORKID;
- }
- @@ -3198,8 +3237,17 @@ bool FindUndoPos(CValidationState &state, int nFile, CDiskBlockPos &pos,
- static bool CheckBlockHeader(const Config &config, const CBlockHeader &block,
- CValidationState &state, bool fCheckPOW = true) {
- - // Check proof of work matches claimed amount
- - if (fCheckPOW && !CheckProofOfWork(block.GetHash(), block.nBits, config)) {
- + // Yang Check proof of work matches claimed amount
- + const Consensus::Params &consensusParams = Params().GetConsensus();
- + bool postfork = block.nHeight >= (uint32_t)consensusParams.cdyHeight;
- +
- + if (fCheckPOW && postfork && !CheckEquihashSolution(&block, Params())) {
- + LogPrintf("CheckBlockHeader(): Equihash solution invalid at height %d\n", block.nHeight);
- + return state.DoS(100, error("CheckBlockHeader(): Equihash solution invalid"),
- + REJECT_INVALID, "invalid-solution");
- + }
- +
- + if (fCheckPOW && !CheckProofOfWork(block.GetHash(), block.nBits, postfork, config)) {
- return state.DoS(50, false, REJECT_INVALID, "high-hash", false,
- "proof of work failed");
- }
- @@ -3359,6 +3407,10 @@ static bool ContextualCheckBlockHeader(const Config &config,
- "incorrect proof of work");
- }
- + // Check block height for blocks after CDY fork.
- + if (nHeight >= consensusParams.cdyHeight && block.nHeight != (uint32_t)nHeight)
- + return state.Invalid(false, REJECT_INVALID, "bad-height", "incorrect block height");
- +
- // Check timestamp against prev
- if (block.GetBlockTime() <= pindexPrev->GetMedianTimePast()) {
- return state.Invalid(false, REJECT_INVALID, "time-too-old",
- @@ -3507,6 +3559,7 @@ static bool AcceptBlockHeader(const Config &config, const CBlockHeader &block,
- *ppindex = pindex;
- }
- if (pindex->nStatus & BLOCK_FAILED_MASK) {
- + LogPrintf("%s: block %d(%s, nStatus=%x) is marked invalid\n", __func__, pindex->nHeight, hash.ToString(), pindex->nStatus);
- return state.Invalid(error("%s: block %s is marked invalid",
- __func__, hash.ToString()),
- 0, "duplicate");
- @@ -3981,8 +4034,7 @@ FILE *OpenUndoFile(const CDiskBlockPos &pos, bool fReadOnly) {
- return OpenDiskFile(pos, "rev", fReadOnly);
- }
- -boost::filesystem::path GetBlockPosFilename(const CDiskBlockPos &pos,
- - const char *prefix) {
- +boost::filesystem::path GetBlockPosFilename(const CDiskBlockPos &pos, const char *prefix) {
- return GetDataDir() / "blocks" / strprintf("%s%05u.dat", prefix, pos.nFile);
- }
- diff --git a/src/version.h b/src/version.h
- index 3cbe33d..16ff091 100644
- --- a/src/version.h
- +++ b/src/version.h
- @@ -8,7 +8,7 @@
- /**
- * network protocol versioning
- */
- -static const int PROTOCOL_VERSION = 70015;
- +static const int PROTOCOL_VERSION = 70016;
- //! initial proto version, to be increased after version/verack negotiation
- static const int INIT_PROTO_VERSION = 209;
- @@ -47,4 +47,5 @@ static const int SHORT_IDS_BLOCKS_VERSION = 70014;
- //! not banning for invalid compact blocks starts with this version
- static const int INVALID_CB_NO_BAN_VERSION = 70015;
- +static const int CDY_HARD_FORK_VERSION = 70016;
- #endif // BITCOIN_VERSION_H
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement