Advertisement
hackyminer

cand-abc-1.diff

Feb 8th, 2018
1,385
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 330.72 KB | None | 0 0
  1. diff --git a/.gitignore b/.gitignore
  2. index a977c79..21fe8f5 100644
  3. --- a/.gitignore
  4. +++ b/.gitignore
  5. @@ -114,3 +114,5 @@ contrib/devtools/split-debug.sh
  6.  
  7.  # vagrant
  8.  .vagrant
  9. +
  10. +**/.vscode
  11. diff --git a/CMakeLists.txt b/CMakeLists.txt
  12. index 8318039..65f759d 100644
  13. --- a/CMakeLists.txt
  14. +++ b/CMakeLists.txt
  15. @@ -1,7 +1,7 @@
  16.  # Copyright (c) 2017 The Bitcoin developers
  17.  
  18.  cmake_minimum_required(VERSION 3.1)
  19. -project(BitcoinABC)
  20. +project(BitcoinCandy)
  21.  
  22.  # Add path for custom modules
  23.  set(CMAKE_MODULE_PATH
  24. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
  25. index 0303334..0075dff 100644
  26. --- a/CONTRIBUTING.md
  27. +++ b/CONTRIBUTING.md
  28. @@ -1,15 +1,15 @@
  29. -Contributing to Bitcoin ABC
  30. +Contributing to Bitcoin Candy
  31.  ===========================
  32.  
  33. -The Bitcoin ABC project welcomes contributors!
  34. +The Bitcoin Candy project welcomes contributors!
  35.  
  36. -This guide is intended to help developers contribute effectively to Bitcoin ABC.
  37. +This guide is intended to help developers contribute effectively to Bitcoin Candy.
  38.  
  39.  
  40. -Bitcoin ABC Development Philosophy
  41. +Bitcoin Candy Development Philosophy
  42.  ----------------------------------
  43.  
  44. -Bitcoin ABC aims for fast iteration and continuous integration.
  45. +Bitcoin Candy aims for fast iteration and continuous integration.
  46.  
  47.  This means that there should be quick turnaround for patches to be proposed,
  48.  reviewed, and committed. Changes should not sit in a queue for long.
  49. @@ -35,9 +35,9 @@ If a Diff is landed, and breaks the build, fix it quickly. If it cannot be fixed
  50.  quickly, it should be reverted, and re-applied later when it no longer breaks the build.
  51.  - Automate as much as possible, and spend time on things only humans can do.
  52.  
  53. -Here are some handy links for development practices aligned with Bitcoin ABC:
  54. +Here are some handy links for development practices aligned with Bitcoin Candy:
  55.  
  56. -- [Statement of Bitcoin ABC Values and Visions](https://www.yours.org/content/bitcoin-abc---our-values-and-vision-a282afaade7c)
  57. +- [Statement of Bitcoin Candy Values and Visions](https://www.yours.org/content/bitcoin-abc---our-values-and-vision-a282afaade7c)
  58.  - [Large Diffs Are Hurting Your Ability To Ship](https://medium.com/@kurtisnusbaum/large-diffs-are-hurting-your-ability-to-ship-e0b2b41e8acf)
  59.  - [Stacked Diffs: Keeping Phabricator Diffs Small](https://medium.com/@kurtisnusbaum/stacked-diffs-keeping-phabricator-diffs-small-d9964f4dcfa6)
  60.  - [Parallel Implementations](https://www.gamasutra.com/view/news/128325/Opinion_Parallel_Implementations.php)
  61. @@ -45,7 +45,7 @@ Here are some handy links for development practices aligned with Bitcoin ABC:
  62.  - [Advantages of monolithic version control](https://danluu.com/monorepo/)
  63.  
  64.  
  65. -Getting set up with the Bitcoin ABC Repository
  66. +Getting set up with the Bitcoin Candy Repository
  67.  ----------------------------------------------
  68.  
  69.  1. Create an account at `https://reviews.bitcoinabc.org/`
  70. @@ -93,7 +93,7 @@ If code formatting tools do not install automatically on your system, you
  71.  may have to install clang-format-3.8 and autopep8.
  72.  
  73.  
  74. -Working with The Bitcoin ABC Repository
  75. +Working with The Bitcoin Candy Repository
  76.  ---------------------------------------
  77.  
  78.  A typical workflow would be:
  79. @@ -134,7 +134,7 @@ as the Diff number, reviewers, etc.).
  80.  - When reviewers approve your Diff, it should be listed as "ready to Land"
  81.  in Phabricator. When you want to commit your diff to the repository, check out
  82.  type my-topic-branch in git, then type `arc land`. You have now succesfully
  83. -committed a change to the Bitcoin ABC repository.
  84. +committed a change to the Bitcoin Candy repository.
  85.  
  86.  
  87.  What to work on
  88. diff --git a/COPYING b/COPYING
  89. index 76a2523..14e064c 100644
  90. --- a/COPYING
  91. +++ b/COPYING
  92. @@ -2,7 +2,7 @@ The MIT License (MIT)
  93.  
  94.  Copyright (c) 2009-2015 Bitcoin Developers
  95.  Copyright (c) 2009-2017 The Bitcoin Core developers
  96. -Copyright (c) 2017 The Bitcoin ABC developers
  97. +Copyright (c) 2017 The Bitcoin Candy developers
  98.  
  99.  Permission is hereby granted, free of charge, to any person obtaining a copy
  100.  of this software and associated documentation files (the "Software"), to deal
  101. diff --git a/INSTALL.md b/INSTALL.md
  102. index dc96228..53b82a6 100644
  103. --- a/INSTALL.md
  104. +++ b/INSTALL.md
  105. @@ -2,4 +2,4 @@ Building Bitcoin
  106.  ================
  107.  
  108.  See doc/build-*.md for instructions on building the various
  109. -elements of the Bitcoin ABC implementation of Bitcoin.
  110. +elements of the Bitcoin Candy implementation of Bitcoin.
  111. diff --git a/Makefile.am b/Makefile.am
  112. index cf1e278..536af97 100644
  113. --- a/Makefile.am
  114. +++ b/Makefile.am
  115. @@ -28,7 +28,7 @@ BITCOIN_WIN_INSTALLER=$(PACKAGE)-$(PACKAGE_VERSION)-win$(WINDOWS_BITS)-setup$(EX
  116.  empty :=
  117.  space := $(empty) $(empty)
  118.  
  119. -OSX_APP=BitcoinABC-Qt.app
  120. +OSX_APP=BitcoinCandy-Qt.app
  121.  OSX_VOLNAME = $(subst $(space),-,$(PACKAGE_NAME))
  122.  OSX_DMG = $(OSX_VOLNAME).dmg
  123.  OSX_BACKGROUND_SVG=background.svg
  124. @@ -98,7 +98,7 @@ $(OSX_APP)/Contents/Resources/bitcoin.icns: $(OSX_INSTALLER_ICONS)
  125.     $(MKDIR_P) $(@D)
  126.     $(INSTALL_DATA) $< $@
  127.  
  128. -$(OSX_APP)/Contents/MacOS/BitcoinABC-Qt: $(BITCOIN_QT_BIN)
  129. +$(OSX_APP)/Contents/MacOS/BitcoinCandy-Qt: $(BITCOIN_QT_BIN)
  130.     $(MKDIR_P) $(@D)
  131.     STRIPPROG="$(STRIP)" $(INSTALL_STRIP_PROGRAM)  $< $@
  132.  
  133. @@ -108,7 +108,7 @@ $(OSX_APP)/Contents/Resources/Base.lproj/InfoPlist.strings:
  134.  
  135.  OSX_APP_BUILT=$(OSX_APP)/Contents/PkgInfo $(OSX_APP)/Contents/Resources/empty.lproj \
  136.    $(OSX_APP)/Contents/Resources/bitcoin.icns $(OSX_APP)/Contents/Info.plist \
  137. -  $(OSX_APP)/Contents/MacOS/BitcoinABC-Qt $(OSX_APP)/Contents/Resources/Base.lproj/InfoPlist.strings
  138. +  $(OSX_APP)/Contents/MacOS/BitcoinCandy-Qt $(OSX_APP)/Contents/Resources/Base.lproj/InfoPlist.strings
  139.  
  140.  osx_volname:
  141.     echo $(OSX_VOLNAME) >$@
  142. @@ -133,7 +133,7 @@ $(APP_DIST_DIR)/Applications:
  143.     @rm -f $@
  144.     @cd $(@D); $(LN_S) /Applications $(@F)
  145.  
  146. -$(APP_DIST_EXTRAS): $(APP_DIST_DIR)/$(OSX_APP)/Contents/MacOS/BitcoinABC-Qt
  147. +$(APP_DIST_EXTRAS): $(APP_DIST_DIR)/$(OSX_APP)/Contents/MacOS/BitcoinCandy-Qt
  148.  
  149.  $(OSX_DMG): $(APP_DIST_EXTRAS)
  150.     $(GENISOIMAGE) -no-cache-inodes -D -l -probe -V "$(OSX_VOLNAME)" -no-pad -r -dir-mode 0755 -apple -o $@ dist
  151. @@ -148,7 +148,7 @@ $(APP_DIST_DIR)/.background/$(OSX_BACKGROUND_IMAGE): $(OSX_BACKGROUND_IMAGE_DPIF
  152.  $(APP_DIST_DIR)/.DS_Store: $(OSX_DSSTORE_GEN)
  153.     $(PYTHON) $< "$@" "$(OSX_VOLNAME)"
  154.  
  155. -$(APP_DIST_DIR)/$(OSX_APP)/Contents/MacOS/BitcoinABC-Qt: $(OSX_APP_BUILT) $(OSX_PACKAGING)
  156. +$(APP_DIST_DIR)/$(OSX_APP)/Contents/MacOS/BitcoinCandy-Qt: $(OSX_APP_BUILT) $(OSX_PACKAGING)
  157.     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
  158.  
  159.  deploydir: $(APP_DIST_EXTRAS)
  160. diff --git a/README.md b/README.md
  161. index 4d0af1e..eec6e50 100644
  162. --- a/README.md
  163. +++ b/README.md
  164. @@ -1,29 +1,23 @@
  165. -Bitcoin ABC
  166. +Bitcoin Candy
  167.  ===========
  168.  
  169. -https://bitcoinabc.org
  170. +https://bitcoincandy.one
  171.  
  172. -What is Bitcoin Cash?
  173. ----------------------
  174. +What is Bitcoin candy?
  175. +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.
  176.  
  177. -[Bitcoin Cash](https://www.bitcoincash.org/) is an experimental digital currency
  178. -that enables instant payments to anyone, anywhere in the world. It uses peer-to-peer
  179. -technology to operate with no central authority: managing transactions and issuing
  180. -money are carried out collectively by the network. Bitcoin Cash is a descendant of
  181. -Bitcoin. It became a separate currency from the version supported by Bitcoin Core
  182. -when the two split on August 1, 2017. Bitcoin Cash and the Bitcoin Core version of
  183. -Bitcoin share the same transaction history up until the split.
  184.  
  185. -What is Bitcoin ABC?
  186. ---------------------
  187. +Release
  188. +-------
  189. +
  190. +[windows-64bit](https://github.com/bitcoincandyofficial/bitcoincandy/files/1707921/bitcoincandy-windows-exe.zip)
  191.  
  192. -Bitcoin ABC is the name of open-source software which enables the use of Bitcoin Cash.
  193. -It is a fork of the [Bitcoin Core](https://bitcoincore.org) software project.
  194. +Currently we only provide windows version of wallet. Wallets for  linux and mac will be released soon.
  195.  
  196.  License
  197.  -------
  198.  
  199. -Bitcoin ABC is released under the terms of the MIT license. See [COPYING](COPYING) for more
  200. +Bitcoin Candy is released under the terms of the MIT license. See [COPYING](COPYING) for more
  201.  information or see https://opensource.org/licenses/MIT.
  202.  
  203.  Development Process
  204. @@ -31,6 +25,7 @@ Development Process
  205.  
  206.  This Github repository contains only source code of releases.
  207.  
  208. -Bitcoin ABC development takes place at https://reviews.bitcoinabc.org/
  209. +Bitcoin Candy development takes place at https://reviews.bitcoinabc.org/
  210.  
  211.  If you would like to contribute, please read [CONTRIBUTING](CONTRIBUTING.md)
  212. +
  213. diff --git a/configure.ac b/configure.ac
  214. index b2cfe0c..0b91130 100644
  215. --- a/configure.ac
  216. +++ b/configure.ac
  217. @@ -3,12 +3,12 @@ AC_PREREQ([2.60])
  218.  define(_CLIENT_VERSION_MAJOR, 0)
  219.  define(_CLIENT_VERSION_MINOR, 16)
  220.  define(_CLIENT_VERSION_REVISION, 2)
  221. -define(_CLIENT_VERSION_BUILD, 0)
  222. +define(_CLIENT_VERSION_BUILD, 7)
  223.  define(_CLIENT_VERSION_IS_RELEASE, true)
  224. -define(_COPYRIGHT_YEAR, 2017)
  225. +define(_COPYRIGHT_YEAR, 2018)
  226.  define(_COPYRIGHT_HOLDERS,[The %s developers])
  227.  define(_COPYRIGHT_HOLDERS_SUBSTITUTION,[[Bitcoin]])
  228. -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/])
  229. +AC_INIT([Bitcoin Candy],[_CLIENT_VERSION_MAJOR._CLIENT_VERSION_MINOR._CLIENT_VERSION_REVISION],[https://github.com/bitcoincandyteam/bitcoincandy/issues],[bitcoin-abc],[https://bitcoincandy.one/])
  230.  AC_CONFIG_SRCDIR([src/validation.cpp])
  231.  AC_CONFIG_HEADERS([src/config/bitcoin-config.h])
  232.  AC_CONFIG_AUX_DIR([build-aux])
  233. @@ -1030,6 +1030,8 @@ AC_SUBST(UNIVALUE_LIBS)
  234.  
  235.  BITCOIN_QT_PATH_PROGS([PROTOC], [protoc],$protoc_bin_path)
  236.  
  237. +LIBEQUIHASH_LIBS="-lcrypto -lsodium"
  238. +
  239.  AC_MSG_CHECKING([whether to build bitcoind])
  240.  AM_CONDITIONAL([BUILD_BITCOIND], [test x$build_bitcoind = xyes])
  241.  AC_MSG_RESULT($build_bitcoind)
  242. @@ -1230,6 +1232,7 @@ AC_SUBST(SSL_LIBS)
  243.  AC_SUBST(EVENT_LIBS)
  244.  AC_SUBST(EVENT_PTHREADS_LIBS)
  245.  AC_SUBST(ZMQ_LIBS)
  246. +AC_SUBST(LIBEQUIHASH_LIBS)
  247.  AC_SUBST(PROTOBUF_LIBS)
  248.  AC_SUBST(QR_LIBS)
  249.  AC_CONFIG_FILES([Makefile src/Makefile doc/man/Makefile share/setup.nsi share/qt/Info.plist src/test/buildenv.py test/functional/config.ini])
  250. diff --git a/contrib/rpm/bitcoin-0.12.0-libressl.patch b/contrib/rpm/bitcoin-0.12.0-libressl.patch
  251. deleted file mode 100644
  252. index 555614a..0000000
  253. +++ /dev/null
  254. @@ -1,24 +0,0 @@
  255. -diff -ur bitcoin-0.12.0.orig/src/init.cpp bitcoin-0.12.0/src/init.cpp
  256. ---- bitcoin-0.12.0.orig/src/init.cpp   2015-12-31 16:00:00.000000000 -0800
  257. -+++ bitcoin-0.12.0/src/init.cpp    2016-02-23 06:03:47.133227757 -0800
  258. -@@ -1075,7 +1075,7 @@
  259. -     if (fPrintToDebugLog)
  260. -         OpenDebugLog();
  261. -
  262. --#if (OPENSSL_VERSION_NUMBER < 0x10100000L)
  263. -+#if defined(LIBRESSL_VERSION_NUMBER) || (OPENSSL_VERSION_NUMBER < 0x10100000L)
  264. -     LogPrintf("Using OpenSSL version %s\n", SSLeay_version(SSLEAY_VERSION));
  265. - #else
  266. -     LogPrintf("Using OpenSSL version %s\n", OpenSSL_version(OPENSSL_VERSION));
  267. -diff -ur bitcoin-0.12.0.orig/src/qt/rpcconsole.cpp bitcoin-0.12.0/src/qt/rpcconsole.cpp
  268. ---- bitcoin-0.12.0.orig/src/qt/rpcconsole.cpp  2015-12-31 16:00:00.000000000 -0800
  269. -+++ bitcoin-0.12.0/src/qt/rpcconsole.cpp   2016-02-23 15:09:42.881126841 -0800
  270. -@@ -264,7 +264,7 @@
  271. -
  272. -     // set library version labels
  273. -
  274. --#if (OPENSSL_VERSION_NUMBER < 0x10100000L)
  275. -+#if defined(LIBRESSL_VERSION_NUMBER) || (OPENSSL_VERSION_NUMBER < 0x10100000L)
  276. -     ui->openSSLVersion->setText(SSLeay_version(SSLEAY_VERSION));
  277. - #else
  278. -     ui->openSSLVersion->setText(OpenSSL_version(OPENSSL_VERSION));
  279. diff --git a/depends/packages/libsodium.mk b/depends/packages/libsodium.mk
  280. new file mode 100644
  281. index 0000000..a3de1d6
  282. diff --git a/doc/build-unix.md b/doc/build-unix.md
  283. index b925b98..47041b7 100644
  284. --- a/doc/build-unix.md
  285. +++ b/doc/build-unix.md
  286. @@ -65,7 +65,7 @@ Dependency Build Instructions: Ubuntu & Debian
  287.  ----------------------------------------------
  288.  Build requirements:
  289.  
  290. -    sudo apt-get install build-essential libtool autotools-dev automake pkg-config libssl-dev libevent-dev bsdmainutils
  291. +    sudo apt-get install build-essential libtool autotools-dev automake pkg-config libssl-dev libevent-dev bsdmainutils libsodium-dev
  292.  
  293.  Options when installing required Boost library files:
  294.  
  295. diff --git a/share/qt/Info.plist.in b/share/qt/Info.plist.in
  296. index 21fadd9..1df6845 100644
  297. --- a/share/qt/Info.plist.in
  298. +++ b/share/qt/Info.plist.in
  299. @@ -29,16 +29,16 @@
  300.    <string>????</string>
  301.  
  302.    <key>CFBundleExecutable</key>
  303. -  <string>BitcoinABC-Qt</string>
  304. +  <string>BitcoinCandy-Qt</string>
  305.    
  306.    <key>CFBundleName</key>
  307. -  <string>BitcoinABC-Qt</string>
  308. +  <string>BitcoinCandy-Qt</string>
  309.  
  310.    <key>LSHasLocalizedDisplayName</key>
  311.    <true/>
  312.  
  313.    <key>CFBundleIdentifier</key>
  314. -  <string>org.bitcoinabc.BitcoinABC-Qt</string>
  315. +  <string>one.bitcoincandy.BitcoinCandy-Qt</string>
  316.  
  317.    <key>CFBundleURLTypes</key>
  318.    <array>
  319. diff --git a/src/Makefile.am b/src/Makefile.am
  320. index 65b2509..075a892 100644
  321. --- a/src/Makefile.am
  322. +++ b/src/Makefile.am
  323. @@ -270,6 +270,9 @@ crypto_libbitcoin_crypto_a_SOURCES = \
  324.    crypto/chacha20.h \
  325.    crypto/chacha20.cpp \
  326.    crypto/common.h \
  327. +  crypto/equihash.cpp \
  328. +  crypto/equihash.h \
  329. +  crypto/equihash.tcc \
  330.    crypto/hmac_sha256.cpp \
  331.    crypto/hmac_sha256.h \
  332.    crypto/hmac_sha512.cpp \
  333. @@ -423,7 +426,7 @@ bitcoind_LDADD = \
  334.    $(LIBMEMENV) \
  335.    $(LIBSECP256K1)
  336.  
  337. -bitcoind_LDADD += $(BOOST_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) $(ZMQ_LIBS)
  338. +bitcoind_LDADD += $(BOOST_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) $(ZMQ_LIBS) $(LIBEQUIHASH_LIBS)
  339.  
  340.  # bitcoin-cli binary #
  341.  bitcoin_cli_SOURCES = bitcoin-cli.cpp
  342. @@ -441,7 +444,7 @@ bitcoin_cli_LDADD = \
  343.    $(LIBBITCOIN_UTIL) \
  344.    $(LIBBITCOIN_CRYPTO)
  345.  
  346. -bitcoin_cli_LDADD += $(BOOST_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(EVENT_LIBS)
  347. +bitcoin_cli_LDADD += $(BOOST_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(EVENT_LIBS) $(LIBEQUIHASH_LIBS)
  348.  #
  349.  
  350.  # bitcoin-seeder binary #
  351. @@ -475,7 +478,8 @@ bitcoin_tx_LDADD = \
  352.    $(LIBBITCOIN_UTIL) \
  353.    $(LIBBITCOIN_CONSENSUS) \
  354.    $(LIBBITCOIN_CRYPTO) \
  355. -  $(LIBSECP256K1)
  356. +  $(LIBSECP256K1) \
  357. +  $(LIBEQUIHASH_LIBS)
  358.  
  359.  bitcoin_tx_LDADD += $(BOOST_LIBS) $(CRYPTO_LIBS)
  360.  #
  361. @@ -490,8 +494,8 @@ if GLIBC_BACK_COMPAT
  362.  endif
  363.  
  364.  libbitcoinconsensus_la_LDFLAGS = $(AM_LDFLAGS) -no-undefined $(RELDFLAGS)
  365. -libbitcoinconsensus_la_LIBADD = $(LIBSECP256K1)
  366. -libbitcoinconsensus_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(builddir)/obj -I$(srcdir)/secp256k1/include -DBUILD_BITCOIN_INTERNAL
  367. +libbitcoinconsensus_la_LIBADD = $(LIBSECP256K1) $(BOOST_LIBS) $(LIBEQUIHASH_LIBS)
  368. +libbitcoinconsensus_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(builddir)/obj -I$(srcdir)/secp256k1/include -DBUILD_BITCOIN_INTERNAL  -DNO_UTIL_LOG
  369.  libbitcoinconsensus_la_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
  370.  
  371.  endif
  372. diff --git a/src/Makefile.bench.include b/src/Makefile.bench.include
  373. index ff09656..12ff264 100644
  374. --- a/src/Makefile.bench.include
  375. +++ b/src/Makefile.bench.include
  376. @@ -40,7 +40,8 @@ bench_bench_bitcoin_LDADD = \
  377.    $(LIBLEVELDB_SSE42) \
  378.    $(LIBMEMENV) \
  379.    $(LIBSECP256K1) \
  380. -  $(LIBUNIVALUE)
  381. +  $(LIBUNIVALUE)\
  382. +  $(LIBEQUIHASH_LIBS)
  383.  
  384.  if ENABLE_ZMQ
  385.  bench_bench_bitcoin_LDADD += $(LIBBITCOIN_ZMQ) $(ZMQ_LIBS)
  386. diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include
  387. index 960ae4b..b1c9094 100644
  388. --- a/src/Makefile.qt.include
  389. +++ b/src/Makefile.qt.include
  390. @@ -406,7 +406,7 @@ qt_bitcoin_qt_LDADD += $(LIBBITCOIN_ZMQ) $(ZMQ_LIBS)
  391.  endif
  392.  qt_bitcoin_qt_LDADD += $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CONSENSUS) $(LIBBITCOIN_CRYPTO) $(LIBUNIVALUE) $(LIBLEVELDB) $(LIBLEVELDB_SSE42) $(LIBMEMENV) \
  393.    $(BOOST_LIBS) $(QT_LIBS) $(QT_DBUS_LIBS) $(QR_LIBS) $(PROTOBUF_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) $(LIBSECP256K1) \
  394. -  $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS)
  395. +  $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) $(LIBEQUIHASH_LIBS)
  396.  qt_bitcoin_qt_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(QT_LDFLAGS) $(LIBTOOL_APP_LDFLAGS)
  397.  qt_bitcoin_qt_LIBTOOLFLAGS = --tag CXX
  398.  
  399. diff --git a/src/Makefile.qttest.include b/src/Makefile.qttest.include
  400. index 398dfd2..8b699dd 100644
  401. --- a/src/Makefile.qttest.include
  402. +++ b/src/Makefile.qttest.include
  403. @@ -53,7 +53,7 @@ endif
  404.  qt_test_test_bitcoin_qt_LDADD += $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CONSENSUS) $(LIBBITCOIN_CRYPTO) $(LIBUNIVALUE) $(LIBLEVELDB) \
  405.    $(LIBLEVELDB_SSE42) $(LIBMEMENV) $(BOOST_LIBS) $(QT_DBUS_LIBS) $(QT_TEST_LIBS) $(QT_LIBS) \
  406.    $(QR_LIBS) $(PROTOBUF_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) $(LIBSECP256K1) \
  407. -  $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS)
  408. +  $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) $(LIBEQUIHASH_LIBS)
  409.  qt_test_test_bitcoin_qt_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(QT_LDFLAGS) $(LIBTOOL_APP_LDFLAGS)
  410.  qt_test_test_bitcoin_qt_CXXFLAGS = $(AM_CXXFLAGS) $(QT_PIE_FLAGS)
  411.  
  412. diff --git a/src/Makefile.test.include b/src/Makefile.test.include
  413. index 961f2df..5faed9a 100644
  414. --- a/src/Makefile.test.include
  415. +++ b/src/Makefile.test.include
  416. @@ -140,6 +140,7 @@ BITCOIN_TESTS =\
  417.    test/undo_tests.cpp \
  418.    test/univalue_tests.cpp \
  419.    test/util_tests.cpp \
  420. +  test/equihash_tests.cpp \
  421.    test/validation_tests.cpp
  422.  
  423.  if ENABLE_WALLET
  424. @@ -155,7 +156,8 @@ endif
  425.  test_test_bitcoin_SOURCES = $(BITCOIN_TESTS) $(JSON_TEST_FILES) $(RAW_TEST_FILES)
  426.  test_test_bitcoin_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) -I$(builddir)/test/ $(TESTDEFS) $(EVENT_CFLAGS)
  427.  test_test_bitcoin_LDADD = $(LIBBITCOIN_SERVER) $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CONSENSUS) $(LIBBITCOIN_CRYPTO) $(LIBUNIVALUE) \
  428. -  $(LIBLEVELDB) $(LIBLEVELDB_SSE42) $(LIBMEMENV) $(BOOST_LIBS) $(BOOST_UNIT_TEST_FRAMEWORK_LIB) $(LIBSECP256K1) $(EVENT_LIBS)
  429. +  $(LIBLEVELDB) $(LIBLEVELDB_SSE42) $(LIBMEMENV) $(BOOST_LIBS) $(BOOST_UNIT_TEST_FRAMEWORK_LIB) $(LIBSECP256K1) $(EVENT_LIBS) \
  430. +  $(LIBEQUIHASH_LIBS)
  431.  
  432.  test_test_bitcoin_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
  433.  if ENABLE_WALLET
  434. @@ -183,7 +185,8 @@ test_test_bitcoin_fuzzy_LDADD = \
  435.    $(LIBBITCOIN_UTIL) \
  436.    $(LIBBITCOIN_CONSENSUS) \
  437.    $(LIBBITCOIN_CRYPTO) \
  438. -  $(LIBSECP256K1)
  439. +  $(LIBSECP256K1)\
  440. +  $(LIBEQUIHASH_LIBS)
  441.  
  442.  test_test_bitcoin_fuzzy_LDADD += $(BOOST_LIBS) $(CRYPTO_LIBS)
  443.  #
  444. diff --git a/src/amount.cpp b/src/amount.cpp
  445. index b779b0f..cbeda04 100644
  446. --- a/src/amount.cpp
  447. +++ b/src/amount.cpp
  448. @@ -7,11 +7,11 @@
  449.  
  450.  #include "tinyformat.h"
  451.  
  452. -const std::string CURRENCY_UNIT = "BCH";
  453. +const std::string CURRENCY_UNIT = "CDY";
  454.  
  455.  std::string Amount::ToString() const {
  456. -    return strprintf("%d.%08d %s", amount / COIN.GetSatoshis(),
  457. -                     amount % COIN.GetSatoshis(), CURRENCY_UNIT);
  458. +    return strprintf("%d.%05d %s", amount / (COIN.GetSatoshis() / COIN_MULTIPLE),
  459. +                     amount % (COIN.GetSatoshis() / COIN_MULTIPLE), CURRENCY_UNIT);
  460.  }
  461.  
  462.  CFeeRate::CFeeRate(const Amount nFeePaid, size_t nBytes_) {
  463. @@ -45,6 +45,6 @@ Amount CFeeRate::GetFee(size_t nBytes_) const {
  464.  
  465.  std::string CFeeRate::ToString() const {
  466.      return strprintf(
  467. -        "%d.%08d %s/kB", nSatoshisPerK.GetSatoshis() / COIN.GetSatoshis(),
  468. -        nSatoshisPerK.GetSatoshis() % COIN.GetSatoshis(), CURRENCY_UNIT);
  469. +        "%d.%05d %s/kB", nSatoshisPerK.GetSatoshis() / (COIN.GetSatoshis() / COIN_MULTIPLE),
  470. +        nSatoshisPerK.GetSatoshis() % (COIN.GetSatoshis() / COIN_MULTIPLE), CURRENCY_UNIT);
  471.  }
  472. diff --git a/src/amount.h b/src/amount.h
  473. index f076ecf..0dfccd3 100644
  474. --- a/src/amount.h
  475. +++ b/src/amount.h
  476. @@ -112,6 +112,9 @@ typedef int64_t CAmount;
  477.  static const Amount COIN(100000000);
  478.  static const Amount CENT(1000000);
  479.  
  480. +static const CAmount COIN_MULTIPLE = 1000;  // CDY * 1000
  481. +static const CAmount COIN_DECIMAL_COUNT = 5;  // CDY 5 decimals
  482. +
  483.  extern const std::string CURRENCY_UNIT;
  484.  
  485.  /**
  486. diff --git a/src/bitcoin-tx.cpp b/src/bitcoin-tx.cpp
  487. index f93799b..85d7a36 100644
  488. --- a/src/bitcoin-tx.cpp
  489. +++ b/src/bitcoin-tx.cpp
  490. @@ -540,7 +540,7 @@ static Amount AmountFromValue(const UniValue &value) {
  491.      }
  492.  
  493.      int64_t n;
  494. -    if (!ParseFixedPoint(value.getValStr(), 8, &n)) {
  495. +    if (!ParseFixedPoint(value.getValStr(), COIN_DECIMAL_COUNT, &n)) {
  496.          throw std::runtime_error("Invalid amount");
  497.      }
  498.      Amount amount = Amount(n);
  499. diff --git a/src/chain.cpp b/src/chain.cpp
  500. index 7ac803c..ba4b6ed 100644
  501. --- a/src/chain.cpp
  502. +++ b/src/chain.cpp
  503. @@ -156,7 +156,10 @@ int64_t GetBlockProofEquivalentTime(const CBlockIndex &to,
  504.          r = from.nChainWork - to.nChainWork;
  505.          sign = -1;
  506.      }
  507. -    r = r * arith_uint256(params.nPowTargetSpacing) / GetBlockProof(tip);
  508. +
  509. +    // Yang
  510. +    int64_t nPowTargetSpacing = tip.nHeight >= params.cdyHeight ? params.nPowTargetSpacingCDY : params.nPowTargetSpacing;
  511. +    r = r * arith_uint256(nPowTargetSpacing) / GetBlockProof(tip);
  512.      if (r.bits() > 63) {
  513.          return sign * std::numeric_limits<int64_t>::max();
  514.      }
  515. diff --git a/src/chain.h b/src/chain.h
  516. index 8f6a9c3..7971025 100644
  517. --- a/src/chain.h
  518. +++ b/src/chain.h
  519. @@ -15,6 +15,7 @@
  520.  
  521.  #include <unordered_map>
  522.  #include <vector>
  523. +#include <string.h>
  524.  
  525.  class CBlockFileInfo {
  526.  public:
  527. @@ -215,9 +216,11 @@ public:
  528.      //! block header
  529.      int32_t nVersion;
  530.      uint256 hashMerkleRoot;
  531. +    uint32_t nReserved[7];
  532.      uint32_t nTime;
  533.      uint32_t nBits;
  534. -    uint32_t nNonce;
  535. +    uint256 nNonce;
  536. +    std::vector<unsigned char> nSolution;
  537.  
  538.      //! (memory only) Sequential id assigned to distinguish order in which
  539.      //! blocks are received.
  540. @@ -243,9 +246,11 @@ public:
  541.  
  542.          nVersion = 0;
  543.          hashMerkleRoot = uint256();
  544. +        memset(nReserved, 0, sizeof(nReserved));
  545.          nTime = 0;
  546.          nBits = 0;
  547. -        nNonce = 0;
  548. +        nNonce         = uint256();
  549. +        nSolution.clear();
  550.      }
  551.  
  552.      CBlockIndex() { SetNull(); }
  553. @@ -255,9 +260,13 @@ public:
  554.  
  555.          nVersion = block.nVersion;
  556.          hashMerkleRoot = block.hashMerkleRoot;
  557. +        // TODO(h4x3rotab): Copy nHeight or not?
  558. +        nHeight        = block.nHeight;
  559. +        memcpy(nReserved, block.nReserved, sizeof(nReserved));
  560.          nTime = block.nTime;
  561.          nBits = block.nBits;
  562.          nNonce = block.nNonce;
  563. +        nSolution      = block.nSolution;
  564.      }
  565.  
  566.      CDiskBlockPos GetBlockPos() const {
  567. @@ -285,9 +294,12 @@ public:
  568.              block.hashPrevBlock = pprev->GetBlockHash();
  569.          }
  570.          block.hashMerkleRoot = hashMerkleRoot;
  571. +        block.nHeight        = nHeight;
  572. +        memcpy(block.nReserved, nReserved, sizeof(block.nReserved));
  573.          block.nTime = nTime;
  574.          block.nBits = nBits;
  575.          block.nNonce = nNonce;
  576. +        block.nSolution      = nSolution;
  577.          return block;
  578.      }
  579.  
  580. @@ -413,9 +425,14 @@ public:
  581.          READWRITE(this->nVersion);
  582.          READWRITE(hashPrev);
  583.          READWRITE(hashMerkleRoot);
  584. +        //Yang
  585. +        for(size_t i = 0; i < (sizeof(nReserved) / sizeof(nReserved[0])); i++) {
  586. +            READWRITE(nReserved[i]);
  587. +        }
  588.          READWRITE(nTime);
  589.          READWRITE(nBits);
  590.          READWRITE(nNonce);
  591. +        READWRITE(nSolution);
  592.      }
  593.  
  594.      uint256 GetBlockHash() const {
  595. @@ -423,9 +440,12 @@ public:
  596.          block.nVersion        = nVersion;
  597.          block.hashPrevBlock   = hashPrev;
  598.          block.hashMerkleRoot  = hashMerkleRoot;
  599. +        block.nHeight         = nHeight;
  600. +        memcpy(block.nReserved, nReserved, sizeof(block.nReserved));
  601.          block.nTime           = nTime;
  602.          block.nBits           = nBits;
  603.          block.nNonce          = nNonce;
  604. +        block.nSolution       = nSolution;
  605.          return block.GetHash();
  606.      }
  607.  
  608. diff --git a/src/chainparams.cpp b/src/chainparams.cpp
  609. index 56a3245..76b6bf3 100644
  610. --- a/src/chainparams.cpp
  611. +++ b/src/chainparams.cpp
  612. @@ -6,11 +6,24 @@
  613.  #include "chainparams.h"
  614.  #include "consensus/merkle.h"
  615.  
  616. +#include "uint256.h"
  617. +#include "arith_uint256.h"
  618. +
  619.  #include "tinyformat.h"
  620.  #include "util.h"
  621.  #include "utilstrencodings.h"
  622.  
  623.  #include <cassert>
  624. +// For equihash_parameters_acceptable.
  625. +#include "crypto/equihash.h"
  626. +#include "net.h"
  627. +#include "validation.h"
  628. +#define equihash_parameters_acceptable(N, K) \
  629. +    ((CBlockHeader::HEADER_SIZE + equihash_solution_size(N, K))*MAX_HEADERS_RESULTS < \
  630. +     MAX_PROTOCOL_MESSAGE_LENGTH-1000)
  631. +
  632. +#include "base58.h"
  633. +#include <boost/assign/list_of.hpp>
  634.  
  635.  #include "chainparamsseeds.h"
  636.  
  637. @@ -43,10 +56,11 @@ static CBlock CreateGenesisBlock(const char *pszTimestamp,
  638.      CBlock genesis;
  639.      genesis.nTime    = nTime;
  640.      genesis.nBits    = nBits;
  641. -    genesis.nNonce = nNonce;
  642. +    genesis.nNonce   = ArithToUint256(arith_uint256(nNonce));
  643.      genesis.nVersion = nVersion;
  644.      genesis.vtx.push_back(MakeTransactionRef(std::move(txNew)));
  645.      genesis.hashPrevBlock.SetNull();
  646. +    genesis.nHeight  = 0;
  647.      genesis.hashMerkleRoot = BlockMerkleRoot(genesis);
  648.      return genesis;
  649.  }
  650. @@ -78,6 +92,8 @@ static CBlock CreateGenesisBlock(uint32_t nTime, uint32_t nNonce,
  651.                                nBits, nVersion, genesisReward);
  652.  }
  653.  
  654. +const arith_uint256 maxUint = UintToArith256(uint256S("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"));
  655. +
  656.  /**
  657.   * Main network
  658.   */
  659. @@ -102,11 +118,22 @@ public:
  660.          consensus.BIP66Height = 363725;
  661.          consensus.antiReplayOpReturnSunsetHeight = 530000;
  662.          consensus.antiReplayOpReturnCommitment = GetAntiReplayCommitment();
  663. -        consensus.powLimit = uint256S(
  664. -            "00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
  665. +        consensus.powLimit = uint256S("0007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
  666. +        consensus.powLimitLegacy = uint256S("00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
  667. +
  668. +        //based on https://github.com/BTCGPU/BTCGPU/issues/78
  669. +        consensus.nPowAveragingWindow = 30;
  670. +        assert(maxUint/UintToArith256(consensus.powLimit) >= consensus.nPowAveragingWindow);
  671. +        consensus.nPowMaxAdjustDown = 32;
  672. +        consensus.nPowMaxAdjustUp = 16;
  673. +
  674.          // two weeks
  675. -        consensus.nPowTargetTimespan = 14 * 24 * 60 * 60;
  676. +        consensus.nPowTargetTimespanLegacy = 14 * 24 * 60 * 60;
  677.          consensus.nPowTargetSpacing = 10 * 60;
  678. +        
  679. +        //Yang
  680. +        consensus.nPowTargetSpacingCDY = 2 * 60;
  681. +        
  682.          consensus.fPowAllowMinDifficultyBlocks = false;
  683.          consensus.fPowNoRetargeting = false;
  684.          // 95% of 2016
  685. @@ -131,14 +158,11 @@ public:
  686.  
  687.          // The best chain should have at least this much work.
  688.          consensus.nMinimumChainWork =
  689. -            uint256S("0x0000000000000000000000000000000000000000007e5dbf54c7f6b"
  690. -                     "58a6853cd");
  691. +            uint256S("0x00000000000000000000000000000000000000000082d89e5b8963ba7d734c61");
  692.  
  693.          // By default assume that the signatures in ancestors of this block are
  694.          // valid.
  695. -        consensus.defaultAssumeValid =
  696. -            uint256S("0x000000000000000005e14d3f9fdfb70745308706615cfa9edca4f45"
  697. -                     "58332b201");
  698. +        consensus.defaultAssumeValid = uint256S("0x000000000000000003d0f45045742bb557f1a6c633cdb9de53564eb7ec4459d0"); // block hash 512665
  699.  
  700.          // Aug, 1 hard fork
  701.          consensus.uahfHeight = 478559;
  702. @@ -146,6 +170,11 @@ public:
  703.          // Nov, 13 hard fork
  704.          consensus.daaHeight = 504031;
  705.  
  706. +        //  hard fork-----add by hmc
  707. +        consensus.cdyHeight = 512666;
  708. +        consensus.BitcoinPostforkBlock = uint256S("0000000000000000007b746068bd08ba4089f97636690e9dc758774e7db21f17"); // 512666 block hash
  709. +        consensus.BitcoinPostforkTime = 1515799972;
  710. +
  711.          /**
  712.           * The message start string is designed to be unlikely to occur in
  713.           * normal data. The characters are rarely used upper ASCII, not valid as
  714. @@ -156,15 +185,26 @@ public:
  715.          diskMagic[2] = 0xb4;
  716.          diskMagic[3] = 0xd9;
  717.          netMagic[0] = 0xe3;
  718. -        netMagic[1] = 0xe1;
  719. -        netMagic[2] = 0xf3;
  720. -        netMagic[3] = 0xe8;
  721. -        nDefaultPort = 8333;
  722. +        netMagic[1] = 0xc3;    // 0x80 + 0x43 'C'
  723. +        netMagic[2] = 0xc4; // 0x80 + 0x44 'D'
  724. +        netMagic[3] = 0xd9; // 0x80 + 0x59 'Y'
  725. +        netMagicLegacy[0] = 0xe3; // BCH
  726. +        netMagicLegacy[1] = 0xe1; // BCH
  727. +        netMagicLegacy[2] = 0xf3; // BCH
  728. +        netMagicLegacy[3] = 0xe8; // BCH
  729. +
  730. +        // use different default
  731. +        nDefaultPort = 8367;
  732. +       nBitcoinDefaultPort = 8333;
  733.          nPruneAfterHeight = 100000;
  734. +        const size_t N = 200, K = 9;
  735. +        BOOST_STATIC_ASSERT(equihash_parameters_acceptable(N, K));
  736. +        nEquihashN = N;
  737. +        nEquihashK = K;
  738.  
  739.          genesis = CreateGenesisBlock(1231006505, 2083236893, 0x1d00ffff, 1,
  740.                                       50 * COIN);
  741. -        consensus.hashGenesisBlock = genesis.GetHash();
  742. +        consensus.hashGenesisBlock = genesis.GetHash(consensus);
  743.          assert(consensus.hashGenesisBlock ==
  744.                 uint256S("0x000000000019d6689c085ae165831e934ff763ae46a2a6c172b3"
  745.                          "f1b60a8ce26f"));
  746. @@ -176,29 +216,15 @@ public:
  747.          // subset of possible options.
  748.          // Bitcoin ABC seeder
  749.          vSeeds.push_back(
  750. -            CDNSSeedData("bitcoinabc.org", "seed.bitcoinabc.org", true));
  751. -        // bitcoinforks seeders
  752. -        vSeeds.push_back(CDNSSeedData("bitcoinforks.org",
  753. -                                      "seed-abc.bitcoinforks.org", true));
  754. -        // BU backed seeder
  755. -        vSeeds.push_back(CDNSSeedData("bitcoinunlimited.info",
  756. -                                      "btccash-seeder.bitcoinunlimited.info",
  757. -                                      true));
  758. -        // Bitprim
  759. -        vSeeds.push_back(CDNSSeedData("bitprim.org", "seed.bitprim.org", true));
  760. -        // Amaury S횋CHET
  761. -        vSeeds.push_back(
  762. -            CDNSSeedData("deadalnix.me", "seed.deadalnix.me", true));
  763. -        // criptolayer.net
  764. -        vSeeds.push_back(
  765. -            CDNSSeedData("criptolayer.net", "seeder.criptolayer.net", true));
  766. +            CDNSSeedData("bitcoincandy.one", "seed.bitcoincandy.one", true));
  767. +        vSeeds.push_back(CDNSSeedData("cdy.one", "seed.cdy.one", true));
  768.  
  769. -        base58Prefixes[PUBKEY_ADDRESS] = std::vector<uint8_t>(1, 0);
  770. -        base58Prefixes[SCRIPT_ADDRESS] = std::vector<uint8_t>(1, 5);
  771. +        base58Prefixes[PUBKEY_ADDRESS] = std::vector<uint8_t>(1, 0x1c); // 'C'
  772. +        base58Prefixes[SCRIPT_ADDRESS] = std::vector<uint8_t>(1, 0x58); // 'c'
  773.          base58Prefixes[SECRET_KEY] = std::vector<uint8_t>(1, 128);
  774.          base58Prefixes[EXT_PUBLIC_KEY] = {0x04, 0x88, 0xB2, 0x1E};
  775.          base58Prefixes[EXT_SECRET_KEY] = {0x04, 0x88, 0xAD, 0xE4};
  776. -        cashaddrPrefix = "bitcoincash";
  777. +        cashaddrPrefix = "bitcoincandy";
  778.  
  779.          vFixedSeeds = std::vector<SeedSpec6>(
  780.              pnSeed6_main, pnSeed6_main + ARRAYLEN(pnSeed6_main));
  781. @@ -276,11 +302,19 @@ public:
  782.          consensus.BIP66Height = 330776;
  783.          consensus.antiReplayOpReturnSunsetHeight = 1250000;
  784.          consensus.antiReplayOpReturnCommitment = GetAntiReplayCommitment();
  785. -        consensus.powLimit = uint256S(
  786. -            "00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
  787. +        consensus.powLimit = uint256S("0007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
  788. +       consensus.powLimitLegacy = uint256S("00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
  789. +
  790. +        //based on https://github.com/BTCGPU/BTCGPU/issues/78
  791. +        consensus.nPowAveragingWindow = 30;
  792. +        assert(maxUint/UintToArith256(consensus.powLimit) >= consensus.nPowAveragingWindow);
  793. +        consensus.nPowMaxAdjustDown = 32;
  794. +        consensus.nPowMaxAdjustUp = 16;
  795. +
  796.          // two weeks
  797. -        consensus.nPowTargetTimespan = 14 * 24 * 60 * 60;
  798. +        consensus.nPowTargetTimespanLegacy = 14 * 24 * 60 * 60;
  799.          consensus.nPowTargetSpacing = 10 * 60;
  800. +        consensus.nPowTargetSpacingCDY = 2 * 60;
  801.          consensus.fPowAllowMinDifficultyBlocks = true;
  802.          consensus.fPowNoRetargeting = false;
  803.          // 75% for testchains
  804. @@ -305,8 +339,7 @@ public:
  805.  
  806.          // The best chain should have at least this much work.
  807.          consensus.nMinimumChainWork =
  808. -            uint256S("0x00000000000000000000000000000000000000000000002888c34d6"
  809. -                     "1b53a244a");
  810. +            uint256S("0000000000000000000000000000000000000000000000000453e926d09ebe87");
  811.  
  812.          // By default assume that the signatures in ancestors of this block are
  813.          // valid.
  814. @@ -320,20 +353,42 @@ public:
  815.          // Nov, 13 hard fork
  816.          consensus.daaHeight = 1188697;
  817.          
  818. +        //  hard fork-----add by hmc
  819. +        consensus.cdyHeight = 201601;
  820. +        consensus.BitcoinPostforkBlock = uint256S("00000000d16d6c2aecc7436eea0c54a53741fee9abf265606aa465d6fd3f3d8a"); // block 201601
  821. +        consensus.BitcoinPostforkTime = 1393815074;
  822. +
  823.          diskMagic[0] = 0x0b;
  824.          diskMagic[1] = 0x11;
  825.          diskMagic[2] = 0x09;
  826.          diskMagic[3] = 0x07;
  827.          netMagic[0] = 0xf4;
  828. -        netMagic[1] = 0xe5;
  829. -        netMagic[2] = 0xf3;
  830. -        netMagic[3] = 0xf4;
  831. -        nDefaultPort = 18333;
  832. +        netMagic[1] = 0x43;    // 'C'
  833. +        netMagic[2] = 0x44; // 'D'
  834. +        netMagic[3] = 0x59; // 'Y'
  835. +        // BTC
  836. +        netMagicLegacy[0] = 0x0b;
  837. +        netMagicLegacy[1] = 0x11;
  838. +        netMagicLegacy[2] = 0x09;
  839. +        netMagicLegacy[3] = 0x07;
  840. +        // BCH
  841. +        // netMagicLegacy[0] = 0xf4;
  842. +        // netMagicLegacy[1] = 0xe5;
  843. +        // netMagicLegacy[2] = 0xf3;
  844. +        // netMagicLegacy[3] = 0xf4;
  845. +
  846. +        // use different default
  847. +        nDefaultPort = 18367;
  848. +       nBitcoinDefaultPort = 18333;
  849.          nPruneAfterHeight = 1000;
  850. +        const size_t N = 200, K = 9;
  851. +        BOOST_STATIC_ASSERT(equihash_parameters_acceptable(N, K));
  852. +        nEquihashN = N;
  853. +        nEquihashK = K;
  854.  
  855.          genesis =
  856.              CreateGenesisBlock(1296688602, 414098458, 0x1d00ffff, 1, 50 * COIN);
  857. -        consensus.hashGenesisBlock = genesis.GetHash();
  858. +        consensus.hashGenesisBlock = genesis.GetHash(consensus);
  859.          assert(consensus.hashGenesisBlock ==
  860.                 uint256S("0x000000000933ea01ad0ee984209779baaec3ced90fa3f4087195"
  861.                          "26f8d77f4943"));
  862. @@ -345,27 +400,14 @@ public:
  863.          vSeeds.clear();
  864.          // nodes with support for servicebits filtering should be at the top
  865.          // Bitcoin ABC seeder
  866. -        vSeeds.push_back(CDNSSeedData("bitcoinabc.org",
  867. -                                      "testnet-seed.bitcoinabc.org", true));
  868. -        // bitcoinforks seeders
  869. -        vSeeds.push_back(CDNSSeedData(
  870. -            "bitcoinforks.org", "testnet-seed-abc.bitcoinforks.org", true));
  871. -        // Bitprim
  872. -        vSeeds.push_back(
  873. -            CDNSSeedData("bitprim.org", "testnet-seed.bitprim.org", true));
  874. -        // Amaury S횋CHET
  875. -        vSeeds.push_back(
  876. -            CDNSSeedData("deadalnix.me", "testnet-seed.deadalnix.me", true));
  877. -        // criptolayer.net
  878. -        vSeeds.push_back(CDNSSeedData("criptolayer.net",
  879. -                                      "testnet-seeder.criptolayer.net", true));
  880. +        vSeeds.push_back(CDNSSeedData("bitcoincandy.one", "testnet-seed.bitcoincandy.one", true));
  881.  
  882.          base58Prefixes[PUBKEY_ADDRESS] = std::vector<uint8_t>(1, 111);
  883.          base58Prefixes[SCRIPT_ADDRESS] = std::vector<uint8_t>(1, 196);
  884.          base58Prefixes[SECRET_KEY] = std::vector<uint8_t>(1, 239);
  885.          base58Prefixes[EXT_PUBLIC_KEY] = {0x04, 0x35, 0x87, 0xCF};
  886.          base58Prefixes[EXT_SECRET_KEY] = {0x04, 0x35, 0x83, 0x94};
  887. -        cashaddrPrefix = "bchtest";
  888. +        cashaddrPrefix = "cdytest";
  889.          vFixedSeeds = std::vector<SeedSpec6>(
  890.              pnSeed6_test, pnSeed6_test + ARRAYLEN(pnSeed6_test));
  891.  
  892. @@ -412,11 +454,19 @@ public:
  893.          consensus.BIP66Height = 1251;
  894.          consensus.antiReplayOpReturnSunsetHeight = 530000;
  895.          consensus.antiReplayOpReturnCommitment = GetAntiReplayCommitment();
  896. -        consensus.powLimit = uint256S(
  897. -            "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
  898. +        consensus.powLimit = uint256S("7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
  899. +       consensus.powLimitLegacy = uint256S("7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
  900. +
  901. +        //based on https://github.com/BTCGPU/BTCGPU/issues/78
  902. +        consensus.nPowAveragingWindow = 30;
  903. +        //assert(maxUint/UintToArith256(consensus.powLimit) >= consensus.nPowAveragingWindow);
  904. +        consensus.nPowMaxAdjustDown = 32;
  905. +        consensus.nPowMaxAdjustUp = 16;
  906. +
  907.          // two weeks
  908. -        consensus.nPowTargetTimespan = 14 * 24 * 60 * 60;
  909. +        consensus.nPowTargetTimespanLegacy = 14 * 24 * 60 * 60;
  910.          consensus.nPowTargetSpacing = 10 * 60;
  911. +        consensus.nPowTargetSpacingCDY = 2 * 60;
  912.          consensus.fPowAllowMinDifficultyBlocks = true;
  913.          consensus.fPowNoRetargeting = true;
  914.          // 75% for testchains
  915. @@ -440,10 +490,13 @@ public:
  916.          consensus.defaultAssumeValid = uint256S("0x00");
  917.  
  918.          // Hard fork is always enabled on regtest.
  919. -        consensus.uahfHeight = 0;
  920. +        consensus.uahfHeight = 2017;
  921. +
  922. +        //  hard fork-----add by hmc
  923. +        consensus.cdyHeight = 2260;
  924.  
  925.          // Nov, 13 hard fork is always on on regtest.
  926. -        consensus.daaHeight = 0;
  927. +        consensus.daaHeight = 2250;
  928.  
  929.          diskMagic[0] = 0xfa;
  930.          diskMagic[1] = 0xbf;
  931. @@ -455,9 +508,13 @@ public:
  932.          netMagic[3] = 0xfa;
  933.          nDefaultPort = 18444;
  934.          nPruneAfterHeight = 1000;
  935. +        const size_t N = 48, K = 5;
  936. +        BOOST_STATIC_ASSERT(equihash_parameters_acceptable(N, K));
  937. +        nEquihashN = N;
  938. +        nEquihashK = K;
  939.  
  940.          genesis = CreateGenesisBlock(1296688602, 2, 0x207fffff, 1, 50 * COIN);
  941. -        consensus.hashGenesisBlock = genesis.GetHash();
  942. +        consensus.hashGenesisBlock = genesis.GetHash(consensus);
  943.          assert(consensus.hashGenesisBlock ==
  944.                 uint256S("0x0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b"
  945.                          "1a11466e2206"));
  946. @@ -487,7 +544,7 @@ public:
  947.          base58Prefixes[SECRET_KEY] = std::vector<uint8_t>(1, 239);
  948.          base58Prefixes[EXT_PUBLIC_KEY] = {0x04, 0x35, 0x87, 0xCF};
  949.          base58Prefixes[EXT_SECRET_KEY] = {0x04, 0x35, 0x83, 0x94};
  950. -        cashaddrPrefix = "bchreg";
  951. +        cashaddrPrefix = "cdyreg";
  952.      }
  953.  
  954.      void UpdateBIP9Parameters(Consensus::DeploymentPos d, int64_t nStartTime,
  955. diff --git a/src/chainparams.h b/src/chainparams.h
  956. index 1d9c4bf..d4013e2 100644
  957. --- a/src/chainparams.h
  958. +++ b/src/chainparams.h
  959. @@ -61,7 +61,8 @@ public:
  960.      const Consensus::Params &GetConsensus() const { return consensus; }
  961.      const CMessageHeader::MessageMagic &DiskMagic() const { return diskMagic; }
  962.      const CMessageHeader::MessageMagic &NetMagic() const { return netMagic; }
  963. -    int GetDefaultPort() const { return nDefaultPort; }
  964. +    int GetDefaultPort(bool bootstrapping = false) const { return bootstrapping ? nBitcoinDefaultPort : nDefaultPort; }
  965. +    const CMessageHeader::MessageMagic& NetMagicLegacy() const { return netMagicLegacy; }
  966.  
  967.      const CBlock &GenesisBlock() const { return genesis; }
  968.      /** Make miner wait to have peers to avoid wasting work */
  969. @@ -71,6 +72,8 @@ public:
  970.      /** Policy: Filter transactions that do not match well-defined patterns */
  971.      bool RequireStandard() const { return fRequireStandard; }
  972.      uint64_t PruneAfterHeight() const { return nPruneAfterHeight; }
  973. +    unsigned int EquihashN() const { return nEquihashN; }
  974. +    unsigned int EquihashK() const { return nEquihashK; }
  975.      /**
  976.       * Make miner stop after a block is found. In RPC, don't return until
  977.       * nGenProcLimit blocks are generated.
  978. @@ -93,7 +96,11 @@ protected:
  979.      Consensus::Params consensus;
  980.      CMessageHeader::MessageMagic diskMagic;
  981.      CMessageHeader::MessageMagic netMagic;
  982. +    CMessageHeader::MessageMagic netMagicLegacy;
  983.      int nDefaultPort;
  984. +    int nBitcoinDefaultPort;
  985. +    unsigned int nEquihashN = 0;
  986. +    unsigned int nEquihashK = 0;
  987.      uint64_t nPruneAfterHeight;
  988.      std::vector<CDNSSeedData> vSeeds;
  989.      std::vector<uint8_t> base58Prefixes[MAX_BASE58_TYPES];
  990. diff --git a/src/chainparamsbase.cpp b/src/chainparamsbase.cpp
  991. index bdb429f..554b16b 100644
  992. --- a/src/chainparamsbase.cpp
  993. +++ b/src/chainparamsbase.cpp
  994. @@ -31,7 +31,7 @@ void AppendParamsHelpMessages(std::string &strUsage, bool debugHelp) {
  995.   */
  996.  class CBaseMainParams : public CBaseChainParams {
  997.  public:
  998. -    CBaseMainParams() { nRPCPort = 8332; }
  999. +    CBaseMainParams() { nRPCPort = 8366; }
  1000.  };
  1001.  static CBaseMainParams mainParams;
  1002.  
  1003. @@ -41,7 +41,7 @@ static CBaseMainParams mainParams;
  1004.  class CBaseTestNetParams : public CBaseChainParams {
  1005.  public:
  1006.      CBaseTestNetParams() {
  1007. -        nRPCPort = 18332;
  1008. +        nRPCPort = 18366;
  1009.          strDataDir = "testnet3";
  1010.      }
  1011.  };
  1012. @@ -53,7 +53,7 @@ static CBaseTestNetParams testNetParams;
  1013.  class CBaseRegTestParams : public CBaseChainParams {
  1014.  public:
  1015.      CBaseRegTestParams() {
  1016. -        nRPCPort = 18332;
  1017. +        nRPCPort = 18366;
  1018.          strDataDir = "regtest";
  1019.      }
  1020.  };
  1021. diff --git a/src/chainparamsseeds.h b/src/chainparamsseeds.h
  1022. index 0dfe0ab..ba73164 100644
  1023. --- a/src/chainparamsseeds.h
  1024. +++ b/src/chainparamsseeds.h
  1025. @@ -8,1537 +8,8 @@
  1026.   * IPv4 as well as onion addresses are wrapped inside a IPv6 address accordingly.
  1027.   */
  1028.  static SeedSpec6 pnSeed6_main[] = {
  1029. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x01,0x20,0xc8,0x78}, 8333},
  1030. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x02,0x21,0x16,0xa1}, 8333},
  1031. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x09,0x13,0x6d}, 8333},
  1032. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x09,0x1c,0x0a}, 8333},
  1033. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x09,0x90,0x53}, 8333},
  1034. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x09,0xdc,0x84}, 8333},
  1035. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x2c,0x61,0x6e}, 8333},
  1036. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x38,0x28,0x01}, 8333},
  1037. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x38,0x32,0x71}, 8333},
  1038. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x38,0xf7,0x45}, 8333},
  1039. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x3d,0x21,0xdc}, 8333},
  1040. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x3d,0x28,0x38}, 8333},
  1041. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x4f,0x4f,0x96}, 8333},
  1042. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x67,0x89,0x92}, 8333},
  1043. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x87,0x9d,0x11}, 8333},
  1044. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xbd,0x90,0xfa}, 8333},
  1045. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xbd,0x99,0x85}, 8333},
  1046. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xbd,0xa4,0x93}, 8333},
  1047. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xbd,0xac,0xc8}, 8333},
  1048. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xbd,0xbf,0x7b}, 8335},
  1049. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xe6,0x91,0x82}, 8333},
  1050. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xf9,0x3a,0x4c}, 8333},
  1051. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x08,0x26,0x58,0x7e}, 8333},
  1052. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0c,0x17,0x7f,0xaf}, 8333},
  1053. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x36,0x5f,0x93}, 8333},
  1054. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x36,0xe0,0x54}, 8333},
  1055. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x37,0x83,0xf0}, 8333},
  1056. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x37,0xc8,0xb1}, 8333},
  1057. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x38,0xa8,0x40}, 8333},
  1058. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x44,0xda,0xf6}, 8333},
  1059. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x49,0x00,0x3d}, 8333},
  1060. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x4e,0x70,0x0b}, 8333},
  1061. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x52,0x5c,0xc9}, 8333},
  1062. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x5c,0x52,0xeb}, 8333},
  1063. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x5e,0x29,0x52}, 8333},
  1064. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x72,0x7f,0xbd}, 8333},
  1065. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x72,0xee,0xb8}, 8333},
  1066. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x72,0xf5,0xa0}, 8333},
  1067. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x7c,0x6e,0x65}, 8333},
  1068. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x7d,0x17,0xa4}, 8333},
  1069. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x7d,0x3b,0x87}, 8333},
  1070. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x7e,0x0a,0x03}, 8333},
  1071. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x7e,0x1f,0x8d}, 8333},
  1072. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x7e,0x20,0x67}, 8333},
  1073. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x7e,0x28,0x32}, 8333},
  1074. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x7e,0x5d,0x82}, 8333},
  1075. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x7e,0x8b,0xb6}, 8333},
  1076. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x7e,0x9b,0x3f}, 8333},
  1077. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x7e,0xd1,0x75}, 8333},
  1078. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x7e,0xe2,0xdd}, 8333},
  1079. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x7e,0xec,0x29}, 8333},
  1080. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x7e,0xef,0x57}, 8333},
  1081. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x7e,0xef,0xdb}, 8333},
  1082. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0xd2,0x1e,0x16}, 8333},
  1083. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0xd2,0xb0,0x7c}, 8333},
  1084. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0xe4,0x6d,0x99}, 8333},
  1085. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0xe5,0x39,0x19}, 8333},
  1086. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0xe5,0x39,0xd5}, 8333},
  1087. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0xe5,0x3b,0xf0}, 8333},
  1088. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0xe5,0x3e,0xbf}, 8333},
  1089. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0xe5,0x3f,0x32}, 8333},
  1090. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0xe5,0x71,0x8f}, 8333},
  1091. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0xe5,0x7a,0xc4}, 8333},
  1092. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0e,0x03,0x26,0xb3}, 8333},
  1093. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0e,0x22,0xae,0xb5}, 8333},
  1094. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0e,0x3f,0x07,0x3c}, 8333},
  1095. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0e,0xa1,0x03,0x88}, 8333},
  1096. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x12,0x66,0xde,0x7d}, 8335},
  1097. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x12,0x66,0xde,0x7e}, 8335},
  1098. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x12,0x66,0xde,0xeb}, 8335},
  1099. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x12,0xc4,0x00,0xf2}, 8333},
  1100. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0x5b,0xef,0x4c}, 8333},
  1101. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0x61,0x4c,0x60}, 8333},
  1102. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0x63,0xcc,0x47}, 8333},
  1103. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0x7e,0x7e,0x7b}, 8333},
  1104. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0xf2,0x89,0xed}, 8333},
  1105. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x04,0xdf,0x07}, 8333},
  1106. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x06,0x23,0x54}, 8333},
  1107. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x06,0xbb,0x4f}, 8333},
  1108. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x10,0x4b,0x80}, 8333},
  1109. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x1c,0x1f,0x2d}, 8333},
  1110. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x2c,0x04,0x5d}, 8333},
  1111. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x30,0x0d,0x57}, 8333},
  1112. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x41,0x38,0x89}, 8333},
  1113. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x47,0x22,0xc6}, 8333},
  1114. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x47,0x28,0x2e}, 8333},
  1115. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x4c,0x7a,0x6c}, 8090},
  1116. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x5b,0x54,0xf1}, 8333},
  1117. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x71,0xc1,0x18}, 8333},
  1118. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x78,0xaf,0xf3}, 8333},
  1119. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xb0,0x0d,0x0a}, 8333},
  1120. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xbe,0x32,0x71}, 8333},
  1121. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xbe,0x73,0x7c}, 8333},
  1122. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xbe,0x7a,0xd5}, 8333},
  1123. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xc0,0x36,0x80}, 8333},
  1124. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xc4,0xb1,0x9f}, 8333},
  1125. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xcd,0x8f,0xb2}, 8333},
  1126. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xd1,0x74,0x86}, 8333},
  1127. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xd4,0x8c,0xa3}, 28333},
  1128. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xe1,0x7a,0xec}, 8333},
  1129. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xfd,0x95,0x8f}, 8333},
  1130. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1b,0x20,0x49,0x80}, 8333},
  1131. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1b,0xfc,0xc2,0x88}, 8333},
  1132. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0xb2,0xb1,0xc3}, 8343},
  1133. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0xd0,0xb7,0x23}, 8333},
  1134. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0xd1,0x3b,0xb3}, 21824},
  1135. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x22,0xc8,0xe0,0xb6}, 8333},
  1136. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x22,0xcf,0x5b,0x0e}, 8333},
  1137. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x22,0xd3,0x69,0x49}, 8333},
  1138. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x22,0xd6,0x50,0x33}, 8333},
  1139. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x22,0xd7,0x7f,0xdf}, 8333},
  1140. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x22,0xd8,0x32,0x02}, 8333},
  1141. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x22,0xe1,0x6b,0x8e}, 8333},
  1142. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x22,0xe3,0x2f,0xff}, 8333},
  1143. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x22,0xe4,0xf4,0x31}, 8333},
  1144. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x22,0xe5,0xcd,0xdd}, 8333},
  1145. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x22,0xf8,0x25,0x20}, 8333},
  1146. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x22,0xf8,0xa0,0x43}, 8333},
  1147. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x22,0xfa,0x39,0xd6}, 8333},
  1148. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x22,0xfa,0xe4,0x94}, 8333},
  1149. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x22,0xfb,0x31,0x63}, 8333},
  1150. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x22,0xfb,0xf9,0x9f}, 8333},
  1151. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x22,0xfd,0x29,0x98}, 8333},
  1152. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x22,0xfd,0x89,0x7d}, 8333},
  1153. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0x9a,0x65,0xfe}, 8333},
  1154. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0x9a,0x95,0x80}, 8333},
  1155. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0x9a,0x99,0xbc}, 8333},
  1156. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0x9a,0xfa,0x72}, 8333},
  1157. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0x9c,0x76,0x94}, 8333},
  1158. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0x9c,0x84,0xb9}, 8333},
  1159. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0x9c,0xe1,0xbe}, 8333},
  1160. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0x9d,0xe3,0x91}, 8333},
  1161. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0x9d,0xf4,0xe1}, 8333},
  1162. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0x9e,0x52,0x9c}, 8333},
  1163. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0x9e,0xbe,0xee}, 8333},
  1164. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0x9e,0xc0,0x3c}, 8333},
  1165. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0x9e,0xd0,0xaa}, 8333},
  1166. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0x9e,0xe2,0x8e}, 8333},
  1167. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0x9e,0xf0,0xae}, 8333},
  1168. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0x9e,0xf6,0x1b}, 8333},
  1169. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0xa2,0x84,0x60}, 8333},
  1170. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0xa6,0xf4,0x0a}, 8333},
  1171. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0xb1,0x93,0xff}, 8333},
  1172. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0xb6,0x66,0x2c}, 8333},
  1173. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0xc0,0x0c,0xb5}, 8333},
  1174. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0xc5,0x19,0xeb}, 8333},
  1175. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0xc5,0x45,0x79}, 8333},
  1176. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0xc6,0x48,0x00}, 8333},
  1177. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0xc6,0x96,0xe9}, 8333},
  1178. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0xc6,0xaa,0x8b}, 8333},
  1179. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0xc9,0x8f,0x38}, 8333},
  1180. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0xe1,0x72,0x8a}, 8333},
  1181. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0xe2,0xc3,0xb0}, 8333},
  1182. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x2e,0xf6,0x1c}, 8333},
  1183. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x3b,0x28,0xc6}, 8333},
  1184. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x3d,0xee,0x36}, 8333},
  1185. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x3d,0xee,0x84}, 8333},
  1186. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x6e,0x3b,0xe6}, 8333},
  1187. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x78,0xa4,0x10}, 18333},
  1188. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x8f,0xf3,0x3f}, 8333},
  1189. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0xbb,0x69,0x41}, 8333},
  1190. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0xbb,0x8d,0x49}, 8333},
  1191. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0xdd,0xc6,0x39}, 28333},
  1192. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0xf7,0x16,0x35}, 8533},
  1193. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6a,0xfa,0x96}, 8363},
  1194. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6c,0x0d,0x66}, 8333},
  1195. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6c,0x0e,0xa6}, 8333},
  1196. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6c,0x47,0xfe}, 8333},
  1197. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6c,0x64,0x7a}, 8333},
  1198. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6c,0x6b,0x78}, 8333},
  1199. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6c,0xc3,0x36}, 8333},
  1200. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6c,0xc3,0x6d}, 8333},
  1201. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6c,0xf6,0xa3}, 8333},
  1202. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6c,0xf6,0xaa}, 8333},
  1203. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6c,0xf6,0xac}, 8333},
  1204. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6c,0xf6,0xb0}, 8333},
  1205. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6c,0xf6,0xb8}, 8333},
  1206. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6c,0xf6,0xbd}, 8333},
  1207. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6c,0xf6,0xc6}, 8333},
  1208. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6c,0xf6,0xda}, 8333},
  1209. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6c,0xf6,0xdc}, 8333},
  1210. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6c,0xf6,0xdf}, 8333},
  1211. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6c,0xf6,0xe2}, 8333},
  1212. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6c,0xf6,0xee}, 8333},
  1213. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x28,0x7e,0xfd,0xb4}, 8333},
  1214. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x29,0x32,0x60,0x65}, 8333},
  1215. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2a,0x77,0x2a,0x5c}, 8333},
  1216. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2a,0x77,0x2b,0x2e}, 8333},
  1217. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x14,0x98,0x89}, 8333},
  1218. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x20,0x06,0xad}, 8333},
  1219. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x20,0x2e,0xc6}, 8333},
  1220. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x20,0x41,0x23}, 8333},
  1221. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x20,0xe9,0xe1}, 8333},
  1222. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x21,0x0e,0x1b}, 8333},
  1223. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x21,0x14,0x31}, 8333},
  1224. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x21,0x30,0x2a}, 8333},
  1225. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x21,0x7a,0xfe}, 8333},
  1226. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x30,0xa5,0x4c}, 8333},
  1227. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x3a,0x37,0xba}, 8333},
  1228. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x3f,0x33,0x0a}, 8333},
  1229. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x4d,0xdb,0x32}, 8333},
  1230. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x4e,0x80,0x05}, 8334},
  1231. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x4f,0x43,0xe6}, 8333},
  1232. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x4f,0x4e,0xe9}, 8333},
  1233. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x4f,0x59,0xfd}, 8333},
  1234. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x4f,0x63,0xdc}, 8333},
  1235. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x4f,0xa2,0x8f}, 8333},
  1236. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x4f,0xce,0xad}, 8333},
  1237. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x76,0x85,0xf2}, 8333},
  1238. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x7b,0x67,0x73}, 8333},
  1239. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x04,0x55,0xf1}, 9090},
  1240. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x09,0x7c,0x92}, 8333},
  1241. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x1c,0xcc,0x3d}, 17302},
  1242. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x3b,0x2d,0x00}, 8333},
  1243. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x3d,0x11,0x51}, 8333},
  1244. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x65,0xf0,0xb8}, 8333},
  1245. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x65,0xfe,0xd7}, 8333},
  1246. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x67,0xf8,0x2d}, 8333},
  1247. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x69,0x62,0xb3}, 8333},
  1248. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x6d,0x65,0xc6}, 8333},
  1249. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xa2,0x01,0x5d}, 8333},
  1250. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xa5,0xdd,0xd1}, 9333},
  1251. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xd8,0x28,0xae}, 8333},
  1252. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xd8,0x30,0x7b}, 8333},
  1253. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xe9,0x2b,0x9b}, 8333},
  1254. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xf6,0x26,0x6f}, 8333},
  1255. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x04,0x74}, 8333},
  1256. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x09,0x50}, 8333},
  1257. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x09,0x5d}, 8333},
  1258. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x09,0x69}, 8333},
  1259. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x09,0xb9}, 8333},
  1260. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x09,0xc6}, 8333},
  1261. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x09,0xdb}, 8333},
  1262. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x09,0xf2}, 8333},
  1263. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x09,0xf9}, 8333},
  1264. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x0a,0x00}, 8333},
  1265. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x0a,0x0c}, 8333},
  1266. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x0a,0x14}, 8333},
  1267. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x0a,0x1a}, 8333},
  1268. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x0a,0x1b}, 8333},
  1269. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x0a,0x2f}, 8333},
  1270. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x0a,0x32}, 8333},
  1271. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x0a,0x36}, 8333},
  1272. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x0a,0x3b}, 8333},
  1273. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x0a,0x3d}, 8333},
  1274. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x0a,0x43}, 8333},
  1275. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x0a,0x46}, 8333},
  1276. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x0a,0x5c}, 8333},
  1277. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x0a,0x5e}, 8333},
  1278. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x0a,0x61}, 8333},
  1279. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x0a,0x69}, 8333},
  1280. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x0a,0xef}, 8333},
  1281. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x0a,0xf4}, 8333},
  1282. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x25,0x2a}, 8333},
  1283. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x26,0x61}, 8333},
  1284. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x67,0x75}, 8333},
  1285. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x6a,0xfd}, 8333},
  1286. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x4a,0x16,0x67}, 8333},
  1287. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x20,0x4c}, 8333},
  1288. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x20,0xce}, 8333},
  1289. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x20,0xeb}, 8333},
  1290. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x21,0x00}, 8333},
  1291. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x21,0x33}, 8333},
  1292. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x21,0x3c}, 8333},
  1293. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x21,0xa9}, 8333},
  1294. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x21,0xcd}, 8333},
  1295. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x21,0xd7}, 8333},
  1296. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x21,0xf8}, 8333},
  1297. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x22,0x15}, 8333},
  1298. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x22,0x1a}, 8333},
  1299. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x22,0x79}, 8333},
  1300. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x22,0x83}, 8333},
  1301. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x22,0x8e}, 8333},
  1302. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x22,0xaf}, 8333},
  1303. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x22,0xbe}, 8333},
  1304. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x22,0xf8}, 8333},
  1305. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x23,0x36}, 8333},
  1306. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x39,0x63}, 8333},
  1307. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x3e,0x64}, 8333},
  1308. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x4c,0x86}, 8333},
  1309. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x4c,0xbe}, 8333},
  1310. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x4c,0xd3}, 8333},
  1311. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x4d,0x0d}, 8333},
  1312. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x4d,0x2a}, 8333},
  1313. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x4d,0xb2}, 8333},
  1314. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x4d,0xf4}, 8333},
  1315. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x4e,0x0e}, 8333},
  1316. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x4e,0x74}, 8333},
  1317. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x4e,0x78}, 8333},
  1318. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x4e,0xbb}, 8333},
  1319. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x4e,0xe4}, 8333},
  1320. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x4e,0xf1}, 8333},
  1321. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x4f,0x2a}, 8333},
  1322. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x4f,0x30}, 8333},
  1323. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x4f,0x40}, 8333},
  1324. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x4f,0x58}, 8333},
  1325. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x4f,0x5e}, 8333},
  1326. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbc,0x05}, 8333},
  1327. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbc,0x06}, 8333},
  1328. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbc,0x0f}, 8333},
  1329. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbc,0x40}, 8333},
  1330. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbc,0x61}, 8333},
  1331. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbc,0x89}, 8333},
  1332. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbc,0x8f}, 8333},
  1333. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbc,0xad}, 8333},
  1334. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbc,0xbb}, 8333},
  1335. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbc,0xc9}, 8333},
  1336. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbc,0xe7}, 8333},
  1337. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbc,0xf6}, 8333},
  1338. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbd,0x02}, 8333},
  1339. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbd,0x37}, 8333},
  1340. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbd,0x41}, 8333},
  1341. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbd,0x86}, 8333},
  1342. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbd,0xb4}, 8333},
  1343. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbd,0xc9}, 8333},
  1344. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbe,0x0a}, 8333},
  1345. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbe,0x5a}, 8333},
  1346. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbe,0x71}, 8333},
  1347. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbe,0xe1}, 8333},
  1348. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbf,0x1f}, 8333},
  1349. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbf,0x6a}, 8333},
  1350. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbf,0x8e}, 8333},
  1351. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbf,0xb0}, 8333},
  1352. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xbf,0xd1}, 8333},
  1353. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xc0,0x7a}, 8333},
  1354. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xc0,0xb3}, 8333},
  1355. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xc0,0xc9}, 8333},
  1356. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xc0,0xdf}, 8333},
  1357. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xc0,0xed}, 8333},
  1358. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xc1,0x16}, 8333},
  1359. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xc1,0x5d}, 8333},
  1360. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0xc3,0x82}, 8333},
  1361. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x59,0x2e,0xd1}, 8333},
  1362. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x59,0xb1,0x86}, 8333},
  1363. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x59,0xb1,0xba}, 8333},
  1364. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x59,0xb4,0xa2}, 8333},
  1365. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5a,0x66,0x46}, 8333},
  1366. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5a,0xcc,0xf1}, 8333},
  1367. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5a,0xd0,0xfe}, 8333},
  1368. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5a,0xf1,0xb8}, 8333},
  1369. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5b,0x5f,0x94}, 8333},
  1370. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5b,0xc6,0xae}, 8333},
  1371. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5b,0xe8,0x04}, 8333},
  1372. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x5a,0xc2}, 8333},
  1373. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x72,0x20}, 8333},
  1374. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x72,0xe5}, 8333},
  1375. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x73,0x82}, 8333},
  1376. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x74,0x8a}, 8333},
  1377. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x74,0xcc}, 8333},
  1378. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x78,0x85}, 8333},
  1379. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x7a,0xe3}, 8333},
  1380. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x7b,0xc1}, 8333},
  1381. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x7b,0xe4}, 8333},
  1382. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x7c,0x73}, 8333},
  1383. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x7d,0x18}, 8333},
  1384. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x7d,0x6d}, 8333},
  1385. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x7d,0x8c}, 8333},
  1386. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x89,0xc5}, 8333},
  1387. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x8a,0x80}, 8333},
  1388. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x8a,0x8c}, 8333},
  1389. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x8a,0x90}, 8333},
  1390. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x8a,0xa3}, 8333},
  1391. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x8a,0xc2}, 8333},
  1392. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x8a,0xc3}, 8333},
  1393. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x8a,0xc5}, 8333},
  1394. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x8a,0xd5}, 8333},
  1395. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x8b,0x43}, 8335},
  1396. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x8b,0x55}, 8333},
  1397. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0xad,0x53}, 8333},
  1398. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x24,0x78}, 8333},
  1399. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x24,0xfa}, 8333},
  1400. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x25,0x39}, 8333},
  1401. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x25,0x57}, 8333},
  1402. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x25,0x64}, 8333},
  1403. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x25,0x69}, 8333},
  1404. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x25,0x6f}, 8333},
  1405. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x25,0x86}, 8333},
  1406. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x25,0x89}, 8333},
  1407. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x25,0x8b}, 8333},
  1408. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x25,0x93}, 8333},
  1409. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x25,0x96}, 8333},
  1410. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x25,0x97}, 8333},
  1411. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x25,0x98}, 8333},
  1412. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x25,0xfe}, 8335},
  1413. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x26,0x05}, 8333},
  1414. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x26,0x58}, 8333},
  1415. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x27,0x57}, 8333},
  1416. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x28,0x68}, 8333},
  1417. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x28,0xb2}, 8333},
  1418. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x29,0x2a}, 8333},
  1419. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x29,0x3a}, 8333},
  1420. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x2b,0x16}, 8333},
  1421. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x2b,0x8a}, 8333},
  1422. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x2b,0xc1}, 8333},
  1423. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x2b,0xd9}, 8333},
  1424. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x2c,0xe0}, 8333},
  1425. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x2d,0xb8}, 8333},
  1426. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x2e,0x1f}, 8333},
  1427. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x2e,0xdb}, 8333},
  1428. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x2e,0xe0}, 8333},
  1429. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x2f,0x5f}, 8333},
  1430. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x2f,0x79}, 8333},
  1431. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x2f,0x98}, 8333},
  1432. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x2f,0xa9}, 8333},
  1433. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x2f,0xca}, 8333},
  1434. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x2f,0xd8}, 8333},
  1435. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x38,0xe8}, 8333},
  1436. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x39,0x1b}, 8333},
  1437. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x39,0x44}, 8333},
  1438. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x39,0x5c}, 8333},
  1439. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x39,0x5f}, 8333},
  1440. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x39,0x60}, 8333},
  1441. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x39,0x72}, 8333},
  1442. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x39,0x79}, 8333},
  1443. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x39,0x80}, 8333},
  1444. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x39,0x8b}, 8333},
  1445. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x39,0x8c}, 8333},
  1446. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x39,0x91}, 8333},
  1447. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x39,0x92}, 8333},
  1448. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x39,0x95}, 8333},
  1449. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x39,0x97}, 8333},
  1450. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x39,0x98}, 8333},
  1451. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x39,0x9b}, 8333},
  1452. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x39,0x9c}, 8333},
  1453. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x39,0xa1}, 8333},
  1454. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x3a,0x92}, 8335},
  1455. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x3a,0xc2}, 8335},
  1456. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5e,0x85,0xfc}, 8333},
  1457. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x20,0x0b}, 8333},
  1458. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x20,0x25}, 8333},
  1459. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x20,0x31}, 8333},
  1460. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x20,0x51}, 8333},
  1461. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x20,0x66}, 8333},
  1462. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x20,0x73}, 8333},
  1463. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x20,0x96}, 8333},
  1464. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x20,0xa0}, 8333},
  1465. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x20,0xa8}, 8333},
  1466. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x20,0xaa}, 8333},
  1467. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x20,0xce}, 8333},
  1468. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x20,0xd6}, 8333},
  1469. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x20,0xde}, 8333},
  1470. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x21,0x24}, 8333},
  1471. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x21,0xf4}, 8333},
  1472. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x22,0xcc}, 8333},
  1473. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x22,0xdd}, 8333},
  1474. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x22,0xef}, 8333},
  1475. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x24,0x24}, 8333},
  1476. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x24,0x2b}, 8333},
  1477. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x24,0x58}, 8333},
  1478. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x24,0x70}, 8333},
  1479. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x24,0x77}, 8333},
  1480. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x24,0x7f}, 8333},
  1481. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x24,0x83}, 8333},
  1482. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5f,0x24,0x8e}, 8333},
  1483. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x90,0x44,0x81}, 8333},
  1484. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x90,0x59,0x5f}, 8333},
  1485. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x93,0xc2,0xb6}, 8333},
  1486. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0xc7,0x40,0x4e}, 8333},
  1487. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0xc7,0xf5,0x93}, 8333},
  1488. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0xcd,0x68,0x54}, 8333},
  1489. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0xdd,0xaa,0xfb}, 8333},
  1490. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x31,0x97,0x95,0x5a}, 8333},
  1491. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x23,0x47,0xde}, 9333},
  1492. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x4f,0xae,0xfd}, 8333},
  1493. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x59,0xeb,0xe7}, 8333},
  1494. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x74,0x18,0x2c}, 8333},
  1495. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0xc9,0x90,0xaa}, 8333},
  1496. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0xfb,0x54,0x52}, 8333},
  1497. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x33,0x0f,0x40,0x26}, 8333},
  1498. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x33,0x0f,0x4e,0x0b}, 8333},
  1499. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x33,0x0f,0xac,0x55}, 8333},
  1500. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x33,0x0f,0xb1,0xa2}, 5901},
  1501. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x33,0xae,0x5b,0x39}, 8333},
  1502. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x33,0xfe,0x3e,0xa9}, 8333},
  1503. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x07,0xe9,0x0d}, 8333},
  1504. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x10,0x6a,0x0b}, 8333},
  1505. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x10,0x72,0x7f}, 8333},
  1506. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x13,0xb6,0x01}, 8333},
  1507. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x1c,0xca,0x83}, 8333},
  1508. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x1d,0x24,0x47}, 8333},
  1509. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x1d,0x85,0x10}, 8333},
  1510. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x27,0xca,0x9f}, 8333},
  1511. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x32,0x55,0x9d}, 8333},
  1512. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x33,0xe8,0xea}, 8333},
  1513. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x35,0x94,0xa3}, 8333},
  1514. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x35,0xc6,0x8d}, 8333},
  1515. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x35,0xf6,0x41}, 8333},
  1516. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x35,0xf8,0x2a}, 8333},
  1517. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x37,0xb3,0x05}, 8333},
  1518. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x39,0x0e,0x43}, 8333},
  1519. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x3a,0xa3,0xc9}, 8333},
  1520. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x3a,0xbe,0x90}, 8333},
  1521. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x3b,0x46,0xb2}, 8333},
  1522. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x3e,0xb7,0x31}, 8333},
  1523. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x3f,0x85,0x69}, 8333},
  1524. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x3f,0xaf,0x3d}, 8333},
  1525. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x41,0x3a,0xc7}, 8333},
  1526. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x41,0x54,0x46}, 8333},
  1527. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x42,0x0a,0xcc}, 8333},
  1528. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x42,0xb4,0x98}, 8333},
  1529. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x4d,0xc2,0xf5}, 8333},
  1530. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x4d,0xd2,0x2a}, 8333},
  1531. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x4d,0xd3,0xdb}, 8333},
  1532. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x4d,0xdf,0x71}, 8333},
  1533. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x5a,0x84,0x2a}, 8333},
  1534. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x5b,0x03,0x36}, 8333},
  1535. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0xa6,0x6a,0xd7}, 8333},
  1536. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0xa9,0xe6,0x32}, 8333},
  1537. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0xae,0xf4,0x4c}, 8333},
  1538. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0xb2,0x5c,0x75}, 8333},
  1539. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0xd2,0x26,0xe3}, 8333},
  1540. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0xd2,0xfc,0x7b}, 8333},
  1541. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0xd4,0x5c,0x00}, 8333},
  1542. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0xdd,0xba,0x1c}, 8333},
  1543. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0xdd,0xe3,0x9d}, 8333},
  1544. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0xe7,0xc9,0x3d}, 10333},
  1545. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0xf3,0x2c,0xb0}, 8333},
  1546. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x24,0xaf,0x4b}, 8333},
  1547. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x40,0xd9,0xaf}, 8333},
  1548. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x42,0xdc,0xb3}, 8333},
  1549. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x42,0xde,0x0f}, 8333},
  1550. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x4c,0x04,0x92}, 8333},
  1551. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x4c,0x27,0x76}, 8333},
  1552. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x4d,0x06,0x7d}, 8333},
  1553. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x4d,0x09,0xb4}, 8333},
  1554. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x4d,0x60,0x2a}, 8333},
  1555. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x4f,0x58,0x16}, 8333},
  1556. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x4f,0x5f,0x31}, 8333},
  1557. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x56,0x1e,0x4a}, 8333},
  1558. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x59,0x08,0xed}, 8333},
  1559. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x59,0xa2,0x36}, 8333},
  1560. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x5a,0x94,0x84}, 8333},
  1561. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x5d,0xd3,0x42}, 8333},
  1562. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x95,0xce,0x16}, 18916},
  1563. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x99,0x06,0x85}, 8333},
  1564. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x99,0x09,0xd9}, 8333},
  1565. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x99,0x7a,0x1f}, 8333},
  1566. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x99,0xa3,0xa3}, 8333},
  1567. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x99,0xe0,0x97}, 8333},
  1568. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x9a,0x8b,0xd4}, 8333},
  1569. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x9e,0x0d,0x7b}, 8333},
  1570. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x9e,0x57,0x0f}, 8333},
  1571. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xa9,0x03,0x9b}, 8333},
  1572. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xa9,0xc2,0xfd}, 8333},
  1573. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xa9,0xe7,0x37}, 8333},
  1574. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xad,0x95,0x16}, 8333},
  1575. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xae,0xe3,0xeb}, 8333},
  1576. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xaf,0xf3,0x7a}, 8333},
  1577. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xb3,0x85,0x4f}, 8333},
  1578. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xb3,0x9d,0x21}, 8333},
  1579. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xb7,0x24,0x06}, 8333},
  1580. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xb7,0x83,0x88}, 8333},
  1581. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xb7,0xbb,0xf9}, 8333},
  1582. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xb7,0xd6,0xf0}, 8333},
  1583. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xb7,0xd8,0xee}, 8333},
  1584. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xb7,0xeb,0x83}, 8333},
  1585. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xb7,0xef,0xe2}, 8333},
  1586. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xc1,0x67,0xe7}, 8333},
  1587. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xce,0x1b,0x12}, 8333},
  1588. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xce,0x2e,0x28}, 8333},
  1589. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xce,0x4d,0x3d}, 8333},
  1590. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xd7,0xf8,0x8f}, 8333},
  1591. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xdb,0xac,0x69}, 8333},
  1592. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xdf,0xd6,0xee}, 8333},
  1593. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xe0,0x89,0x6e}, 8333},
  1594. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xec,0xd4,0x8b}, 8333},
  1595. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xf1,0x95,0x02}, 8333},
  1596. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xfe,0x86,0x5e}, 8333},
  1597. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xff,0xbb,0x95}, 8333},
  1598. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xff,0xc9,0x82}, 8333},
  1599. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xff,0xd5,0xfe}, 8333},
  1600. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3a,0xb6,0xc2,0xf7}, 8333},
  1601. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3a,0xe5,0xd0,0xd7}, 8333},
  1602. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3b,0x6e,0x73,0x34}, 8333},
  1603. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3b,0x6e,0x73,0x35}, 8335},
  1604. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3b,0x6e,0x73,0x3c}, 8333},
  1605. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3b,0xa7,0x6f,0xea}, 8333},
  1606. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3c,0xcd,0x5d,0x22}, 8333},
  1607. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3c,0xcd,0x5e,0x29}, 8333},
  1608. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3c,0xcd,0x95,0x07}, 8333},
  1609. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3c,0xcd,0x95,0xcc}, 8333},
  1610. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3d,0x64,0xb6,0xbd}, 18333},
  1611. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0x15,0x32,0x28}, 8333},
  1612. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0x4b,0xa5,0x7f}, 8333},
  1613. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0x4b,0xf4,0x4e}, 8333},
  1614. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0x70,0x08,0x15}, 8333},
  1615. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0x70,0x0b,0xbc}, 8345},
  1616. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0xb2,0x5e,0xcc}, 8222},
  1617. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0xcc,0x8d,0x22}, 8333},
  1618. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0xd2,0x5d,0xe5}, 28333},
  1619. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0xd2,0x6e,0xb5}, 18333},
  1620. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x40,0x5b,0xe9,0xce}, 8333},
  1621. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x40,0xbf,0x09,0x81}, 8333},
  1622. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x41,0x1d,0xde,0xb5}, 8333},
  1623. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x41,0x3c,0xfd,0x49}, 8333},
  1624. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0x44,0x2f,0x28}, 8333},
  1625. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0x67,0x0e,0x9d}, 8333},
  1626. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0x6c,0x0f,0x05}, 8433},
  1627. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0xaf,0xdd,0x3d}, 8333},
  1628. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0xbb,0x41,0x06}, 8333},
  1629. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0xdb,0xc7,0x07}, 8333},
  1630. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0xe4,0x37,0x94}, 8333},
  1631. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0xe7,0x9a,0xba}, 8333},
  1632. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0x05,0xc8,0xd2}, 8333},
  1633. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0x51,0xc2,0xdb}, 8333},
  1634. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xa4,0xc6,0xf7}, 8333},
  1635. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xa8,0x6d,0xb7}, 8333},
  1636. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xb0,0x69,0x94}, 8333},
  1637. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xb8,0x19,0x18}, 8333},
  1638. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xbb,0x5b,0x79}, 8333},
  1639. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xcd,0xa2,0xf8}, 8333},
  1640. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xcd,0xb3,0xa1}, 8333},
  1641. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xdd,0x8e,0xfc}, 8333},
  1642. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x44,0x04,0xe4,0x8a}, 8333},
  1643. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x44,0x2c,0x8f,0xd8}, 8333},
  1644. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x44,0x33,0x56,0xdf}, 8333},
  1645. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x44,0x64,0x13,0x58}, 8333},
  1646. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x44,0x77,0x52,0xb9}, 8333},
  1647. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x7b,0x0e,0x7f}, 8333},
  1648. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0xa4,0xce,0xce}, 8333},
  1649. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0xac,0xae,0x15}, 8333},
  1650. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0xb5,0x14,0x98}, 8333},
  1651. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0xf4,0xbc,0x25}, 8333},
  1652. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0xfd,0x4f,0x96}, 8333},
  1653. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x46,0x77,0x7d,0xa0}, 8333},
  1654. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x46,0xb5,0x73,0x14}, 8333},
  1655. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x47,0x13,0xfc,0x72}, 15849},
  1656. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x47,0x48,0xe1,0x24}, 8333},
  1657. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x47,0x5d,0xcc,0xe2}, 8333},
  1658. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x47,0x7f,0x2b,0x44}, 8333},
  1659. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x47,0xe0,0x0b,0xd6}, 8333},
  1660. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x47,0xe5,0xbe,0xdf}, 8333},
  1661. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x47,0xfc,0x89,0xf6}, 8333},
  1662. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0x05,0xa7,0x29}, 8333},
  1663. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0x0e,0xb0,0xeb}, 8333},
  1664. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0x0e,0xb3,0xb9}, 8333},
  1665. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0x30,0x14,0x8f}, 8333},
  1666. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0x45,0xa4,0x9e}, 8333},
  1667. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0x57,0x73,0x37}, 8333},
  1668. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0x5f,0x18,0xc8}, 8333},
  1669. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0xca,0xbe,0x44}, 8333},
  1670. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0xdb,0xc0,0x3b}, 8333},
  1671. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0xe0,0x65,0x41}, 8334},
  1672. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0xea,0xfb,0xcb}, 8333},
  1673. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x49,0x2d,0xb0,0x51}, 8333},
  1674. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x49,0x3e,0x92,0x0b}, 8333},
  1675. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x49,0x88,0x0c,0xe6}, 8333},
  1676. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x49,0x8c,0x9b,0x8c}, 8333},
  1677. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x49,0xdd,0xfb,0xc0}, 8333},
  1678. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x49,0xde,0x08,0x72}, 8333},
  1679. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x49,0xde,0xb2,0x67}, 8333},
  1680. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x49,0xe1,0x8f,0xd4}, 8333},
  1681. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x49,0xe8,0x5e,0x16}, 9333},
  1682. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x49,0xfc,0xc8,0xad}, 8333},
  1683. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4a,0x46,0xc7,0x07}, 8333},
  1684. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4a,0x61,0x36,0xa9}, 8333},
  1685. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4a,0x8e,0xb7,0x5e}, 8333},
  1686. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4a,0xd7,0xcd,0x25}, 8333},
  1687. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4b,0x52,0x04,0xb7}, 8333},
  1688. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4b,0x76,0x07,0x47}, 8333},
  1689. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4b,0x87,0x26,0x7e}, 8333},
  1690. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4b,0x8f,0x6d,0x2a}, 8334},
  1691. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4b,0xab,0xfa,0x41}, 8333},
  1692. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4b,0xb1,0x89,0x86}, 8333},
  1693. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0x0e,0x28,0xe0}, 8333},
  1694. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0x10,0x0c,0x51}, 8333},
  1695. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0x1e,0x92,0x20}, 8333},
  1696. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0x72,0x6d,0xde}, 8333},
  1697. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0xa7,0xe0,0x16}, 8333},
  1698. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0xaa,0x88,0x2d}, 8333},
  1699. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0xb7,0x66,0xc0}, 8333},
  1700. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0x46,0x07,0xee}, 8333},
  1701. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0x4e,0x17,0xed}, 8333},
  1702. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0x62,0x6c,0xc2}, 8333},
  1703. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0x8b,0x42,0x03}, 8333},
  1704. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0xea,0x68,0x89}, 8333},
  1705. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0xf9,0xd5,0x19}, 5914},
  1706. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x00,0x10,0x96}, 8333},
  1707. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x22,0x0d,0xf3}, 8333},
  1708. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x2e,0x2b,0x15}, 38333},
  1709. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x2e,0x41,0xca}, 8333},
  1710. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x2e,0x6d,0x7c}, 8334},
  1711. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x54,0x9a,0x33}, 8333},
  1712. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0xbb,0x5a,0x7a}, 8333},
  1713. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0xc2,0x9e,0x8d}, 8333},
  1714. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4f,0x43,0x7c,0x77}, 8333},
  1715. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4f,0x6d,0x75,0x36}, 8333},
  1716. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4f,0x89,0x45,0xaf}, 8333},
  1717. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4f,0xfa,0x7c,0x3f}, 8333},
  1718. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4f,0xfa,0x7d,0x1d}, 8333},
  1719. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4f,0xfa,0x7e,0x9b}, 8333},
  1720. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0x03,0x9e,0xef}, 9333},
  1721. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0x1c,0x40,0xe6}, 8333},
  1722. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0x63,0x12,0x99}, 8333},
  1723. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0x66,0xea,0x0b}, 8333},
  1724. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0x95,0x17,0x13}, 8333},
  1725. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0xd8,0x12,0x72}, 8333},
  1726. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0xdc,0xcb,0xa3}, 8333},
  1727. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0xe5,0x07,0xe3}, 8333},
  1728. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0xeb,0x1f,0x6f}, 28480},
  1729. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x02,0x5f,0x87}, 8335},
  1730. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x62,0xd8,0xd4}, 8333},
  1731. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x6e,0x12,0xdf}, 8333},
  1732. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0xa3,0xcf,0x0c}, 8333},
  1733. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0xb6,0xfb,0x76}, 8333},
  1734. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0xb8,0xce,0xcb}, 8333},
  1735. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0xbb,0x52,0x36}, 8333},
  1736. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0xbf,0xf3,0x23}, 8333},
  1737. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x17,0xc0,0x9e}, 8333},
  1738. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x19,0x37,0x47}, 8333},
  1739. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x19,0x48,0xe4}, 8333},
  1740. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x24,0x8d,0xa0}, 8333},
  1741. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x25,0xef,0xdf}, 8333},
  1742. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x2f,0x90,0xc8}, 8333},
  1743. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x47,0x24,0x1d}, 8333},
  1744. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x83,0x57,0x6d}, 8333},
  1745. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xa1,0x85,0x70}, 8333},
  1746. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xc4,0x0d,0x4f}, 8333},
  1747. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xca,0xc7,0x7a}, 8333},
  1748. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xd9,0x85,0x91}, 8333},
  1749. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xda,0xe0,0x7b}, 8333},
  1750. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xdd,0x80,0xcf}, 8333},
  1751. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xeb,0x93,0x09}, 8333},
  1752. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xfb,0x8a,0x50}, 8333},
  1753. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x00,0xd7,0xc2}, 8333},
  1754. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x39,0x23,0xdf}, 8333},
  1755. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x45,0xcb,0x2c}, 8333},
  1756. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x4e,0xb8,0x0e}, 8333},
  1757. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x68,0x3b,0xaa}, 8333},
  1758. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xa2,0xba,0x3d}, 8333},
  1759. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xa2,0xf4,0x63}, 8333},
  1760. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xa2,0xf5,0xa7}, 8333},
  1761. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xa3,0xdf,0x91}, 8333},
  1762. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xa9,0x14,0x22}, 8333},
  1763. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xac,0x45,0x9a}, 8333},
  1764. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xf3,0x42,0x78}, 8333},
  1765. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x0a,0xa0,0x5e}, 8333},
  1766. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x32,0xf3,0xa5}, 28480},
  1767. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x38,0x03,0x76}, 8333},
  1768. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x38,0x0e,0x59}, 8333},
  1769. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x4b,0xff,0x4c}, 8333},
  1770. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x50,0xaf,0xfc}, 8333},
  1771. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x6f,0xb5,0x83}, 8333},
  1772. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x8b,0x8c,0x5c}, 8333},
  1773. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0xc8,0x4c,0x20}, 8333},
  1774. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0xd1,0x92,0x63}, 8333},
  1775. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0x01,0x51,0xaa}, 8333},
  1776. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0x18,0x91,0x12}, 8333},
  1777. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0x18,0xca,0xc7}, 8333},
  1778. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0x40,0x20,0x59}, 8333},
  1779. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0x90,0xc5,0xa3}, 8333},
  1780. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0xa6,0xbf,0x47}, 8333},
  1781. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0xc3,0xd6,0xbd}, 8333},
  1782. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0xd6,0x93,0x63}, 8340},
  1783. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0xe0,0x6b,0xcf}, 8333},
  1784. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0xe0,0xcd,0x97}, 8333},
  1785. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0xfd,0x65,0x4a}, 8333},
  1786. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x56,0x03,0x9b,0x93}, 8333},
  1787. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x56,0x54,0x17,0x94}, 8333},
  1788. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x56,0x58,0x12,0x58}, 8333},
  1789. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x56,0x8a,0x33,0x57}, 8333},
  1790. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x56,0x8c,0x99,0xed}, 8333},
  1791. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x56,0xa3,0xf5,0x8a}, 8333},
  1792. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x56,0xb4,0x38,0x77}, 8333},
  1793. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x56,0xbf,0x4b,0x58}, 8333},
  1794. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x56,0xc2,0x90,0x78}, 8333},
  1795. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x56,0xc2,0x94,0x97}, 8333},
  1796. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x56,0xc2,0x96,0x2a}, 8333},
  1797. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x56,0xf7,0x31,0x54}, 8333},
  1798. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x56,0xfd,0x2a,0xd0}, 8333},
  1799. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0x06,0xf5,0x99}, 8333},
  1800. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0x0e,0x31,0x3c}, 8333},
  1801. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0x64,0xb3,0x49}, 8333},
  1802. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0x78,0x08,0xc8}, 8333},
  1803. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0xa7,0x6d,0xc5}, 8333},
  1804. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0xb6,0xbf,0xaa}, 8333},
  1805. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0xec,0xc5,0x28}, 8433},
  1806. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0xec,0xc6,0x06}, 8433},
  1807. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x07,0x71,0xe2}, 8333},
  1808. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x15,0x52,0x72}, 8333},
  1809. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x60,0x21,0x7c}, 8333},
  1810. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x63,0x10,0x46}, 8333},
  1811. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x63,0xc7,0x57}, 8333},
  1812. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x63,0xe4,0x34}, 8333},
  1813. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x84,0x62,0xe0}, 8333},
  1814. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x8b,0x7d,0x08}, 8333},
  1815. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x9f,0x5c,0x9b}, 8533},
  1816. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0xa7,0x61,0x13}, 8333},
  1817. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0xba,0x3d,0xd1}, 8333},
  1818. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0xc6,0x21,0xd6}, 8333},
  1819. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0xc6,0x27,0xcd}, 28333},
  1820. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0xc6,0xd6,0x42}, 8333},
  1821. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0xcf,0x8b,0xcb}, 8333},
  1822. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0x00,0x30,0x15}, 8333},
  1823. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0x1d,0x80,0x05}, 8333},
  1824. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0x66,0xa3,0x5a}, 8333},
  1825. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0x99,0x43,0x20}, 8333},
  1826. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0xa3,0x94,0x67}, 8333},
  1827. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0xa3,0xfa,0xcd}, 8333},
  1828. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0xae,0xad,0x3a}, 8333},
  1829. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0xb3,0xf7,0xec}, 8333},
  1830. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0xc9,0x25,0xe5}, 8333},
  1831. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5a,0x44,0x21,0x46}, 8333},
  1832. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5a,0x5e,0xc6,0x0d}, 8333},
  1833. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5a,0xad,0x87,0xbe}, 8333},
  1834. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x40,0x7f,0xc1}, 8333},
  1835. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x40,0x97,0xca}, 8333},
  1836. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x79,0xb7,0x80}, 8333},
  1837. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x91,0x2a,0x53}, 8333},
  1838. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x91,0x31,0x38}, 8333},
  1839. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x91,0x60,0x8e}, 8333},
  1840. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x99,0x81,0x86}, 8333},
  1841. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x9b,0x02,0x53}, 8773},
  1842. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xc1,0xe4,0x6a}, 8333},
  1843. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xc3,0xf9,0x02}, 8333},
  1844. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xc5,0x2c,0x90}, 8333},
  1845. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xc6,0xb1,0xde}, 8333},
  1846. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xcc,0x95,0x05}, 8334},
  1847. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xd3,0xd6,0xe2}, 8333},
  1848. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xf2,0x44,0xf9}, 8333},
  1849. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5c,0x1b,0x2f,0xdf}, 8333},
  1850. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5c,0x6a,0x25,0x2d}, 8333},
  1851. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5c,0xcb,0xe6,0x1b}, 8333},
  1852. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5c,0xd0,0xc7,0x76}, 8333},
  1853. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5c,0xf6,0x14,0xc8}, 8333},
  1854. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5c,0xff,0xc4,0xf3}, 8333},
  1855. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0x68,0xd0,0x77}, 8333},
  1856. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0x68,0xd1,0x52}, 8333},
  1857. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0x89,0x60,0xa2}, 8333},
  1858. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0xb4,0x33,0x33}, 8333},
  1859. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0xc5,0x81,0x3c}, 8333},
  1860. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0xc5,0x84,0x15}, 8333},
  1861. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0xc5,0x84,0xa2}, 8333},
  1862. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0xe1,0xb9,0x81}, 8335},
  1863. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0xe6,0x35,0xb4}, 8333},
  1864. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0xfe,0x42,0xf0}, 8333},
  1865. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0x36,0x41,0x3f}, 8333},
  1866. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0x82,0x09,0x64}, 8334},
  1867. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0x82,0x61,0x80}, 8333},
  1868. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0x82,0x81,0xe9}, 8340},
  1869. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0x82,0xcf,0x13}, 8333},
  1870. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0x82,0xe6,0xd6}, 8333},
  1871. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0x87,0x89,0x6c}, 8333},
  1872. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0x8e,0xf0,0x07}, 8333},
  1873. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0x9e,0xca,0x96}, 8333},
  1874. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0xc0,0xa8,0x35}, 8334},
  1875. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0xd0,0xa3,0x74}, 8333},
  1876. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0xd6,0x5f,0x25}, 8333},
  1877. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0x18,0xce,0x9c}, 8333},
  1878. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0x4c,0xe4,0x16}, 8333},
  1879. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0x50,0x2c,0x64}, 8333},
  1880. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0x90,0x9f,0xf4}, 8333},
  1881. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0x91,0x1f,0xe6}, 8333},
  1882. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0xb7,0x36,0x3c}, 8333},
  1883. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0xd3,0x88,0x56}, 8333},
  1884. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0xd5,0x8f,0x8b}, 8334},
  1885. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0xd5,0xd2,0x8d}, 8333},
  1886. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0xec,0x2d,0xfb}, 8333},
  1887. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x60,0x1b,0x18,0x23}, 8333},
  1888. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x60,0x21,0xce,0x0c}, 8333},
  1889. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x60,0x37,0xa0,0x53}, 8333},
  1890. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x60,0x3d,0x5c,0xf2}, 8333},
  1891. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x60,0x7e,0x75,0x05}, 8333},
  1892. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x60,0x7e,0x7e,0xec}, 8333},
  1893. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x60,0xea,0x27,0xb9}, 8333},
  1894. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x60,0xff,0x95,0x19}, 8333},
  1895. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x60,0xff,0x97,0xea}, 8333},
  1896. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0x1a,0x6c,0x8e}, 8333},
  1897. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0x6f,0xa7,0x35}, 8333},
  1898. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0x74,0x39,0xd2}, 8333},
  1899. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0x97,0x10,0x3c}, 8333},
  1900. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0xa1,0xce,0x62}, 8333},
  1901. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0xc5,0x9d,0xa3}, 8333},
  1902. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0xce,0xff,0xca}, 8333},
  1903. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0xd3,0x30,0xe9}, 8333},
  1904. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0xd4,0x28,0x70}, 8333},
  1905. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0xd6,0x65,0xa0}, 8333},
  1906. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0xdf,0x0b,0x3a}, 8333},
  1907. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x63,0xf9,0x0b,0x9b}, 8333},
  1908. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x63,0xfc,0xb9,0xb6}, 8333},
  1909. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x64,0x00,0xf0,0x83}, 8333},
  1910. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x64,0x08,0xa5,0x56}, 8333},
  1911. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x64,0x28,0x0a,0x93}, 8333},
  1912. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0x0c,0x61}, 8333},
  1913. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0x0c,0x84}, 8333},
  1914. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0x0c,0xd1}, 8333},
  1915. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0x0e,0xa8}, 8333},
  1916. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0x74,0x2f}, 8333},
  1917. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0x74,0x81}, 8333},
  1918. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0x74,0x89}, 8333},
  1919. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0x74,0xb5}, 8333},
  1920. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0x74,0xe2}, 8333},
  1921. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0x75,0x6c}, 8333},
  1922. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0x75,0x9b}, 8333},
  1923. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0x75,0x9f}, 8333},
  1924. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0x75,0xa1}, 8333},
  1925. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0x75,0xac}, 8333},
  1926. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0xa0,0x8e}, 8333},
  1927. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0xa0,0xde}, 8333},
  1928. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0xa1,0x77}, 8333},
  1929. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0xa1,0x99}, 8333},
  1930. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0xa1,0xd7}, 8333},
  1931. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0xa1,0xf9}, 8333},
  1932. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0xa2,0x47}, 8333},
  1933. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0xa2,0x57}, 8333},
  1934. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0xa2,0x5c}, 8333},
  1935. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0xa2,0x90}, 8333},
  1936. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0xa3,0x29}, 8333},
  1937. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0xa3,0x4d}, 8333},
  1938. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0xa3,0x54}, 8333},
  1939. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0xa3,0x6d}, 8333},
  1940. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0xa3,0x78}, 8333},
  1941. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0xa3,0x84}, 8333},
  1942. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0xfd,0xdb}, 8333},
  1943. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0xfd,0xdf}, 8333},
  1944. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x25,0xfd,0xe8}, 8333},
  1945. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x50,0x7c,0x04}, 8333},
  1946. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x5c,0x29,0x48}, 8334},
  1947. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x5c,0x2c,0x56}, 8334},
  1948. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x5c,0x2e,0xdb}, 8334},
  1949. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x64,0xae,0x8a}, 8333},
  1950. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x84,0x11,0x27}, 8333},
  1951. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x84,0x19,0x45}, 8333},
  1952. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x84,0x19,0x5e}, 8333},
  1953. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x84,0x19,0x77}, 8333},
  1954. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x84,0x19,0xa9}, 8333},
  1955. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x84,0x19,0xad}, 8333},
  1956. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x84,0x1a,0x00}, 8333},
  1957. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x84,0x1a,0x10}, 8333},
  1958. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x84,0x1a,0x11}, 8333},
  1959. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x84,0x1a,0x1c}, 8333},
  1960. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x84,0x1a,0x2f}, 8333},
  1961. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x84,0x1a,0x35}, 8333},
  1962. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x84,0x1a,0x40}, 8333},
  1963. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x84,0x1a,0x42}, 8333},
  1964. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x84,0x1a,0x4c}, 8333},
  1965. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x84,0x1a,0x54}, 8333},
  1966. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x84,0x1b,0x8b}, 8333},
  1967. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0xc9,0x28,0x1b}, 8333},
  1968. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0xc9,0x45,0x46}, 8333},
  1969. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0xc9,0xe8,0x70}, 8333},
  1970. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x67,0x46,0xc0,0x80}, 8333},
  1971. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x67,0xc3,0x04,0x3b}, 8333},
  1972. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x67,0xd6,0x92,0x09}, 8333},
  1973. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x67,0xe6,0xb9,0x04}, 8333},
  1974. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x67,0xe6,0xbb,0x02}, 8333},
  1975. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0x0d,0xf5,0xbe}, 8333},
  1976. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0x80,0xe4,0x4e}, 8333},
  1977. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0x9a,0xbd,0x18}, 8333},
  1978. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xa8,0x90,0x1b}, 8333},
  1979. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xa8,0xa7,0x22}, 8333},
  1980. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xac,0xbe,0xa5}, 8333},
  1981. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xdd,0x0a,0xc9}, 8334},
  1982. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xdf,0x0c,0x8b}, 8333},
  1983. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xec,0xfe,0x19}, 8333},
  1984. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xee,0x83,0x74}, 8333},
  1985. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xee,0x86,0x1c}, 8333},
  1986. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xef,0x92,0x4c}, 8333},
  1987. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xf3,0x18,0xec}, 44231},
  1988. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x07,0x80}, 8333},
  1989. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x18,0x72}, 8333},
  1990. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x19,0x9e}, 8333},
  1991. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x60,0xa3}, 8333},
  1992. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x61,0x4f}, 8333},
  1993. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x62,0x15}, 8333},
  1994. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x68,0x06}, 8333},
  1995. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x68,0x22}, 8333},
  1996. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x68,0x24}, 8333},
  1997. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x68,0x27}, 8333},
  1998. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x68,0x31}, 8333},
  1999. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x68,0x54}, 8333},
  2000. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x68,0xa7}, 8333},
  2001. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x68,0xab}, 8333},
  2002. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x68,0xe5}, 8333},
  2003. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x68,0xea}, 8333},
  2004. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x68,0xf1}, 8333},
  2005. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x68,0xf9}, 8333},
  2006. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x07}, 8333},
  2007. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x09}, 8333},
  2008. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x0b}, 8333},
  2009. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x0d}, 8333},
  2010. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x12}, 8333},
  2011. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x17}, 8333},
  2012. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x18}, 8333},
  2013. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x22}, 8333},
  2014. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x2d}, 8333},
  2015. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x2e}, 8333},
  2016. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x2f}, 8333},
  2017. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x30}, 8333},
  2018. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x32}, 8333},
  2019. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x35}, 8333},
  2020. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x37}, 8333},
  2021. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x38}, 8333},
  2022. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x39}, 8333},
  2023. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x3b}, 8333},
  2024. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x3d}, 8333},
  2025. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x40}, 8333},
  2026. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x41}, 8333},
  2027. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x4a}, 8333},
  2028. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x4b}, 8333},
  2029. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x67}, 8333},
  2030. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0x80}, 8333},
  2031. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0xa0}, 8333},
  2032. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0xa7}, 8333},
  2033. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0e,0x69,0xc5}, 8333},
  2034. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x24,0x5f}, 8333},
  2035. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x26,0xb5}, 8333},
  2036. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x34,0x08}, 8333},
  2037. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x34,0x53}, 8333},
  2038. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x34,0x8e}, 8333},
  2039. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x34,0x99}, 8333},
  2040. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x34,0xaa}, 8333},
  2041. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x34,0xbf}, 8333},
  2042. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x34,0xd8}, 8333},
  2043. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x34,0xe7}, 8333},
  2044. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x34,0xeb}, 8333},
  2045. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x35,0x02}, 8333},
  2046. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x35,0x05}, 8333},
  2047. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x38,0x0d}, 8333},
  2048. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x38,0x18}, 8333},
  2049. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x38,0x1b}, 8333},
  2050. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x38,0x1d}, 8333},
  2051. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x38,0x51}, 8333},
  2052. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x38,0xb7}, 8333},
  2053. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x38,0xbf}, 8333},
  2054. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x38,0xeb}, 8333},
  2055. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x39,0x0a}, 8333},
  2056. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x39,0x12}, 8333},
  2057. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x39,0x21}, 8333},
  2058. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x39,0x2e}, 8333},
  2059. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x39,0x3f}, 8333},
  2060. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x39,0x6e}, 8333},
  2061. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x4a,0x13}, 8333},
  2062. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x4a,0x35}, 8333},
  2063. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x4a,0x48}, 8333},
  2064. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x4b,0xc9}, 8333},
  2065. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x0f,0x66,0xe5}, 8333},
  2066. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x53,0x71,0x03}, 8333},
  2067. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x53,0x75,0xdd}, 8333},
  2068. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0x06,0xb5,0xa9}, 8333},
  2069. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0x17,0xa7,0x96}, 8333},
  2070. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0x17,0xb8,0x21}, 8333},
  2071. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0xa7,0x50,0x72}, 8333},
  2072. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0xaa,0xe7,0x99}, 8333},
  2073. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0xac,0x09,0x8b}, 8333},
  2074. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0xac,0xfd,0x78}, 8333},
  2075. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0xbd,0x24,0x04}, 8333},
  2076. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0xc2,0x2d,0xc5}, 8333},
  2077. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6c,0x1d,0xbf,0xc2}, 8333},
  2078. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6c,0x3b,0x02,0xd0}, 8333},
  2079. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6c,0x3d,0xcf,0x74}, 8333},
  2080. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6c,0x4b,0xd5,0x39}, 8333},
  2081. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6c,0xc8,0xff,0xc8}, 8338},
  2082. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0x6a,0x3e,0x5c}, 8333},
  2083. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0x83,0x4c,0xd8}, 8334},
  2084. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0x92,0xad,0x04}, 8333},
  2085. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xe9,0x3a,0x2e}, 8333},
  2086. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xec,0x58,0xf5}, 8333},
  2087. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6e,0x0a,0x51,0xcf}, 8333},
  2088. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6e,0x0a,0x51,0xdf}, 8333},
  2089. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6e,0x0a,0xbd,0x71}, 18333},
  2090. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6e,0x5a,0x18,0xd7}, 8333},
  2091. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6f,0x45,0xa5,0xad}, 8333},
  2092. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6f,0xdc,0x5d,0xd5}, 8333},
  2093. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x70,0x4a,0x39,0xb3}, 8333},
  2094. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x71,0xeb,0x68,0x9a}, 8333},
  2095. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x72,0x5a,0x6b,0x77}, 8334},
  2096. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x74,0x3e,0x0c,0x06}, 8333},
  2097. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x74,0x3e,0x0c,0xf9}, 8333},
  2098. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x74,0x3e,0x0d,0x8e}, 8333},
  2099. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x74,0x3e,0x0d,0x96}, 8333},
  2100. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x74,0x3e,0x0d,0xb1}, 8333},
  2101. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x74,0x3e,0x0d,0xb3}, 8333},
  2102. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x74,0x3e,0x0d,0xb6}, 8333},
  2103. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x74,0x3e,0x0d,0xb7}, 8333},
  2104. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x74,0x3e,0x0d,0xba}, 8333},
  2105. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x74,0x3e,0x0d,0xc6}, 8333},
  2106. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x74,0x3e,0x0d,0xce}, 8333},
  2107. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x74,0x3e,0x0d,0xcf}, 8333},
  2108. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x74,0x3e,0x0d,0xd1}, 8333},
  2109. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x74,0x3e,0x0d,0xd2}, 8333},
  2110. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x74,0x3e,0x0d,0xdb}, 8333},
  2111. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x74,0x3e,0x0d,0xde}, 8333},
  2112. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x74,0x3e,0x0d,0xe0}, 8333},
  2113. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x74,0x3e,0x0e,0x9b}, 8333},
  2114. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x74,0xce,0x50,0x21}, 8333},
  2115. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x75,0x02,0x85,0xf6}, 8333},
  2116. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa4,0x53}, 8333},
  2117. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa4,0x6c}, 8333},
  2118. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa4,0x7c}, 8333},
  2119. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa4,0x93}, 8333},
  2120. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa4,0xc1}, 8333},
  2121. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa5,0xfa}, 8333},
  2122. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x14}, 8333},
  2123. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x2e}, 8333},
  2124. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x32}, 8333},
  2125. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x34}, 8333},
  2126. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x3a}, 8333},
  2127. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x3f}, 8333},
  2128. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x41}, 8333},
  2129. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x42}, 8333},
  2130. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x44}, 8333},
  2131. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x47}, 8333},
  2132. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x49}, 8333},
  2133. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x4e}, 8333},
  2134. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x50}, 8333},
  2135. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x52}, 8333},
  2136. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x55}, 8333},
  2137. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x56}, 8333},
  2138. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x58}, 8333},
  2139. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x5c}, 8333},
  2140. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x5d}, 8333},
  2141. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x5e}, 8333},
  2142. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x65}, 8333},
  2143. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x6a}, 8333},
  2144. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x6c}, 8333},
  2145. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x6d}, 8333},
  2146. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x6e}, 8333},
  2147. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x71}, 8333},
  2148. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x73}, 8333},
  2149. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa6,0x74}, 8333},
  2150. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa9,0x62}, 8333},
  2151. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa9,0xaa}, 8333},
  2152. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa9,0xc7}, 8333},
  2153. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1f,0xa9,0xdd}, 8333},
  2154. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0xbe,0x55,0xe8}, 8333},
  2155. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0xed,0x1e,0xcc}, 8333},
  2156. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0xf4,0xcc,0xe1}, 8333},
  2157. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x09,0x74,0x32}, 8333},
  2158. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x0f,0x64,0x78}, 8334},
  2159. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0x80,0x01}, 8333},
  2160. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0x85,0x15}, 8333},
  2161. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0x88,0x11}, 8333},
  2162. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0x88,0x45}, 8333},
  2163. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0x88,0x66}, 8333},
  2164. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0x88,0xd5}, 8333},
  2165. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0x88,0xfc}, 8333},
  2166. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0x89,0x0c}, 8333},
  2167. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0x89,0x1f}, 8333},
  2168. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0x89,0x36}, 8333},
  2169. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0x89,0x51}, 8333},
  2170. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0x89,0x68}, 8333},
  2171. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0x89,0x81}, 8333},
  2172. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0x89,0x8a}, 8333},
  2173. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0x89,0x93}, 8333},
  2174. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xa0,0x13}, 8333},
  2175. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xa0,0x7c}, 8333},
  2176. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xa0,0x92}, 8333},
  2177. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xa0,0xeb}, 8333},
  2178. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xa0,0xf4}, 8333},
  2179. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xa1,0x0a}, 8333},
  2180. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xa1,0x0e}, 8333},
  2181. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xa1,0x0f}, 8333},
  2182. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xa1,0x15}, 8333},
  2183. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xac,0x0e}, 8333},
  2184. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xac,0xa7}, 8333},
  2185. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0x08}, 8333},
  2186. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0x58}, 8333},
  2187. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0x6c}, 8333},
  2188. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0x6f}, 8333},
  2189. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0x72}, 8333},
  2190. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0x83}, 8333},
  2191. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0x8a}, 8333},
  2192. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0x9e}, 8333},
  2193. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0xa1}, 8333},
  2194. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0xa4}, 8333},
  2195. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0xac}, 8333},
  2196. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0xb8}, 8333},
  2197. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0xba}, 8333},
  2198. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0xbb}, 8333},
  2199. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0xbe}, 8333},
  2200. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0xc0}, 8333},
  2201. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0xc1}, 8333},
  2202. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0xc2}, 8333},
  2203. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0xc5}, 8333},
  2204. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0xc8}, 8333},
  2205. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0xca}, 8333},
  2206. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0xcd}, 8333},
  2207. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xad,0xd4}, 8333},
  2208. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xd4,0xa5}, 8333},
  2209. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x17,0xf5,0x75}, 8333},
  2210. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x1c,0x41,0x57}, 8333},
  2211. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x1c,0x4b,0xd3}, 8333},
  2212. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x1c,0x9b,0x39}, 8333},
  2213. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x62,0xde,0xcf}, 8333},
  2214. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x62,0xdf,0x19}, 8333},
  2215. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x37,0xa4,0x3c}, 7112},
  2216. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x3c,0x80,0x80}, 8333},
  2217. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4c,0x1f,0x63}, 8333},
  2218. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4c,0x9d,0xde}, 8333},
  2219. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4c,0xc8,0x5f}, 8333},
  2220. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4c,0xc9,0xa1}, 8333},
  2221. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4c,0xca,0x0f}, 8333},
  2222. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4c,0xca,0x78}, 8333},
  2223. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4c,0xcb,0x35}, 8333},
  2224. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4c,0xcb,0x49}, 8333},
  2225. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4c,0xcb,0x7c}, 8333},
  2226. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4c,0xcb,0x7d}, 8333},
  2227. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4c,0xcb,0x8b}, 8333},
  2228. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4c,0xd5,0xef}, 8333},
  2229. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4d,0x40,0xab}, 8333},
  2230. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4d,0x45,0x6b}, 8333},
  2231. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4d,0x45,0xc5}, 8333},
  2232. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4d,0x45,0xc6}, 8333},
  2233. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4d,0x45,0xde}, 8333},
  2234. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4d,0xec,0x1d}, 8333},
  2235. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4d,0xec,0x20}, 8333},
  2236. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4d,0xec,0x94}, 8333},
  2237. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4d,0xec,0xa6}, 8333},
  2238. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4d,0xec,0xcc}, 8333},
  2239. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4d,0xec,0xee}, 8333},
  2240. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4d,0xec,0xf8}, 8333},
  2241. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4d,0xed,0x00}, 8333},
  2242. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4d,0xed,0x05}, 8333},
  2243. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4d,0xed,0x0d}, 8333},
  2244. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4d,0xed,0x92}, 8333},
  2245. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4e,0x3a,0xce}, 8444},
  2246. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4e,0xfc,0x08}, 8333},
  2247. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4f,0x43,0x81}, 8333},
  2248. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x5c,0xfe,0x3a}, 8333},
  2249. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x79,0x34,0xee,0x57}, 8333},
  2250. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x79,0x85,0x60,0xf1}, 8333},
  2251. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x79,0xdc,0xe0,0xeb}, 8333},
  2252. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7a,0x87,0x53,0xec}, 8333},
  2253. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7a,0x94,0x54,0x1e}, 8123},
  2254. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7a,0xe4,0x60,0x3a}, 8333},
  2255. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7b,0x09,0x92,0xaf}, 8333},
  2256. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7c,0x96,0x52,0x71}, 8333},
  2257. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7e,0x3c,0xcd,0xe5}, 8333},
  2258. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7e,0x55,0x34,0x0d}, 8333},
  2259. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0xc7,0x8a,0x27}, 8333},
  2260. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0xc7,0x90,0xe8}, 8333},
  2261. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0xc7,0xb1,0x81}, 8333},
  2262. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x82,0xb4,0x7b,0x62}, 8333},
  2263. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x83,0xd7,0x90,0x9a}, 8333},
  2264. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x86,0xf9,0x95,0x29}, 8333},
  2265. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x87,0x13,0xf5,0x5d}, 8333},
  2266. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x88,0x20,0xbc,0xf2}, 8333},
  2267. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x88,0x20,0xcd,0x39}, 8333},
  2268. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x88,0x90,0xa9,0xb9}, 8133},
  2269. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x88,0xf3,0x0e,0xf1}, 8333},
  2270. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x88,0xf3,0x10,0x82}, 8333},
  2271. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x88,0xf3,0x3a,0x86}, 8333},
  2272. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x88,0xf3,0x92,0x45}, 8343},
  2273. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x88,0xf3,0xad,0x59}, 8333},
  2274. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x89,0x4a,0x1e,0x63}, 8333},
  2275. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x89,0x63,0xd5,0xe1}, 8333},
  2276. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x89,0xe2,0x6d,0xa9}, 8333},
  2277. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8a,0x44,0x50,0x78}, 8333},
  2278. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8a,0x44,0xa9,0xd5}, 8333},
  2279. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8a,0x44,0xe3,0xcb}, 8443},
  2280. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8a,0x44,0xeb,0xe0}, 8333},
  2281. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8a,0xc5,0xc1,0x9a}, 8333},
  2282. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8a,0xc5,0xcc,0x94}, 8333},
  2283. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8a,0xc9,0x8a,0x94}, 38333},
  2284. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0x3b,0x58,0x05}, 8333},
  2285. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0x3b,0x6c,0x5b}, 8333},
  2286. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0x3b,0x9f,0x5f}, 8335},
  2287. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0xa2,0x15,0x25}, 8333},
  2288. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0xa2,0x15,0x50}, 8333},
  2289. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0xa2,0x76,0x44}, 8333},
  2290. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0xa2,0xac,0xe0}, 8333},
  2291. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0xa2,0xb3,0x20}, 8333},
  2292. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0xa2,0xb4,0x18}, 8333},
  2293. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0xa2,0xb9,0x8f}, 8333},
  2294. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0xa2,0xc2,0x31}, 8333},
  2295. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0xa2,0xcf,0x41}, 8333},
  2296. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0xa2,0xd9,0xca}, 8333},
  2297. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0xa2,0xdb,0xb4}, 8333},
  2298. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0xa2,0xef,0xd0}, 8333},
  2299. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0xc4,0x6a,0x76}, 8333},
  2300. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8d,0xa8,0xa8,0x1a}, 8333},
  2301. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8d,0xe2,0x79,0xad}, 8333},
  2302. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8e,0x2c,0x8b,0xda}, 8333},
  2303. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x90,0x4c,0x27,0xe9}, 8335},
  2304. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x90,0x4c,0x33,0x23}, 8335},
  2305. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x90,0x4c,0x9a,0x8a}, 8333},
  2306. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x90,0x4c,0xaa,0xa3}, 8333},
  2307. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x90,0x4c,0xdc,0x11}, 9090},
  2308. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x90,0xd9,0x27,0x49}, 8333},
  2309. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x90,0xd9,0x43,0x44}, 8333},
  2310. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x90,0xd9,0x49,0x56}, 8333},
  2311. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x92,0x91,0x24,0x56}, 8333},
  2312. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x92,0x94,0x49,0x77}, 8333},
  2313. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x94,0x42,0x3a,0xba}, 8333},
  2314. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x94,0x67,0x07,0x77}, 8333},
  2315. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x94,0xfb,0xb6,0x52}, 8233},
  2316. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x95,0x38,0x4f,0x46}, 8333},
  2317. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x95,0x38,0x59,0x99}, 8333},
  2318. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x95,0x38,0xc6,0xe8}, 8333},
  2319. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x95,0xca,0xd0,0xa0}, 14797},
  2320. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x95,0xca,0xd3,0x11}, 8333},
  2321. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x95,0xd2,0xee,0x1f}, 8333},
  2322. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x96,0x5f,0x20,0x97}, 8333},
  2323. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x97,0xfa,0x79,0x12}, 8333},
  2324. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9d,0x61,0x69,0x05}, 8333},
  2325. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9e,0x45,0x4d,0x83}, 8333},
  2326. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9e,0x45,0xfb,0x2a}, 8333},
  2327. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9e,0x81,0xd4,0xec}, 8335},
  2328. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9f,0x64,0xf3,0x35}, 8333},
  2329. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9f,0x94,0x5c,0xf0}, 8333},
  2330. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa1,0x61,0xf8,0xa3}, 8333},
  2331. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xd5,0x1e,0x2c}, 8333},
  2332. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xdc,0x2f,0x96}, 8333},
  2333. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xf2,0xa8,0x24}, 8333},
  2334. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xf2,0xa8,0x37}, 8333},
  2335. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xf2,0xa8,0x39}, 8333},
  2336. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xf2,0xa8,0x3b}, 8333},
  2337. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xf3,0xf3,0x36}, 8333},
  2338. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xf9,0xe5,0x99}, 8333},
  2339. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa3,0xac,0x93,0xfe}, 8333},
  2340. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa3,0xac,0xa5,0x74}, 8333},
  2341. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa3,0xac,0xae,0xa4}, 8333},
  2342. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa3,0xac,0xb0,0x35}, 8333},
  2343. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa3,0xac,0xba,0x31}, 8333},
  2344. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa4,0x84,0x79,0x2c}, 8333},
  2345. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa5,0xe3,0x0c,0xc9}, 8333},
  2346. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa5,0xe3,0x19,0x8c}, 8333},
  2347. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa5,0xe3,0x7a,0x3e}, 8333},
  2348. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa5,0xe3,0x97,0x84}, 8333},
  2349. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa7,0x72,0x9c,0x22}, 8333},
  2350. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa7,0xa0,0x24,0x68}, 8333},
  2351. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xaa,0xfe,0xec,0x87}, 8333},
  2352. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xab,0x62,0x74,0x53}, 8333},
  2353. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xab,0xd9,0x38,0xc0}, 8333},
  2354. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0x60,0xa1,0xf5}, 8333},
  2355. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0x61,0xd0,0x33}, 8333},
  2356. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0x68,0x08,0x05}, 8333},
  2357. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0x68,0x08,0x07}, 8333},
  2358. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0x68,0x2d,0x49}, 8333},
  2359. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0x68,0x2e,0x17}, 8333},
  2360. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0x68,0x3b,0x16}, 8333},
  2361. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0x68,0x7b,0x95}, 8333},
  2362. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0x68,0x8a,0x6e}, 8333},
  2363. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0x68,0x8c,0x12}, 8333},
  2364. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0x68,0x93,0x1d}, 8333},
  2365. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0x68,0x97,0x42}, 8333},
  2366. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0x68,0x9d,0x5b}, 8333},
  2367. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0x68,0x9d,0xad}, 8333},
  2368. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0x68,0x9f,0x98}, 8333},
  2369. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0x68,0xa1,0x9c}, 8333},
  2370. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0xde,0x4e,0x87}, 18232},
  2371. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0x17,0xe4,0xea}, 8333},
  2372. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0x20,0xfc,0xd4}, 8333},
  2373. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xd0,0x94,0x8a}, 38333},
  2374. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xd4,0xc2,0x5d}, 8344},
  2375. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xd4,0xca,0x21}, 18337},
  2376. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xe0,0xf0,0x26}, 8333},
  2377. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xe0,0xf0,0x2d}, 8333},
  2378. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xe6,0x86,0xcd}, 8333},
  2379. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xf6,0xe5,0x2a}, 8333},
  2380. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xff,0x71,0x77}, 8333},
  2381. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xff,0xf8,0xe8}, 8333},
  2382. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xae,0x07,0x77,0x84}, 8333},
  2383. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xae,0x73,0xde,0x2a}, 8333},
  2384. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xaf,0x7e,0x26,0x2c}, 8334},
  2385. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xaf,0x8a,0x25,0xd1}, 8333},
  2386. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xaf,0xd1,0xda,0x4f}, 8333},
  2387. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x09,0x08,0xe6}, 8333},
  2388. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x09,0x16,0xf0}, 8333},
  2389. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x09,0x24,0x86}, 8333},
  2390. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x09,0x33,0x78}, 8333},
  2391. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x09,0x9a,0x6e}, 8333},
  2392. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x18,0xe8,0x8f}, 8333},
  2393. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x19,0xbb,0x03}, 8334},
  2394. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x1a,0xe8,0x4d}, 8333},
  2395. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x1f,0x06,0x93}, 8333},
  2396. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x1f,0xcf,0x85}, 8337},
  2397. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x3a,0x72,0xeb}, 8333},
  2398. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0xc5,0xfb,0xdc}, 8333},
  2399. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x15,0x00,0xf1}, 8333},
  2400. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x15,0x76,0x21}, 8333},
  2401. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x21,0xe7,0x02}, 8333},
  2402. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x3f,0x3c,0x07}, 9090},
  2403. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x4e,0xc3,0x86}, 8333},
  2404. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x4f,0xa8,0xfc}, 8333},
  2405. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x77,0x41,0x3e}, 8333},
  2406. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x77,0x42,0xa9}, 8333},
  2407. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x8c,0xa5,0x22}, 8333},
  2408. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0xa9,0xf9,0xb9}, 8333},
  2409. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0xda,0x73,0xa9}, 8333},
  2410. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0xee,0xe2,0xd1}, 8333},
  2411. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb4,0xac,0xec,0xdb}, 8333},
  2412. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb4,0xda,0x04,0xf6}, 8343},
  2413. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb5,0x76,0x52,0x54}, 8333},
  2414. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb6,0x8b,0x56,0xa3}, 8333},
  2415. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb6,0x95,0x9e,0x7f}, 8333},
  2416. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb7,0x88,0xec,0x17}, 8333},
  2417. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb8,0x46,0x21,0xc2}, 8333},
  2418. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb8,0x49,0x80,0xfe}, 8333},
  2419. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x15,0xd9,0x06}, 8333},
  2420. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x1a,0xc5,0x05}, 8333},
  2421. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x32,0xbf,0x44}, 8333},
  2422. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x35,0x9a,0xe5}, 8333},
  2423. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x38,0x14,0x7e}, 8333},
  2424. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x45,0x34,0xb4}, 8333},
  2425. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x64,0xf9,0x03}, 8333},
  2426. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x91,0x80,0x5b}, 8333},
  2427. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x9a,0x9c,0x3a}, 8333},
  2428. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0xaa,0x73,0x66}, 8333},
  2429. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0xca,0xa3,0x44}, 8333},
  2430. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbb,0xc0,0xfb,0xf5}, 8333},
  2431. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x20,0x67,0xa5}, 8333},
  2432. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x28,0x5d,0xcd}, 8333},
  2433. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x44,0x26,0xd2}, 8333},
  2434. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x44,0x28,0x1c}, 8333},
  2435. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x71,0x54,0x74}, 8333},
  2436. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0xa5,0xc8,0x50}, 8334},
  2437. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0xc0,0x97,0xb1}, 8333},
  2438. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0xc1,0x8b,0xf6}, 8333},
  2439. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0xc3,0x6a,0xc7}, 8333},
  2440. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0xc9,0x68,0x7c}, 8333},
  2441. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0xf1,0x3a,0xf5}, 8333},
  2442. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0xff,0x1f,0x1c}, 8333},
  2443. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0x51,0xf9,0x6e}, 8333},
  2444. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0x63,0x0c,0x2f}, 8333},
  2445. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0xa9,0x07,0x57}, 8333},
  2446. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0xa9,0x07,0x64}, 8333},
  2447. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0xa9,0x07,0xdc}, 8333},
  2448. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0xcb,0xe4,0x5b}, 8333},
  2449. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x1d,0xbb,0x32}, 8333},
  2450. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x46,0x12,0xa2}, 8333},
  2451. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x46,0x7d,0x05}, 8333},
  2452. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x6b,0xc0,0x77}, 8333},
  2453. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x6f,0xff,0x1e}, 8341},
  2454. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x7c,0xb0,0x25}, 8333},
  2455. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x96,0x34,0x05}, 8333},
  2456. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x9f,0x1d,0x37}, 8333},
  2457. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0xc6,0x66,0x23}, 8333},
  2458. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0xea,0xe1,0x9c}, 8333},
  2459. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0x0e,0xf6,0x57}, 8333},
  2460. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0x0e,0xf6,0x58}, 8333},
  2461. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0x0e,0xf6,0xcd}, 8444},
  2462. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0x58,0x6b,0x41}, 8333},
  2463. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0x58,0x6b,0x66}, 8333},
  2464. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0x95,0x5a,0x13}, 8333},
  2465. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0x8c,0xd7,0x08}, 8333},
  2466. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0x9a,0xe3,0x58}, 8333},
  2467. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc4,0x36,0x29,0x09}, 52442},
  2468. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc4,0x36,0x29,0x15}, 52442},
  2469. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0x1b,0x44,0x56}, 8333},
  2470. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0x1b,0x53,0xd2}, 13020},
  2471. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0x30,0x95,0x71}, 8333},
  2472. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0x32,0x99,0x27}, 8333},
  2473. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0x54,0xad,0x5a}, 8333},
  2474. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0xf5,0x3d,0xa6}, 8333},
  2475. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0xf5,0x3e,0xd0}, 8333},
  2476. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0xf5,0x3f,0x37}, 8333},
  2477. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc7,0x15,0x95,0x31}, 2087},
  2478. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc7,0x24,0x7a,0xe2}, 8333},
  2479. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc7,0x26,0x55,0xbd}, 8333},
  2480. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc7,0x3c,0x7b,0x05}, 8333},
  2481. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc9,0x44,0x31,0xc8}, 8333},
  2482. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xca,0x99,0xdc,0x26}, 8333},
  2483. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcb,0x3c,0x02,0x44}, 8333},
  2484. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcb,0x7a,0xf0,0xfa}, 8433},
  2485. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcc,0x6f,0x26,0x74}, 8333},
  2486. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcf,0x9a,0xde,0x2e}, 8333},
  2487. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcf,0xac,0x7e,0xba}, 8433},
  2488. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd0,0x55,0xf1,0x0a}, 8333},
  2489. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd0,0x6e,0x5d,0x4c}, 8333},
  2490. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0x06,0x8b,0x31}, 8333},
  2491. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0xa0,0x1b,0x36}, 8333},
  2492. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0xc5,0xab,0x11}, 8333},
  2493. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd3,0x16,0x1d,0x22}, 19263},
  2494. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd3,0xee,0x0d,0x0a}, 8333},
  2495. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x20,0xe6,0xdb}, 8333},
  2496. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x2f,0xeb,0xfb}, 8333},
  2497. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x2f,0xec,0x5b}, 8333},
  2498. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x38,0x78,0xcb}, 8333},
  2499. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x69,0xa0,0x2f}, 8333},
  2500. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x75,0xd6,0x66}, 8333},
  2501. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0xab,0xbb,0xe4}, 8333},
  2502. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0xb6,0xb7,0x1d}, 8333},
  2503. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x3b,0x95,0xf4}, 8333},
  2504. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x42,0x1c,0xaa}, 8353},
  2505. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x71,0xc1,0x21}, 8333},
  2506. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x77,0x61,0x29}, 8333},
  2507. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x77,0x6c,0xb3}, 8333},
  2508. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x88,0x49,0xcf}, 8333},
  2509. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x88,0x56,0xd5}, 8333},
  2510. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x95,0x9f,0x0f}, 8333},
  2511. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0xc4,0xff,0x37}, 8333},
  2512. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0xca,0x87,0xa1}, 8333},
  2513. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0xef,0xd5,0x2b}, 8333},
  2514. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0xef,0xd8,0xa2}, 9090},
  2515. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0xf0,0xb6,0x77}, 8333},
  2516. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0x92,0xfb,0x0e}, 18333},
  2517. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0xbd,0x9a,0x3a}, 8333},
  2518. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0xda,0xeb,0x5d}, 8333},
  2519. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0xf9,0x5c,0xbf}, 8333},
  2520. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x0a,0x69,0x5d}, 8333},
  2521. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x29,0x3c,0xf2}, 8333},
  2522. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x4c,0x5d,0x0e}, 8333},
  2523. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x4e,0x05,0x53}, 8333},
  2524. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x67,0x91,0xe1}, 8333},
  2525. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0xb6,0xc7,0x15}, 8333},
  2526. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xda,0x91,0x5d,0x7a}, 8333},
  2527. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xdc,0xe9,0x23,0xb6}, 8333}
  2528.  };
  2529.  
  2530.  static SeedSpec6 pnSeed6_test[] = {
  2531. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x09,0x96,0x70}, 9696},
  2532. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x0a,0x4a,0x72}, 18333},
  2533. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0xe6,0x8c,0x79}, 18333},
  2534. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0xb8,0x98,0xad}, 18333},
  2535. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x23,0xc1,0x85,0xf4}, 18333},
  2536. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x27,0x6a,0xf8,0x2d}, 18333},
  2537. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x65,0xf0,0x47}, 18333},
  2538. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x34,0x1f,0xe8}, 18333},
  2539. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5b,0xc6,0xae}, 18333},
  2540. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x33,0xfe,0xdb,0xd6}, 18333},
  2541. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x32,0x55,0x9d}, 18333},
  2542. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xf9,0x33,0x6d}, 18333},
  2543. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xcd,0xb3,0xa1}, 18333},
  2544. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0xec,0xc6,0x07}, 18433},
  2545. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0x7c,0x04,0x59}, 38333},
  2546. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xc6,0xc2,0xa6}, 18333},
  2547. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xee,0xc6,0xa5}, 18333},
  2548. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4f,0x35,0x22}, 18333},
  2549. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0xc7,0x90,0xe8}, 18333},
  2550. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x82,0xd3,0xa2,0x7c}, 18333},
  2551. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x90,0xd9,0x49,0x56}, 18333},
  2552. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x96,0x5f,0x22,0x61}, 18333},
  2553. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9e,0x45,0x77,0x23}, 18333},
  2554. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x09,0x59,0xd9}, 9696},
  2555. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x09,0x9a,0x6e}, 18333},
  2556. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x0c,0x07,0x77}, 18333},
  2557. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x28,0x5d,0xcd}, 18333},
  2558. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcf,0x9a,0xc4,0x95}, 18333},
  2559. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcf,0x9a,0xd2,0xde}, 10201},
  2560. -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xda,0xf4,0x92,0x6f}, 18333}
  2561.  };
  2562.  #endif // BITCOIN_CHAINPARAMSSEEDS_H
  2563. diff --git a/src/clientversion.cpp b/src/clientversion.cpp
  2564. index 01621f4..d6a9825 100644
  2565. --- a/src/clientversion.cpp
  2566. +++ b/src/clientversion.cpp
  2567. @@ -13,7 +13,7 @@
  2568.   * for both bitcoind and bitcoin-abc, to make it harder for attackers to
  2569.   * target servers or GUI users specifically.
  2570.   */
  2571. -const std::string CLIENT_NAME("Bitcoin ABC");
  2572. +const std::string CLIENT_NAME("Bitcoin Candy");
  2573.  
  2574.  /**
  2575.   * Client version number
  2576. @@ -43,10 +43,11 @@ const std::string CLIENT_NAME("Bitcoin ABC");
  2577.  #endif
  2578.  
  2579.  //! git will put "#define GIT_ARCHIVE 1" on the next line inside archives.
  2580. -//! $Format:%n#define GIT_ARCHIVE 1$
  2581. +//!
  2582. +#define GIT_ARCHIVE 1
  2583.  #ifdef GIT_ARCHIVE
  2584. -#define GIT_COMMIT_ID "$Format:%h$"
  2585. -#define GIT_COMMIT_DATE "$Format:%cD$"
  2586. +#define GIT_COMMIT_ID "c41ba103a"
  2587. +#define GIT_COMMIT_DATE "Thu, 8 Feb 2018 00:41:21 +0800"
  2588.  #endif
  2589.  
  2590.  #define BUILD_DESC_WITH_SUFFIX(maj, min, rev, build, suffix)                   \
  2591. diff --git a/src/config/CMakeLists.txt b/src/config/CMakeLists.txt
  2592. index 298e827..fb6349d 100644
  2593. --- a/src/config/CMakeLists.txt
  2594. +++ b/src/config/CMakeLists.txt
  2595. @@ -7,7 +7,7 @@ include(CheckIncludeFiles)
  2596.  include(CheckSymbolExists)
  2597.  
  2598.  # Package informations
  2599. -set(PACKAGE_NAME "Bitcoin ABC")
  2600. +set(PACKAGE_NAME "Bitcoin Candy")
  2601.  
  2602.  # Version
  2603.  set(CLIENT_VERSION_MAJOR 0)
  2604. diff --git a/src/consensus/params.h b/src/consensus/params.h
  2605. index b555715..58b6bec 100644
  2606. --- a/src/consensus/params.h
  2607. +++ b/src/consensus/params.h
  2608. @@ -50,7 +50,13 @@ struct Params {
  2609.      int BIP66Height;
  2610.      /** Block height at which UAHF kicks in */
  2611.      int uahfHeight;
  2612. +    /** Block height at which CDHF kicks in --add by hmc*/
  2613. +    int cdyHeight;
  2614.      /** Block height at which the new DAA becomes active */
  2615. +    /** The first post-fork block of Bitcoin blockchain. **/
  2616. +    uint256 BitcoinPostforkBlock;
  2617. +    uint32_t BitcoinPostforkTime;
  2618. +
  2619.      int daaHeight;
  2620.      /** Block height at which OP_RETURN replay protection stops */
  2621.      int antiReplayOpReturnSunsetHeight;
  2622. @@ -67,13 +73,22 @@ struct Params {
  2623.      BIP9Deployment vDeployments[MAX_VERSION_BITS_DEPLOYMENTS];
  2624.      /** Proof of work parameters */
  2625.      uint256 powLimit;
  2626. +    uint256 powLimitLegacy;
  2627. +    uint256 powLimitStart;
  2628. +    const uint256& PowLimit(bool postfork) const { return postfork ? powLimit : powLimitLegacy; }
  2629.      bool fPowAllowMinDifficultyBlocks;
  2630.      bool fPowNoRetargeting;
  2631.      int64_t nPowTargetSpacing;
  2632. -    int64_t nPowTargetTimespan;
  2633. -    int64_t DifficultyAdjustmentInterval() const {
  2634. -        return nPowTargetTimespan / nPowTargetSpacing;
  2635. -    }
  2636. +    int64_t nPowTargetSpacingCDY;
  2637. +    int64_t nPowTargetTimespanLegacy;
  2638. +    int64_t DifficultyAdjustmentInterval() const { return nPowTargetTimespanLegacy / nPowTargetSpacing; }
  2639. +    //Zcash logic for diff adjustment
  2640. +    int64_t nPowAveragingWindow;
  2641. +    int64_t nPowMaxAdjustDown;
  2642. +    int64_t nPowMaxAdjustUp;
  2643. +    int64_t AveragingWindowTimespan() const { return nPowAveragingWindow * nPowTargetSpacingCDY; }
  2644. +    int64_t MinActualTimespan() const { return (AveragingWindowTimespan() * (100 - nPowMaxAdjustUp  )) / 100; }
  2645. +    int64_t MaxActualTimespan() const { return (AveragingWindowTimespan() * (100 + nPowMaxAdjustDown)) / 100; }
  2646.      uint256 nMinimumChainWork;
  2647.      uint256 defaultAssumeValid;
  2648.  };
  2649. diff --git a/src/core_io.h b/src/core_io.h
  2650. index 1ad776b..8071d95 100644
  2651. --- a/src/core_io.h
  2652. +++ b/src/core_io.h
  2653. @@ -20,7 +20,7 @@ CScript ParseScript(const std::string &s);
  2654.  std::string ScriptToAsmStr(const CScript &script,
  2655.                             const bool fAttemptSighashDecode = false);
  2656.  bool DecodeHexTx(CMutableTransaction &tx, const std::string &strHexTx);
  2657. -bool DecodeHexBlk(CBlock &, const std::string &strHexBlk);
  2658. +bool DecodeHexBlk(CBlock&, const std::string& strHexBlk, bool fLegacyFormat);
  2659.  uint256 ParseHashUV(const UniValue &v, const std::string &strName);
  2660.  uint256 ParseHashStr(const std::string &, const std::string &strName);
  2661.  std::vector<uint8_t> ParseHexUV(const UniValue &v, const std::string &strName);
  2662. diff --git a/src/core_read.cpp b/src/core_read.cpp
  2663. index fac6159..a2f8c55 100644
  2664. --- a/src/core_read.cpp
  2665. +++ b/src/core_read.cpp
  2666. @@ -106,13 +106,14 @@ bool DecodeHexTx(CMutableTransaction &tx, const std::string &strHexTx) {
  2667.      return true;
  2668.  }
  2669.  
  2670. -bool DecodeHexBlk(CBlock &block, const std::string &strHexBlk) {
  2671. +bool DecodeHexBlk(CBlock &block, const std::string &strHexBlk, bool fLegacyFormat) {
  2672.      if (!IsHex(strHexBlk)) {
  2673.          return false;
  2674.      }
  2675.  
  2676.      std::vector<uint8_t> blockData(ParseHex(strHexBlk));
  2677. -    CDataStream ssBlock(blockData, SER_NETWORK, PROTOCOL_VERSION);
  2678. +    int ser_flags = fLegacyFormat ? SERIALIZE_BLOCK_LEGACY : 0;
  2679. +    CDataStream ssBlock(blockData, SER_NETWORK, PROTOCOL_VERSION | ser_flags);
  2680.      try {
  2681.          ssBlock >> block;
  2682.      } catch (const std::exception &) {
  2683. diff --git a/src/crypto/common.h b/src/crypto/common.h
  2684. index db8e685..0901c6e 100644
  2685. --- a/src/crypto/common.h
  2686. +++ b/src/crypto/common.h
  2687. @@ -11,8 +11,11 @@
  2688.  
  2689.  #include <cstdint>
  2690.  #include <cstring>
  2691. +#include <assert.h>
  2692.  
  2693.  #include "compat/endian.h"
  2694. +#include "sodium.h"
  2695. +
  2696.  
  2697.  static inline uint16_t ReadLE16(const uint8_t *ptr) {
  2698.      uint16_t x;
  2699. @@ -92,4 +95,41 @@ uint64_t static inline CountBits(uint64_t x) {
  2700.      return ret;
  2701.  }
  2702.  
  2703. +int inline init_and_check_sodium()
  2704. +{
  2705. +    if (sodium_init() == -1) {
  2706. +        return -1;
  2707. +    }
  2708. +
  2709. +    // What follows is a runtime test that ensures the version of libsodium
  2710. +    // we're linked against checks that signatures are canonical (s < L).
  2711. +    const unsigned char message[1] = { 0 };
  2712. +
  2713. +    unsigned char pk[crypto_sign_PUBLICKEYBYTES];
  2714. +    unsigned char sk[crypto_sign_SECRETKEYBYTES];
  2715. +    unsigned char sig[crypto_sign_BYTES];
  2716. +
  2717. +    crypto_sign_keypair(pk, sk);
  2718. +    crypto_sign_detached(sig, NULL, message, sizeof(message), sk);
  2719. +
  2720. +    assert(crypto_sign_verify_detached(sig, message, sizeof(message), pk) == 0);
  2721. +
  2722. +    // Copied from libsodium/crypto_sign/ed25519/ref10/open.c
  2723. +    static const unsigned char L[32] = {
  2724. +        0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58,
  2725. +        0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14,
  2726. +        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  2727. +        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10};
  2728. +
  2729. +    // Add L to S, which starts at sig[32].
  2730. +    unsigned int s = 0;
  2731. +    for (size_t i = 0; i < 32; i++) {
  2732. +        s = sig[32 + i] + L[i] + (s >> 8);
  2733. +        sig[32 + i] = s & 0xff;
  2734. +    }
  2735. +
  2736. +    assert(crypto_sign_verify_detached(sig, message, sizeof(message), pk) != 0);
  2737. +
  2738. +    return 0;
  2739. +}
  2740.  #endif // BITCOIN_CRYPTO_COMMON_H
  2741. diff --git a/src/crypto/equihash.cpp b/src/crypto/equihash.cpp
  2742. new file mode 100644
  2743. index 0000000..ead0df8
  2744. --- /dev/null
  2745. +++ b/src/crypto/equihash.cpp
  2746. @@ -0,0 +1,810 @@
  2747. +// Copyright (c) 2016 Jack Grigg
  2748. +// Copyright (c) 2016 The Zcash developers
  2749. +// Distributed under the MIT software license, see the accompanying
  2750. +// file COPYING or http://www.opensource.org/licenses/mit-license.php.
  2751. +
  2752. +// Implementation of the Equihash Proof-of-Work algorithm.
  2753. +//
  2754. +// Reference
  2755. +// =========
  2756. +// Alex Biryukov and Dmitry Khovratovich
  2757. +// Equihash: Asymmetric Proof-of-Work Based on the Generalized Birthday Problem
  2758. +// NDSS ??6, 21-24 February 2016, San Diego, CA, USA
  2759. +// https://www.internetsociety.org/sites/default/files/blogs-media/equihash-asymmetric-proof-of-work-based-generalized-birthday-problem.pdf
  2760. +
  2761. +#if defined(HAVE_CONFIG_H)
  2762. +#include "config/bitcoin-config.h"
  2763. +#endif
  2764. +
  2765. +#include "crypto/equihash.h"
  2766. +
  2767. +#ifndef NO_UTIL_LOG
  2768. +#include "util.h"
  2769. +#else
  2770. +#define LogPrint(...)
  2771. +#endif
  2772. +
  2773. +#include <algorithm>
  2774. +#include <iostream>
  2775. +#include <stdexcept>
  2776. +
  2777. +#include <boost/optional.hpp>
  2778. +
  2779. +EhSolverCancelledException solver_cancelled;
  2780. +
  2781. +template<unsigned int N, unsigned int K>
  2782. +int Equihash<N,K>::InitialiseState(eh_HashState& base_state)
  2783. +{
  2784. +    uint32_t le_N = htole32(N);
  2785. +    uint32_t le_K = htole32(K);
  2786. +    unsigned char personalization[crypto_generichash_blake2b_PERSONALBYTES] = {};
  2787. +    memcpy(personalization, "ZcashPoW", 8);
  2788. +    memcpy(personalization+8,  &le_N, 4);
  2789. +    memcpy(personalization+12, &le_K, 4);
  2790. +    return crypto_generichash_blake2b_init_salt_personal(&base_state,
  2791. +                                                         NULL, 0, // No key.
  2792. +                                                         (512/N)*N/8,
  2793. +                                                         NULL,    // No salt.
  2794. +                                                         personalization);
  2795. +}
  2796. +
  2797. +void GenerateHash(const eh_HashState& base_state, eh_index g,
  2798. +                  unsigned char* hash, size_t hLen)
  2799. +{
  2800. +    eh_HashState state;
  2801. +    state = base_state;
  2802. +    eh_index lei = htole32(g);
  2803. +    crypto_generichash_blake2b_update(&state, (const unsigned char*) &lei,
  2804. +                                      sizeof(eh_index));
  2805. +    crypto_generichash_blake2b_final(&state, hash, hLen);
  2806. +}
  2807. +
  2808. +void ExpandArray(const unsigned char* in, size_t in_len,
  2809. +                 unsigned char* out, size_t out_len,
  2810. +                 size_t bit_len, size_t byte_pad)
  2811. +{
  2812. +    assert(bit_len >= 8);
  2813. +    assert(8*sizeof(uint32_t) >= 7+bit_len);
  2814. +
  2815. +    size_t out_width { (bit_len+7)/8 + byte_pad };
  2816. +    assert(out_len == 8*out_width*in_len/bit_len);
  2817. +
  2818. +    uint32_t bit_len_mask { ((uint32_t)1 << bit_len) - 1 };
  2819. +
  2820. +    // The acc_bits least-significant bits of acc_value represent a bit sequence
  2821. +    // in big-endian order.
  2822. +    size_t acc_bits = 0;
  2823. +    uint32_t acc_value = 0;
  2824. +
  2825. +    size_t j = 0;
  2826. +    for (size_t i = 0; i < in_len; i++) {
  2827. +        acc_value = (acc_value << 8) | in[i];
  2828. +        acc_bits += 8;
  2829. +
  2830. +        // When we have bit_len or more bits in the accumulator, write the next
  2831. +        // output element.
  2832. +        if (acc_bits >= bit_len) {
  2833. +            acc_bits -= bit_len;
  2834. +            for (size_t x = 0; x < byte_pad; x++) {
  2835. +                out[j+x] = 0;
  2836. +            }
  2837. +            for (size_t x = byte_pad; x < out_width; x++) {
  2838. +                out[j+x] = (
  2839. +                    // Big-endian
  2840. +                    acc_value >> (acc_bits+(8*(out_width-x-1)))
  2841. +                ) & (
  2842. +                    // Apply bit_len_mask across byte boundaries
  2843. +                    (bit_len_mask >> (8*(out_width-x-1))) & 0xFF
  2844. +                );
  2845. +            }
  2846. +            j += out_width;
  2847. +        }
  2848. +    }
  2849. +}
  2850. +
  2851. +void CompressArray(const unsigned char* in, size_t in_len,
  2852. +                   unsigned char* out, size_t out_len,
  2853. +                   size_t bit_len, size_t byte_pad)
  2854. +{
  2855. +    assert(bit_len >= 8);
  2856. +    assert(8*sizeof(uint32_t) >= 7+bit_len);
  2857. +
  2858. +    size_t in_width { (bit_len+7)/8 + byte_pad };
  2859. +    assert(out_len == bit_len*in_len/(8*in_width));
  2860. +
  2861. +    uint32_t bit_len_mask { ((uint32_t)1 << bit_len) - 1 };
  2862. +
  2863. +    // The acc_bits least-significant bits of acc_value represent a bit sequence
  2864. +    // in big-endian order.
  2865. +    size_t acc_bits = 0;
  2866. +    uint32_t acc_value = 0;
  2867. +
  2868. +    size_t j = 0;
  2869. +    for (size_t i = 0; i < out_len; i++) {
  2870. +        // When we have fewer than 8 bits left in the accumulator, read the next
  2871. +        // input element.
  2872. +        if (acc_bits < 8) {
  2873. +            acc_value = acc_value << bit_len;
  2874. +            for (size_t x = byte_pad; x < in_width; x++) {
  2875. +                acc_value = acc_value | (
  2876. +                    (
  2877. +                        // Apply bit_len_mask across byte boundaries
  2878. +                        in[j+x] & ((bit_len_mask >> (8*(in_width-x-1))) & 0xFF)
  2879. +                    ) << (8*(in_width-x-1))); // Big-endian
  2880. +            }
  2881. +            j += in_width;
  2882. +            acc_bits += bit_len;
  2883. +        }
  2884. +
  2885. +        acc_bits -= 8;
  2886. +        out[i] = (acc_value >> acc_bits) & 0xFF;
  2887. +    }
  2888. +}
  2889. +
  2890. +// Big-endian so that lexicographic array comparison is equivalent to integer
  2891. +// comparison
  2892. +void EhIndexToArray(const eh_index i, unsigned char* array)
  2893. +{
  2894. +    BOOST_STATIC_ASSERT(sizeof(eh_index) == 4);
  2895. +    eh_index bei = htobe32(i);
  2896. +    memcpy(array, &bei, sizeof(eh_index));
  2897. +}
  2898. +
  2899. +// Big-endian so that lexicographic array comparison is equivalent to integer
  2900. +// comparison
  2901. +eh_index ArrayToEhIndex(const unsigned char* array)
  2902. +{
  2903. +    BOOST_STATIC_ASSERT(sizeof(eh_index) == 4);
  2904. +    eh_index bei;
  2905. +    memcpy(&bei, array, sizeof(eh_index));
  2906. +    return be32toh(bei);
  2907. +}
  2908. +
  2909. +eh_trunc TruncateIndex(const eh_index i, const unsigned int ilen)
  2910. +{
  2911. +    // Truncate to 8 bits
  2912. +    BOOST_STATIC_ASSERT(sizeof(eh_trunc) == 1);
  2913. +    return (i >> (ilen - 8)) & 0xff;
  2914. +}
  2915. +
  2916. +eh_index UntruncateIndex(const eh_trunc t, const eh_index r, const unsigned int ilen)
  2917. +{
  2918. +    eh_index i{t};
  2919. +    return (i << (ilen - 8)) | r;
  2920. +}
  2921. +
  2922. +std::vector<eh_index> GetIndicesFromMinimal(std::vector<unsigned char> minimal,
  2923. +                                            size_t cBitLen)
  2924. +{
  2925. +    assert(((cBitLen+1)+7)/8 <= sizeof(eh_index));
  2926. +    size_t lenIndices { 8*sizeof(eh_index)*minimal.size()/(cBitLen+1) };
  2927. +    size_t bytePad { sizeof(eh_index) - ((cBitLen+1)+7)/8 };
  2928. +    std::vector<unsigned char> array(lenIndices);
  2929. +    ExpandArray(minimal.data(), minimal.size(),
  2930. +                array.data(), lenIndices, cBitLen+1, bytePad);
  2931. +    std::vector<eh_index> ret;
  2932. +    for (size_t i = 0; i < lenIndices; i += sizeof(eh_index)) {
  2933. +        ret.push_back(ArrayToEhIndex(array.data()+i));
  2934. +    }
  2935. +    return ret;
  2936. +}
  2937. +
  2938. +std::vector<unsigned char> GetMinimalFromIndices(std::vector<eh_index> indices,
  2939. +                                                 size_t cBitLen)
  2940. +{
  2941. +    assert(((cBitLen+1)+7)/8 <= sizeof(eh_index));
  2942. +    size_t lenIndices { indices.size()*sizeof(eh_index) };
  2943. +    size_t minLen { (cBitLen+1)*lenIndices/(8*sizeof(eh_index)) };
  2944. +    size_t bytePad { sizeof(eh_index) - ((cBitLen+1)+7)/8 };
  2945. +    std::vector<unsigned char> array(lenIndices);
  2946. +    for (size_t i = 0; i < indices.size(); i++) {
  2947. +        EhIndexToArray(indices[i], array.data()+(i*sizeof(eh_index)));
  2948. +    }
  2949. +    std::vector<unsigned char> ret(minLen);
  2950. +    CompressArray(array.data(), lenIndices,
  2951. +                  ret.data(), minLen, cBitLen+1, bytePad);
  2952. +    return ret;
  2953. +}
  2954. +
  2955. +template<size_t WIDTH>
  2956. +StepRow<WIDTH>::StepRow(const unsigned char* hashIn, size_t hInLen,
  2957. +                        size_t hLen, size_t cBitLen)
  2958. +{
  2959. +    assert(hLen <= WIDTH);
  2960. +    ExpandArray(hashIn, hInLen, hash, hLen, cBitLen);
  2961. +}
  2962. +
  2963. +template<size_t WIDTH> template<size_t W>
  2964. +StepRow<WIDTH>::StepRow(const StepRow<W>& a)
  2965. +{
  2966. +    BOOST_STATIC_ASSERT(W <= WIDTH);
  2967. +    std::copy(a.hash, a.hash+W, hash);
  2968. +}
  2969. +
  2970. +template<size_t WIDTH>
  2971. +FullStepRow<WIDTH>::FullStepRow(const unsigned char* hashIn, size_t hInLen,
  2972. +                                size_t hLen, size_t cBitLen, eh_index i) :
  2973. +        StepRow<WIDTH> {hashIn, hInLen, hLen, cBitLen}
  2974. +{
  2975. +    EhIndexToArray(i, hash+hLen);
  2976. +}
  2977. +
  2978. +template<size_t WIDTH> template<size_t W>
  2979. +FullStepRow<WIDTH>::FullStepRow(const FullStepRow<W>& a, const FullStepRow<W>& b, size_t len, size_t lenIndices, size_t trim) :
  2980. +        StepRow<WIDTH> {a}
  2981. +{
  2982. +    assert(len+lenIndices <= W);
  2983. +    assert(len-trim+(2*lenIndices) <= WIDTH);
  2984. +    for (size_t i = trim; i < len; i++)
  2985. +        hash[i-trim] = a.hash[i] ^ b.hash[i];
  2986. +    if (a.IndicesBefore(b, len, lenIndices)) {
  2987. +        std::copy(a.hash+len, a.hash+len+lenIndices, hash+len-trim);
  2988. +        std::copy(b.hash+len, b.hash+len+lenIndices, hash+len-trim+lenIndices);
  2989. +    } else {
  2990. +        std::copy(b.hash+len, b.hash+len+lenIndices, hash+len-trim);
  2991. +        std::copy(a.hash+len, a.hash+len+lenIndices, hash+len-trim+lenIndices);
  2992. +    }
  2993. +}
  2994. +
  2995. +template<size_t WIDTH>
  2996. +FullStepRow<WIDTH>& FullStepRow<WIDTH>::operator=(const FullStepRow<WIDTH>& a)
  2997. +{
  2998. +    std::copy(a.hash, a.hash+WIDTH, hash);
  2999. +    return *this;
  3000. +}
  3001. +
  3002. +template<size_t WIDTH>
  3003. +bool StepRow<WIDTH>::IsZero(size_t len)
  3004. +{
  3005. +    // This doesn't need to be constant time.
  3006. +    for (size_t i = 0; i < len; i++) {
  3007. +        if (hash[i] != 0)
  3008. +            return false;
  3009. +    }
  3010. +    return true;
  3011. +}
  3012. +
  3013. +template<size_t WIDTH>
  3014. +std::vector<unsigned char> FullStepRow<WIDTH>::GetIndices(size_t len, size_t lenIndices,
  3015. +                                                          size_t cBitLen) const
  3016. +{
  3017. +    assert(((cBitLen+1)+7)/8 <= sizeof(eh_index));
  3018. +    size_t minLen { (cBitLen+1)*lenIndices/(8*sizeof(eh_index)) };
  3019. +    size_t bytePad { sizeof(eh_index) - ((cBitLen+1)+7)/8 };
  3020. +    std::vector<unsigned char> ret(minLen);
  3021. +    CompressArray(hash+len, lenIndices, ret.data(), minLen, cBitLen+1, bytePad);
  3022. +    return ret;
  3023. +}
  3024. +
  3025. +template<size_t WIDTH>
  3026. +bool HasCollision(StepRow<WIDTH>& a, StepRow<WIDTH>& b, size_t l)
  3027. +{
  3028. +    // This doesn't need to be constant time.
  3029. +    for (size_t j = 0; j < l; j++) {
  3030. +        if (a.hash[j] != b.hash[j])
  3031. +            return false;
  3032. +    }
  3033. +    return true;
  3034. +}
  3035. +
  3036. +template<size_t WIDTH>
  3037. +TruncatedStepRow<WIDTH>::TruncatedStepRow(const unsigned char* hashIn, size_t hInLen,
  3038. +                                          size_t hLen, size_t cBitLen,
  3039. +                                          eh_index i, unsigned int ilen) :
  3040. +        StepRow<WIDTH> {hashIn, hInLen, hLen, cBitLen}
  3041. +{
  3042. +    hash[hLen] = TruncateIndex(i, ilen);
  3043. +}
  3044. +
  3045. +template<size_t WIDTH> template<size_t W>
  3046. +TruncatedStepRow<WIDTH>::TruncatedStepRow(const TruncatedStepRow<W>& a, const TruncatedStepRow<W>& b, size_t len, size_t lenIndices, size_t trim) :
  3047. +        StepRow<WIDTH> {a}
  3048. +{
  3049. +    assert(len+lenIndices <= W);
  3050. +    assert(len-trim+(2*lenIndices) <= WIDTH);
  3051. +    for (size_t i = trim; i < len; i++)
  3052. +        hash[i-trim] = a.hash[i] ^ b.hash[i];
  3053. +    if (a.IndicesBefore(b, len, lenIndices)) {
  3054. +        std::copy(a.hash+len, a.hash+len+lenIndices, hash+len-trim);
  3055. +        std::copy(b.hash+len, b.hash+len+lenIndices, hash+len-trim+lenIndices);
  3056. +    } else {
  3057. +        std::copy(b.hash+len, b.hash+len+lenIndices, hash+len-trim);
  3058. +        std::copy(a.hash+len, a.hash+len+lenIndices, hash+len-trim+lenIndices);
  3059. +    }
  3060. +}
  3061. +
  3062. +template<size_t WIDTH>
  3063. +TruncatedStepRow<WIDTH>& TruncatedStepRow<WIDTH>::operator=(const TruncatedStepRow<WIDTH>& a)
  3064. +{
  3065. +    std::copy(a.hash, a.hash+WIDTH, hash);
  3066. +    return *this;
  3067. +}
  3068. +
  3069. +template<size_t WIDTH>
  3070. +std::shared_ptr<eh_trunc> TruncatedStepRow<WIDTH>::GetTruncatedIndices(size_t len, size_t lenIndices) const
  3071. +{
  3072. +    std::shared_ptr<eh_trunc> p (new eh_trunc[lenIndices], std::default_delete<eh_trunc[]>());
  3073. +    std::copy(hash+len, hash+len+lenIndices, p.get());
  3074. +    return p;
  3075. +}
  3076. +
  3077. +template<unsigned int N, unsigned int K>
  3078. +bool Equihash<N,K>::BasicSolve(const eh_HashState& base_state,
  3079. +                               const std::function<bool(std::vector<unsigned char>)> validBlock,
  3080. +                               const std::function<bool(EhSolverCancelCheck)> cancelled)
  3081. +{
  3082. +    eh_index init_size { 1 << (CollisionBitLength + 1) };
  3083. +
  3084. +    // 1) Generate first list
  3085. +    LogPrint(BCLog::POW, "Generating first list\n");
  3086. +    size_t hashLen = HashLength;
  3087. +    size_t lenIndices = sizeof(eh_index);
  3088. +    std::vector<FullStepRow<FullWidth>> X;
  3089. +    X.reserve(init_size);
  3090. +    unsigned char tmpHash[HashOutput];
  3091. +    for (eh_index g = 0; X.size() < init_size; g++) {
  3092. +        GenerateHash(base_state, g, tmpHash, HashOutput);
  3093. +        for (eh_index i = 0; i < IndicesPerHashOutput && X.size() < init_size; i++) {
  3094. +            X.emplace_back(tmpHash+(i*N/8), N/8, HashLength,
  3095. +                           CollisionBitLength, (g*IndicesPerHashOutput)+i);
  3096. +        }
  3097. +        if (cancelled(ListGeneration)) throw solver_cancelled;
  3098. +    }
  3099. +
  3100. +    // 3) Repeat step 2 until 2n/(k+1) bits remain
  3101. +    for (unsigned int r = 1; r < K && X.size() > 0; r++) {
  3102. +        LogPrint(BCLog::POW, "Round %u:\n", r);
  3103. +        // 2a) Sort the list
  3104. +        LogPrint(BCLog::POW, "- Sorting list\n");
  3105. +        std::sort(X.begin(), X.end(), CompareSR(CollisionByteLength));
  3106. +        if (cancelled(ListSorting)) throw solver_cancelled;
  3107. +
  3108. +        LogPrint(BCLog::POW, "- Finding collisions\n");
  3109. +        size_t i = 0;
  3110. +        size_t posFree = 0;
  3111. +        std::vector<FullStepRow<FullWidth>> Xc;
  3112. +        while (i < X.size() - 1) {
  3113. +            // 2b) Find next set of unordered pairs with collisions on the next n/(k+1) bits
  3114. +            size_t j = 1;
  3115. +            while (i+j < X.size() &&
  3116. +                    HasCollision(X[i], X[i+j], CollisionByteLength)) {
  3117. +                j++;
  3118. +            }
  3119. +
  3120. +            // 2c) Calculate tuples (X_i ^ X_j, (i, j))
  3121. +            for (size_t l = 0; l < j - 1; l++) {
  3122. +                for (size_t m = l + 1; m < j; m++) {
  3123. +                    if (DistinctIndices(X[i+l], X[i+m], hashLen, lenIndices)) {
  3124. +                        Xc.emplace_back(X[i+l], X[i+m], hashLen, lenIndices, CollisionByteLength);
  3125. +                    }
  3126. +                }
  3127. +            }
  3128. +
  3129. +            // 2d) Store tuples on the table in-place if possible
  3130. +            while (posFree < i+j && Xc.size() > 0) {
  3131. +                X[posFree++] = Xc.back();
  3132. +                Xc.pop_back();
  3133. +            }
  3134. +
  3135. +            i += j;
  3136. +            if (cancelled(ListColliding)) throw solver_cancelled;
  3137. +        }
  3138. +
  3139. +        // 2e) Handle edge case where final table entry has no collision
  3140. +        while (posFree < X.size() && Xc.size() > 0) {
  3141. +            X[posFree++] = Xc.back();
  3142. +            Xc.pop_back();
  3143. +        }
  3144. +
  3145. +        if (Xc.size() > 0) {
  3146. +            // 2f) Add overflow to end of table
  3147. +            X.insert(X.end(), Xc.begin(), Xc.end());
  3148. +        } else if (posFree < X.size()) {
  3149. +            // 2g) Remove empty space at the end
  3150. +            X.erase(X.begin()+posFree, X.end());
  3151. +            X.shrink_to_fit();
  3152. +        }
  3153. +
  3154. +        hashLen -= CollisionByteLength;
  3155. +        lenIndices *= 2;
  3156. +        if (cancelled(RoundEnd)) throw solver_cancelled;
  3157. +    }
  3158. +
  3159. +    // k+1) Find a collision on last 2n(k+1) bits
  3160. +    LogPrint(BCLog::POW, "Final round:\n");
  3161. +    if (X.size() > 1) {
  3162. +        LogPrint(BCLog::POW, "- Sorting list\n");
  3163. +        std::sort(X.begin(), X.end(), CompareSR(hashLen));
  3164. +        if (cancelled(FinalSorting)) throw solver_cancelled;
  3165. +        LogPrint(BCLog::POW, "- Finding collisions\n");
  3166. +        size_t i = 0;
  3167. +        while (i < X.size() - 1) {
  3168. +            size_t j = 1;
  3169. +            while (i+j < X.size() &&
  3170. +                    HasCollision(X[i], X[i+j], hashLen)) {
  3171. +                j++;
  3172. +            }
  3173. +
  3174. +            for (size_t l = 0; l < j - 1; l++) {
  3175. +                for (size_t m = l + 1; m < j; m++) {
  3176. +                    FullStepRow<FinalFullWidth> res(X[i+l], X[i+m], hashLen, lenIndices, 0);
  3177. +                    if (DistinctIndices(X[i+l], X[i+m], hashLen, lenIndices)) {
  3178. +                        auto soln = res.GetIndices(hashLen, 2*lenIndices, CollisionBitLength);
  3179. +                        assert(soln.size() == equihash_solution_size(N, K));
  3180. +                        if (validBlock(soln)) {
  3181. +                            return true;
  3182. +                        }
  3183. +                    }
  3184. +                }
  3185. +            }
  3186. +
  3187. +            i += j;
  3188. +            if (cancelled(FinalColliding)) throw solver_cancelled;
  3189. +        }
  3190. +    } else
  3191. +        LogPrint(BCLog::POW, "- List is empty\n");
  3192. +
  3193. +    return false;
  3194. +}
  3195. +
  3196. +template<size_t WIDTH>
  3197. +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)
  3198. +{
  3199. +    size_t i = 0;
  3200. +    size_t posFree = 0;
  3201. +    std::vector<FullStepRow<WIDTH>> Xc;
  3202. +    while (i < X.size() - 1) {
  3203. +        // 2b) Find next set of unordered pairs with collisions on the next n/(k+1) bits
  3204. +        size_t j = 1;
  3205. +        while (i+j < X.size() &&
  3206. +                HasCollision(X[i], X[i+j], clen)) {
  3207. +            j++;
  3208. +        }
  3209. +
  3210. +        // 2c) Calculate tuples (X_i ^ X_j, (i, j))
  3211. +        for (size_t l = 0; l < j - 1; l++) {
  3212. +            for (size_t m = l + 1; m < j; m++) {
  3213. +                if (DistinctIndices(X[i+l], X[i+m], hlen, lenIndices)) {
  3214. +                    if (IsValidBranch(X[i+l], hlen, ilen, lt) && IsValidBranch(X[i+m], hlen, ilen, rt)) {
  3215. +                        Xc.emplace_back(X[i+l], X[i+m], hlen, lenIndices, clen);
  3216. +                    } else if (IsValidBranch(X[i+m], hlen, ilen, lt) && IsValidBranch(X[i+l], hlen, ilen, rt)) {
  3217. +                        Xc.emplace_back(X[i+m], X[i+l], hlen, lenIndices, clen);
  3218. +                    }
  3219. +                }
  3220. +            }
  3221. +        }
  3222. +
  3223. +        // 2d) Store tuples on the table in-place if possible
  3224. +        while (posFree < i+j && Xc.size() > 0) {
  3225. +            X[posFree++] = Xc.back();
  3226. +            Xc.pop_back();
  3227. +        }
  3228. +
  3229. +        i += j;
  3230. +    }
  3231. +
  3232. +    // 2e) Handle edge case where final table entry has no collision
  3233. +    while (posFree < X.size() && Xc.size() > 0) {
  3234. +        X[posFree++] = Xc.back();
  3235. +        Xc.pop_back();
  3236. +    }
  3237. +
  3238. +    if (Xc.size() > 0) {
  3239. +        // 2f) Add overflow to end of table
  3240. +        X.insert(X.end(), Xc.begin(), Xc.end());
  3241. +    } else if (posFree < X.size()) {
  3242. +        // 2g) Remove empty space at the end
  3243. +        X.erase(X.begin()+posFree, X.end());
  3244. +        X.shrink_to_fit();
  3245. +    }
  3246. +}
  3247. +
  3248. +template<unsigned int N, unsigned int K>
  3249. +bool Equihash<N,K>::OptimisedSolve(const eh_HashState& base_state,
  3250. +                                   const std::function<bool(std::vector<unsigned char>)> validBlock,
  3251. +                                   const std::function<bool(EhSolverCancelCheck)> cancelled)
  3252. +{
  3253. +    eh_index init_size { 1 << (CollisionBitLength + 1) };
  3254. +    eh_index recreate_size { UntruncateIndex(1, 0, CollisionBitLength + 1) };
  3255. +
  3256. +    // First run the algorithm with truncated indices
  3257. +
  3258. +    const eh_index soln_size { 1 << K };
  3259. +    std::vector<std::shared_ptr<eh_trunc>> partialSolns;
  3260. +    size_t invalidCount = 0;
  3261. +    {
  3262. +
  3263. +        // 1) Generate first list
  3264. +        LogPrint(BCLog::POW, "Generating first list\n");
  3265. +        size_t hashLen = HashLength;
  3266. +        size_t lenIndices = sizeof(eh_trunc);
  3267. +        std::vector<TruncatedStepRow<TruncatedWidth>> Xt;
  3268. +        Xt.reserve(init_size);
  3269. +        unsigned char tmpHash[HashOutput];
  3270. +        for (eh_index g = 0; Xt.size() < init_size; g++) {
  3271. +            GenerateHash(base_state, g, tmpHash, HashOutput);
  3272. +            for (eh_index i = 0; i < IndicesPerHashOutput && Xt.size() < init_size; i++) {
  3273. +                Xt.emplace_back(tmpHash+(i*N/8), N/8, HashLength, CollisionBitLength,
  3274. +                                (g*IndicesPerHashOutput)+i, CollisionBitLength + 1);
  3275. +            }
  3276. +            if (cancelled(ListGeneration)) throw solver_cancelled;
  3277. +        }
  3278. +
  3279. +        // 3) Repeat step 2 until 2n/(k+1) bits remain
  3280. +        for (size_t r = 1; r < K && Xt.size() > 0; r++) {
  3281. +            LogPrint(BCLog::POW, "Round %zu:\n", r);
  3282. +            // 2a) Sort the list
  3283. +            LogPrint(BCLog::POW, "- Sorting list\n");
  3284. +            std::sort(Xt.begin(), Xt.end(), CompareSR(CollisionByteLength));
  3285. +            if (cancelled(ListSorting)) throw solver_cancelled;
  3286. +
  3287. +            LogPrint(BCLog::POW, "- Finding collisions\n");
  3288. +            size_t i = 0;
  3289. +            size_t posFree = 0;
  3290. +            std::vector<TruncatedStepRow<TruncatedWidth>> Xc;
  3291. +            while (i < Xt.size() - 1) {
  3292. +                // 2b) Find next set of unordered pairs with collisions on the next n/(k+1) bits
  3293. +                size_t j = 1;
  3294. +                while (i+j < Xt.size() &&
  3295. +                        HasCollision(Xt[i], Xt[i+j], CollisionByteLength)) {
  3296. +                    j++;
  3297. +                }
  3298. +
  3299. +                // 2c) Calculate tuples (X_i ^ X_j, (i, j))
  3300. +                //bool checking_for_zero = (i == 0 && Xt[0].IsZero(hashLen));
  3301. +                for (size_t l = 0; l < j - 1; l++) {
  3302. +                    for (size_t m = l + 1; m < j; m++) {
  3303. +                        // We truncated, so don't check for distinct indices here
  3304. +                        TruncatedStepRow<TruncatedWidth> Xi {Xt[i+l], Xt[i+m],
  3305. +                                                             hashLen, lenIndices,
  3306. +                                                             CollisionByteLength};
  3307. +                        if (!(Xi.IsZero(hashLen-CollisionByteLength) &&
  3308. +                              IsProbablyDuplicate<soln_size>(Xi.GetTruncatedIndices(hashLen-CollisionByteLength, 2*lenIndices),
  3309. +                                                             2*lenIndices))) {
  3310. +                            Xc.emplace_back(Xi);
  3311. +                        }
  3312. +                    }
  3313. +                }
  3314. +
  3315. +                // 2d) Store tuples on the table in-place if possible
  3316. +                while (posFree < i+j && Xc.size() > 0) {
  3317. +                    Xt[posFree++] = Xc.back();
  3318. +                    Xc.pop_back();
  3319. +                }
  3320. +
  3321. +                i += j;
  3322. +                if (cancelled(ListColliding)) throw solver_cancelled;
  3323. +            }
  3324. +
  3325. +            // 2e) Handle edge case where final table entry has no collision
  3326. +            while (posFree < Xt.size() && Xc.size() > 0) {
  3327. +                Xt[posFree++] = Xc.back();
  3328. +                Xc.pop_back();
  3329. +            }
  3330. +
  3331. +            if (Xc.size() > 0) {
  3332. +                // 2f) Add overflow to end of table
  3333. +                Xt.insert(Xt.end(), Xc.begin(), Xc.end());
  3334. +            } else if (posFree < Xt.size()) {
  3335. +                // 2g) Remove empty space at the end
  3336. +                Xt.erase(Xt.begin()+posFree, Xt.end());
  3337. +                Xt.shrink_to_fit();
  3338. +            }
  3339. +
  3340. +            hashLen -= CollisionByteLength;
  3341. +            lenIndices *= 2;
  3342. +            if (cancelled(RoundEnd)) throw solver_cancelled;
  3343. +        }
  3344. +
  3345. +        // k+1) Find a collision on last 2n(k+1) bits
  3346. +        LogPrint(BCLog::POW, "Final round:\n");
  3347. +        if (Xt.size() > 1) {
  3348. +            LogPrint(BCLog::POW, "- Sorting list\n");
  3349. +            std::sort(Xt.begin(), Xt.end(), CompareSR(hashLen));
  3350. +            if (cancelled(FinalSorting)) throw solver_cancelled;
  3351. +            LogPrint(BCLog::POW, "- Finding collisions\n");
  3352. +            size_t i = 0;
  3353. +            while (i < Xt.size() - 1) {
  3354. +                size_t j = 1;
  3355. +                while (i+j < Xt.size() &&
  3356. +                        HasCollision(Xt[i], Xt[i+j], hashLen)) {
  3357. +                    j++;
  3358. +                }
  3359. +
  3360. +                for (size_t l = 0; l < j - 1; l++) {
  3361. +                    for (size_t m = l + 1; m < j; m++) {
  3362. +                        TruncatedStepRow<FinalTruncatedWidth> res(Xt[i+l], Xt[i+m],
  3363. +                                                                  hashLen, lenIndices, 0);
  3364. +                        auto soln = res.GetTruncatedIndices(hashLen, 2*lenIndices);
  3365. +                        if (!IsProbablyDuplicate<soln_size>(soln, 2*lenIndices)) {
  3366. +                            partialSolns.push_back(soln);
  3367. +                        }
  3368. +                    }
  3369. +                }
  3370. +
  3371. +                i += j;
  3372. +                if (cancelled(FinalColliding)) throw solver_cancelled;
  3373. +            }
  3374. +        } else
  3375. +            LogPrint(BCLog::POW, "- List is empty\n");
  3376. +
  3377. +    } // Ensure Xt goes out of scope and is destroyed
  3378. +
  3379. +    LogPrint(BCLog::POW, "Found %d partial solutions\n", partialSolns.size());
  3380. +
  3381. +    // Now for each solution run the algorithm again to recreate the indices
  3382. +    LogPrint(BCLog::POW, "Culling solutions\n");
  3383. +    for (std::shared_ptr<eh_trunc> partialSoln : partialSolns) {
  3384. +        std::set<std::vector<unsigned char>> solns;
  3385. +        size_t hashLen;
  3386. +        size_t lenIndices;
  3387. +        unsigned char tmpHash[HashOutput];
  3388. +        std::vector<boost::optional<std::vector<FullStepRow<FinalFullWidth>>>> X;
  3389. +        X.reserve(K+1);
  3390. +
  3391. +        // 3) Repeat steps 1 and 2 for each partial index
  3392. +        for (eh_index i = 0; i < soln_size; i++) {
  3393. +            // 1) Generate first list of possibilities
  3394. +            std::vector<FullStepRow<FinalFullWidth>> icv;
  3395. +            icv.reserve(recreate_size);
  3396. +            for (eh_index j = 0; j < recreate_size; j++) {
  3397. +                eh_index newIndex { UntruncateIndex(partialSoln.get()[i], j, CollisionBitLength + 1) };
  3398. +                if (j == 0 || newIndex % IndicesPerHashOutput == 0) {
  3399. +                    GenerateHash(base_state, newIndex/IndicesPerHashOutput,
  3400. +                                 tmpHash, HashOutput);
  3401. +                }
  3402. +                icv.emplace_back(tmpHash+((newIndex % IndicesPerHashOutput) * N/8),
  3403. +                                 N/8, HashLength, CollisionBitLength, newIndex);
  3404. +                if (cancelled(PartialGeneration)) throw solver_cancelled;
  3405. +            }
  3406. +            boost::optional<std::vector<FullStepRow<FinalFullWidth>>> ic = icv;
  3407. +
  3408. +            // 2a) For each pair of lists:
  3409. +            hashLen = HashLength;
  3410. +            lenIndices = sizeof(eh_index);
  3411. +            size_t rti = i;
  3412. +            for (size_t r = 0; r <= K; r++) {
  3413. +                // 2b) Until we are at the top of a subtree:
  3414. +                if (r < X.size()) {
  3415. +                    if (X[r]) {
  3416. +                        // 2c) Merge the lists
  3417. +                        ic->reserve(ic->size() + X[r]->size());
  3418. +                        ic->insert(ic->end(), X[r]->begin(), X[r]->end());
  3419. +                        std::sort(ic->begin(), ic->end(), CompareSR(hashLen));
  3420. +                        if (cancelled(PartialSorting)) throw solver_cancelled;
  3421. +                        size_t lti = rti-(1<<r);
  3422. +                        CollideBranches(*ic, hashLen, lenIndices,
  3423. +                                        CollisionByteLength,
  3424. +                                        CollisionBitLength + 1,
  3425. +                                        partialSoln.get()[lti], partialSoln.get()[rti]);
  3426. +
  3427. +                        // 2d) Check if this has become an invalid solution
  3428. +                        if (ic->size() == 0)
  3429. +                            goto invalidsolution;
  3430. +
  3431. +                        X[r] = boost::none;
  3432. +                        hashLen -= CollisionByteLength;
  3433. +                        lenIndices *= 2;
  3434. +                        rti = lti;
  3435. +                    } else {
  3436. +                        X[r] = *ic;
  3437. +                        break;
  3438. +                    }
  3439. +                } else {
  3440. +                    X.push_back(ic);
  3441. +                    break;
  3442. +                }
  3443. +                if (cancelled(PartialSubtreeEnd)) throw solver_cancelled;
  3444. +            }
  3445. +            if (cancelled(PartialIndexEnd)) throw solver_cancelled;
  3446. +        }
  3447. +
  3448. +        // We are at the top of the tree
  3449. +        assert(X.size() == K+1);
  3450. +        for (FullStepRow<FinalFullWidth> row : *X[K]) {
  3451. +            auto soln = row.GetIndices(hashLen, lenIndices, CollisionBitLength);
  3452. +            assert(soln.size() == equihash_solution_size(N, K));
  3453. +            solns.insert(soln);
  3454. +        }
  3455. +        for (auto soln : solns) {
  3456. +            if (validBlock(soln))
  3457. +                return true;
  3458. +        }
  3459. +        if (cancelled(PartialEnd)) throw solver_cancelled;
  3460. +        continue;
  3461. +
  3462. +invalidsolution:
  3463. +        invalidCount++;
  3464. +    }
  3465. +    LogPrint(BCLog::POW, "- Number of invalid solutions found: %zu\n", invalidCount);
  3466. +
  3467. +    return false;
  3468. +}
  3469. +
  3470. +template<unsigned int N, unsigned int K>
  3471. +bool Equihash<N,K>::IsValidSolution(const eh_HashState& base_state, std::vector<unsigned char> soln)
  3472. +{
  3473. +    if (soln.size() != SolutionWidth) {
  3474. +        LogPrint(BCLog::POW, "Invalid solution length: %d (expected %d)\n",
  3475. +                 soln.size(), SolutionWidth);
  3476. +        return false;
  3477. +    }
  3478. +
  3479. +    std::vector<FullStepRow<FinalFullWidth>> X;
  3480. +    X.reserve(1 << K);
  3481. +    unsigned char tmpHash[HashOutput];
  3482. +    for (eh_index i : GetIndicesFromMinimal(soln, CollisionBitLength)) {
  3483. +        GenerateHash(base_state, i/IndicesPerHashOutput, tmpHash, HashOutput);
  3484. +        X.emplace_back(tmpHash+((i % IndicesPerHashOutput) * N/8),
  3485. +                       N/8, HashLength, CollisionBitLength, i);
  3486. +    }
  3487. +
  3488. +    size_t hashLen = HashLength;
  3489. +    size_t lenIndices = sizeof(eh_index);
  3490. +    while (X.size() > 1) {
  3491. +        std::vector<FullStepRow<FinalFullWidth>> Xc;
  3492. +        for (size_t i = 0; i < X.size(); i += 2) {
  3493. +            if (!HasCollision(X[i], X[i+1], CollisionByteLength)) {
  3494. +                LogPrint(BCLog::POW, "Invalid solution: invalid collision length between StepRows\n");
  3495. +                LogPrint(BCLog::POW, "X[i]   = %s\n", X[i].GetHex(hashLen));
  3496. +                LogPrint(BCLog::POW, "X[i+1] = %s\n", X[i+1].GetHex(hashLen));
  3497. +                return false;
  3498. +            }
  3499. +            if (X[i+1].IndicesBefore(X[i], hashLen, lenIndices)) {
  3500. +                LogPrint(BCLog::POW, "Invalid solution: Index tree incorrectly ordered\n");
  3501. +                return false;
  3502. +            }
  3503. +            if (!DistinctIndices(X[i], X[i+1], hashLen, lenIndices)) {
  3504. +                LogPrint(BCLog::POW, "Invalid solution: duplicate indices\n");
  3505. +                return false;
  3506. +            }
  3507. +            Xc.emplace_back(X[i], X[i+1], hashLen, lenIndices, CollisionByteLength);
  3508. +        }
  3509. +        X = Xc;
  3510. +        hashLen -= CollisionByteLength;
  3511. +        lenIndices *= 2;
  3512. +    }
  3513. +
  3514. +    assert(X.size() == 1);
  3515. +    return X[0].IsZero(hashLen);
  3516. +}
  3517. +
  3518. +// Explicit instantiations for Equihash<96,3>
  3519. +template int Equihash<96,3>::InitialiseState(eh_HashState& base_state);
  3520. +template bool Equihash<96,3>::BasicSolve(const eh_HashState& base_state,
  3521. +                                         const std::function<bool(std::vector<unsigned char>)> validBlock,
  3522. +                                         const std::function<bool(EhSolverCancelCheck)> cancelled);
  3523. +template bool Equihash<96,3>::OptimisedSolve(const eh_HashState& base_state,
  3524. +                                             const std::function<bool(std::vector<unsigned char>)> validBlock,
  3525. +                                             const std::function<bool(EhSolverCancelCheck)> cancelled);
  3526. +template bool Equihash<96,3>::IsValidSolution(const eh_HashState& base_state, std::vector<unsigned char> soln);
  3527. +
  3528. +// Explicit instantiations for Equihash<200,9>
  3529. +template int Equihash<200,9>::InitialiseState(eh_HashState& base_state);
  3530. +template bool Equihash<200,9>::BasicSolve(const eh_HashState& base_state,
  3531. +                                          const std::function<bool(std::vector<unsigned char>)> validBlock,
  3532. +                                          const std::function<bool(EhSolverCancelCheck)> cancelled);
  3533. +template bool Equihash<200,9>::OptimisedSolve(const eh_HashState& base_state,
  3534. +                                              const std::function<bool(std::vector<unsigned char>)> validBlock,
  3535. +                                              const std::function<bool(EhSolverCancelCheck)> cancelled);
  3536. +template bool Equihash<200,9>::IsValidSolution(const eh_HashState& base_state, std::vector<unsigned char> soln);
  3537. +
  3538. +// Explicit instantiations for Equihash<96,5>
  3539. +template int Equihash<96,5>::InitialiseState(eh_HashState& base_state);
  3540. +template bool Equihash<96,5>::BasicSolve(const eh_HashState& base_state,
  3541. +                                         const std::function<bool(std::vector<unsigned char>)> validBlock,
  3542. +                                         const std::function<bool(EhSolverCancelCheck)> cancelled);
  3543. +template bool Equihash<96,5>::OptimisedSolve(const eh_HashState& base_state,
  3544. +                                             const std::function<bool(std::vector<unsigned char>)> validBlock,
  3545. +                                             const std::function<bool(EhSolverCancelCheck)> cancelled);
  3546. +template bool Equihash<96,5>::IsValidSolution(const eh_HashState& base_state, std::vector<unsigned char> soln);
  3547. +
  3548. +// Explicit instantiations for Equihash<48,5>
  3549. +template int Equihash<48,5>::InitialiseState(eh_HashState& base_state);
  3550. +template bool Equihash<48,5>::BasicSolve(const eh_HashState& base_state,
  3551. +                                         const std::function<bool(std::vector<unsigned char>)> validBlock,
  3552. +                                         const std::function<bool(EhSolverCancelCheck)> cancelled);
  3553. +template bool Equihash<48,5>::OptimisedSolve(const eh_HashState& base_state,
  3554. +                                             const std::function<bool(std::vector<unsigned char>)> validBlock,
  3555. +                                             const std::function<bool(EhSolverCancelCheck)> cancelled);
  3556. +template bool Equihash<48,5>::IsValidSolution(const eh_HashState& base_state, std::vector<unsigned char> soln);
  3557. diff --git a/src/crypto/equihash.h b/src/crypto/equihash.h
  3558. new file mode 100644
  3559. index 0000000..85058e2
  3560. --- /dev/null
  3561. +++ b/src/crypto/equihash.h
  3562. @@ -0,0 +1,276 @@
  3563. +// Copyright (c) 2016 Jack Grigg
  3564. +// Copyright (c) 2016 The Zcash developers
  3565. +// Distributed under the MIT software license, see the accompanying
  3566. +// file COPYING or http://www.opensource.org/licenses/mit-license.php.
  3567. +
  3568. +#ifndef BITCOIN_EQUIHASH_H
  3569. +#define BITCOIN_EQUIHASH_H
  3570. +
  3571. +#include "compat/endian.h"
  3572. +#include "crypto/sha256.h"
  3573. +#include "utilstrencodings.h"
  3574. +
  3575. +#include "sodium.h"
  3576. +
  3577. +#include <cstring>
  3578. +#include <exception>
  3579. +#include <functional>
  3580. +#include <memory>
  3581. +#include <set>
  3582. +#include <vector>
  3583. +
  3584. +#include <boost/static_assert.hpp>
  3585. +
  3586. +typedef crypto_generichash_blake2b_state eh_HashState;
  3587. +typedef uint32_t eh_index;
  3588. +typedef uint8_t eh_trunc;
  3589. +
  3590. +void ExpandArray(const unsigned char* in, size_t in_len,
  3591. +                 unsigned char* out, size_t out_len,
  3592. +                 size_t bit_len, size_t byte_pad=0);
  3593. +void CompressArray(const unsigned char* in, size_t in_len,
  3594. +                   unsigned char* out, size_t out_len,
  3595. +                   size_t bit_len, size_t byte_pad=0);
  3596. +
  3597. +eh_index ArrayToEhIndex(const unsigned char* array);
  3598. +eh_trunc TruncateIndex(const eh_index i, const unsigned int ilen);
  3599. +
  3600. +std::vector<eh_index> GetIndicesFromMinimal(std::vector<unsigned char> minimal,
  3601. +                                            size_t cBitLen);
  3602. +std::vector<unsigned char> GetMinimalFromIndices(std::vector<eh_index> indices,
  3603. +                                                 size_t cBitLen);
  3604. +
  3605. +template<size_t WIDTH>
  3606. +class StepRow
  3607. +{
  3608. +    template<size_t W>
  3609. +    friend class StepRow;
  3610. +    friend class CompareSR;
  3611. +
  3612. +protected:
  3613. +    unsigned char hash[WIDTH];
  3614. +
  3615. +public:
  3616. +    StepRow(const unsigned char* hashIn, size_t hInLen,
  3617. +            size_t hLen, size_t cBitLen);
  3618. +    ~StepRow() { }
  3619. +
  3620. +    template<size_t W>
  3621. +    StepRow(const StepRow<W>& a);
  3622. +
  3623. +    bool IsZero(size_t len);
  3624. +    std::string GetHex(size_t len) { return HexStr(hash, hash+len); }
  3625. +
  3626. +    template<size_t W>
  3627. +    friend bool HasCollision(StepRow<W>& a, StepRow<W>& b, size_t l);
  3628. +};
  3629. +
  3630. +class CompareSR
  3631. +{
  3632. +private:
  3633. +    size_t len;
  3634. +
  3635. +public:
  3636. +    CompareSR(size_t l) : len {l} { }
  3637. +
  3638. +    template<size_t W>
  3639. +    inline bool operator()(const StepRow<W>& a, const StepRow<W>& b) { return memcmp(a.hash, b.hash, len) < 0; }
  3640. +};
  3641. +
  3642. +template<size_t WIDTH>
  3643. +bool HasCollision(StepRow<WIDTH>& a, StepRow<WIDTH>& b, size_t l);
  3644. +
  3645. +template<size_t WIDTH>
  3646. +class FullStepRow : public StepRow<WIDTH>
  3647. +{
  3648. +    template<size_t W>
  3649. +    friend class FullStepRow;
  3650. +
  3651. +    using StepRow<WIDTH>::hash;
  3652. +
  3653. +public:
  3654. +    FullStepRow(const unsigned char* hashIn, size_t hInLen,
  3655. +                size_t hLen, size_t cBitLen, eh_index i);
  3656. +    ~FullStepRow() { }
  3657. +
  3658. +    FullStepRow(const FullStepRow<WIDTH>& a) : StepRow<WIDTH> {a} { }
  3659. +    template<size_t W>
  3660. +    FullStepRow(const FullStepRow<W>& a, const FullStepRow<W>& b, size_t len, size_t lenIndices, size_t trim);
  3661. +    FullStepRow& operator=(const FullStepRow<WIDTH>& a);
  3662. +
  3663. +    inline bool IndicesBefore(const FullStepRow<WIDTH>& a, size_t len, size_t lenIndices) const { return memcmp(hash+len, a.hash+len, lenIndices) < 0; }
  3664. +    std::vector<unsigned char> GetIndices(size_t len, size_t lenIndices,
  3665. +                                          size_t cBitLen) const;
  3666. +
  3667. +    template<size_t W>
  3668. +    friend bool DistinctIndices(const FullStepRow<W>& a, const FullStepRow<W>& b,
  3669. +                                size_t len, size_t lenIndices);
  3670. +    template<size_t W>
  3671. +    friend bool IsValidBranch(const FullStepRow<W>& a, const size_t len, const unsigned int ilen, const eh_trunc t);
  3672. +};
  3673. +
  3674. +template<size_t WIDTH>
  3675. +class TruncatedStepRow : public StepRow<WIDTH>
  3676. +{
  3677. +    template<size_t W>
  3678. +    friend class TruncatedStepRow;
  3679. +
  3680. +    using StepRow<WIDTH>::hash;
  3681. +
  3682. +public:
  3683. +    TruncatedStepRow(const unsigned char* hashIn, size_t hInLen,
  3684. +                     size_t hLen, size_t cBitLen,
  3685. +                     eh_index i, unsigned int ilen);
  3686. +    ~TruncatedStepRow() { }
  3687. +
  3688. +    TruncatedStepRow(const TruncatedStepRow<WIDTH>& a) : StepRow<WIDTH> {a} { }
  3689. +    template<size_t W>
  3690. +    TruncatedStepRow(const TruncatedStepRow<W>& a, const TruncatedStepRow<W>& b, size_t len, size_t lenIndices, size_t trim);
  3691. +    TruncatedStepRow& operator=(const TruncatedStepRow<WIDTH>& a);
  3692. +
  3693. +    inline bool IndicesBefore(const TruncatedStepRow<WIDTH>& a, size_t len, size_t lenIndices) const { return memcmp(hash+len, a.hash+len, lenIndices) < 0; }
  3694. +    std::shared_ptr<eh_trunc> GetTruncatedIndices(size_t len, size_t lenIndices) const;
  3695. +};
  3696. +
  3697. +enum EhSolverCancelCheck
  3698. +{
  3699. +    ListGeneration,
  3700. +    ListSorting,
  3701. +    ListColliding,
  3702. +    RoundEnd,
  3703. +    FinalSorting,
  3704. +    FinalColliding,
  3705. +    PartialGeneration,
  3706. +    PartialSorting,
  3707. +    PartialSubtreeEnd,
  3708. +    PartialIndexEnd,
  3709. +    PartialEnd
  3710. +};
  3711. +
  3712. +class EhSolverCancelledException : public std::exception
  3713. +{
  3714. +    virtual const char* what() const throw() {
  3715. +        return "Equihash solver was cancelled";
  3716. +    }
  3717. +};
  3718. +
  3719. +inline constexpr size_t max(const size_t A, const size_t B) { return A > B ? A : B; }
  3720. +
  3721. +inline constexpr size_t equihash_solution_size(unsigned int N, unsigned int K) {
  3722. +    return (1 << K)*(N/(K+1)+1)/8;
  3723. +}
  3724. +
  3725. +template<unsigned int N, unsigned int K>
  3726. +class Equihash
  3727. +{
  3728. +private:
  3729. +    BOOST_STATIC_ASSERT(K < N);
  3730. +    BOOST_STATIC_ASSERT(N % 8 == 0);
  3731. +    BOOST_STATIC_ASSERT((N/(K+1)) + 1 < 8*sizeof(eh_index));
  3732. +
  3733. +public:
  3734. +    enum : size_t { IndicesPerHashOutput=512/N };
  3735. +    enum : size_t { HashOutput=IndicesPerHashOutput*N/8 };
  3736. +    enum : size_t { CollisionBitLength=N/(K+1) };
  3737. +    enum : size_t { CollisionByteLength=(CollisionBitLength+7)/8 };
  3738. +    enum : size_t { HashLength=(K+1)*CollisionByteLength };
  3739. +    enum : size_t { FullWidth=2*CollisionByteLength+sizeof(eh_index)*(1 << (K-1)) };
  3740. +    enum : size_t { FinalFullWidth=2*CollisionByteLength+sizeof(eh_index)*(1 << (K)) };
  3741. +    enum : size_t { TruncatedWidth=max(HashLength+sizeof(eh_trunc), 2*CollisionByteLength+sizeof(eh_trunc)*(1 << (K-1))) };
  3742. +    enum : size_t { FinalTruncatedWidth=max(HashLength+sizeof(eh_trunc), 2*CollisionByteLength+sizeof(eh_trunc)*(1 << (K))) };
  3743. +    enum : size_t { SolutionWidth=(1 << K)*(CollisionBitLength+1)/8 };
  3744. +
  3745. +    Equihash() { }
  3746. +
  3747. +    int InitialiseState(eh_HashState& base_state);
  3748. +    bool BasicSolve(const eh_HashState& base_state,
  3749. +                    const std::function<bool(std::vector<unsigned char>)> validBlock,
  3750. +                    const std::function<bool(EhSolverCancelCheck)> cancelled);
  3751. +    bool OptimisedSolve(const eh_HashState& base_state,
  3752. +                        const std::function<bool(std::vector<unsigned char>)> validBlock,
  3753. +                        const std::function<bool(EhSolverCancelCheck)> cancelled);
  3754. +    bool IsValidSolution(const eh_HashState& base_state, std::vector<unsigned char> soln);
  3755. +};
  3756. +
  3757. +#include "equihash.tcc"
  3758. +
  3759. +static Equihash<96,3> Eh96_3;
  3760. +static Equihash<200,9> Eh200_9;
  3761. +static Equihash<96,5> Eh96_5;
  3762. +static Equihash<48,5> Eh48_5;
  3763. +
  3764. +#define EhInitialiseState(n, k, base_state)  \
  3765. +    if (n == 96 && k == 3) {                 \
  3766. +        Eh96_3.InitialiseState(base_state);  \
  3767. +    } else if (n == 200 && k == 9) {         \
  3768. +        Eh200_9.InitialiseState(base_state); \
  3769. +    } else if (n == 96 && k == 5) {          \
  3770. +        Eh96_5.InitialiseState(base_state);  \
  3771. +    } else if (n == 48 && k == 5) {          \
  3772. +        Eh48_5.InitialiseState(base_state);  \
  3773. +    } else {                                 \
  3774. +        throw std::invalid_argument("Unsupported Equihash parameters"); \
  3775. +    }
  3776. +
  3777. +inline bool EhBasicSolve(unsigned int n, unsigned int k, const eh_HashState& base_state,
  3778. +                    const std::function<bool(std::vector<unsigned char>)> validBlock,
  3779. +                    const std::function<bool(EhSolverCancelCheck)> cancelled)
  3780. +{
  3781. +    if (n == 96 && k == 3) {
  3782. +        return Eh96_3.BasicSolve(base_state, validBlock, cancelled);
  3783. +    } else if (n == 200 && k == 9) {
  3784. +        return Eh200_9.BasicSolve(base_state, validBlock, cancelled);
  3785. +    } else if (n == 96 && k == 5) {
  3786. +        return Eh96_5.BasicSolve(base_state, validBlock, cancelled);
  3787. +    } else if (n == 48 && k == 5) {
  3788. +        return Eh48_5.BasicSolve(base_state, validBlock, cancelled);
  3789. +    } else {
  3790. +        throw std::invalid_argument("Unsupported Equihash parameters");
  3791. +    }
  3792. +}
  3793. +
  3794. +inline bool EhBasicSolveUncancellable(unsigned int n, unsigned int k, const eh_HashState& base_state,
  3795. +                    const std::function<bool(std::vector<unsigned char>)> validBlock)
  3796. +{
  3797. +    return EhBasicSolve(n, k, base_state, validBlock,
  3798. +                        [](EhSolverCancelCheck pos) { return false; });
  3799. +}
  3800. +
  3801. +inline bool EhOptimisedSolve(unsigned int n, unsigned int k, const eh_HashState& base_state,
  3802. +                    const std::function<bool(std::vector<unsigned char>)> validBlock,
  3803. +                    const std::function<bool(EhSolverCancelCheck)> cancelled)
  3804. +{
  3805. +    if (n == 96 && k == 3) {
  3806. +        return Eh96_3.OptimisedSolve(base_state, validBlock, cancelled);
  3807. +    } else if (n == 200 && k == 9) {
  3808. +        return Eh200_9.OptimisedSolve(base_state, validBlock, cancelled);
  3809. +    } else if (n == 96 && k == 5) {
  3810. +        return Eh96_5.OptimisedSolve(base_state, validBlock, cancelled);
  3811. +    } else if (n == 48 && k == 5) {
  3812. +        return Eh48_5.OptimisedSolve(base_state, validBlock, cancelled);
  3813. +    } else {
  3814. +        throw std::invalid_argument("Unsupported Equihash parameters");
  3815. +    }
  3816. +}
  3817. +
  3818. +inline bool EhOptimisedSolveUncancellable(unsigned int n, unsigned int k, const eh_HashState& base_state,
  3819. +                    const std::function<bool(std::vector<unsigned char>)> validBlock)
  3820. +{
  3821. +    return EhOptimisedSolve(n, k, base_state, validBlock,
  3822. +                            [](EhSolverCancelCheck pos) { return false; });
  3823. +}
  3824. +
  3825. +#define EhIsValidSolution(n, k, base_state, soln, ret)   \
  3826. +    if (n == 96 && k == 3) {                             \
  3827. +        ret = Eh96_3.IsValidSolution(base_state, soln);  \
  3828. +    } else if (n == 200 && k == 9) {                     \
  3829. +        ret = Eh200_9.IsValidSolution(base_state, soln); \
  3830. +    } else if (n == 96 && k == 5) {                      \
  3831. +        ret = Eh96_5.IsValidSolution(base_state, soln);  \
  3832. +    } else if (n == 48 && k == 5) {                      \
  3833. +        ret = Eh48_5.IsValidSolution(base_state, soln);  \
  3834. +    } else {                                             \
  3835. +        throw std::invalid_argument("Unsupported Equihash parameters"); \
  3836. +    }
  3837. +
  3838. +#endif // BITCOIN_EQUIHASH_H
  3839. diff --git a/src/crypto/equihash.tcc b/src/crypto/equihash.tcc
  3840. new file mode 100644
  3841. index 0000000..e2185b7
  3842. --- /dev/null
  3843. +++ b/src/crypto/equihash.tcc
  3844. @@ -0,0 +1,49 @@
  3845. +// Copyright (c) 2016 Jack Grigg
  3846. +// Copyright (c) 2016 The Zcash developers
  3847. +// Distributed under the MIT software license, see the accompanying
  3848. +// file COPYING or http://www.opensource.org/licenses/mit-license.php.
  3849. +
  3850. +#include <algorithm>
  3851. +#include <cassert>
  3852. +
  3853. +// Checks if the intersection of a.indices and b.indices is empty
  3854. +template<size_t WIDTH>
  3855. +bool DistinctIndices(const FullStepRow<WIDTH>& a, const FullStepRow<WIDTH>& b, size_t len, size_t lenIndices)
  3856. +{
  3857. +    for(size_t i = 0; i < lenIndices; i += sizeof(eh_index)) {
  3858. +        for(size_t j = 0; j < lenIndices; j += sizeof(eh_index)) {
  3859. +            if (memcmp(a.hash+len+i, b.hash+len+j, sizeof(eh_index)) == 0) {
  3860. +                return false;
  3861. +            }
  3862. +        }
  3863. +    }
  3864. +    return true;
  3865. +}
  3866. +
  3867. +template<size_t MAX_INDICES>
  3868. +bool IsProbablyDuplicate(std::shared_ptr<eh_trunc> indices, size_t lenIndices)
  3869. +{
  3870. +    assert(lenIndices <= MAX_INDICES);
  3871. +    bool checked_index[MAX_INDICES] = {false};
  3872. +    size_t count_checked = 0;
  3873. +    for (size_t z = 0; z < lenIndices; z++) {
  3874. +        // Skip over indices we have already paired
  3875. +        if (!checked_index[z]) {
  3876. +            for (size_t y = z+1; y < lenIndices; y++) {
  3877. +                if (!checked_index[y] && indices.get()[z] == indices.get()[y]) {
  3878. +                    // Pair found
  3879. +                    checked_index[y] = true;
  3880. +                    count_checked += 2;
  3881. +                    break;
  3882. +                }
  3883. +            }
  3884. +        }
  3885. +    }
  3886. +    return count_checked == lenIndices;
  3887. +}
  3888. +
  3889. +template<size_t WIDTH>
  3890. +bool IsValidBranch(const FullStepRow<WIDTH>& a, const size_t len, const unsigned int ilen, const eh_trunc t)
  3891. +{
  3892. +    return TruncateIndex(ArrayToEhIndex(a.hash+len), ilen) == t;
  3893. +}
  3894. diff --git a/src/init.cpp b/src/init.cpp
  3895. index 62e66cb..e256353 100644
  3896. --- a/src/init.cpp
  3897. +++ b/src/init.cpp
  3898. @@ -567,6 +567,8 @@ std::string HelpMessage(HelpMessageMode mode) {
  3899.                      "MiB per 24h), 0 = no limit (default: %d)"),
  3900.                    DEFAULT_MAX_UPLOAD_TARGET));
  3901.  
  3902. +    strUsage += HelpMessageOpt("-bootstrap", _("Enables Bitcoin Candy bootstrap mode. Allows CDY client to connect to Bitcoin p2p network to download blockahin history."));
  3903. +    strUsage += HelpMessageOpt("-skiphardforkibd", _("Skip Initial Block Download when reaching hardfork block."));
  3904.  #ifdef ENABLE_WALLET
  3905.      strUsage += CWallet::GetWalletHelpString(showDebug);
  3906.  #endif
  3907. @@ -866,8 +868,8 @@ std::string HelpMessage(HelpMessageMode mode) {
  3908.  
  3909.  std::string LicenseInfo() {
  3910.      const std::string URL_SOURCE_CODE =
  3911. -        "<https://github.com/Bitcoin-ABC/bitcoin-abc>";
  3912. -    const std::string URL_WEBSITE = "<https://www.bitcoinabc.org>";
  3913. +        "<https://github.com/bitcoincandyteam/bitcoincandy>";
  3914. +    const std::string URL_WEBSITE = "<http://www.bitcoincandy.one";
  3915.  
  3916.      return CopyrightHolders(
  3917.                 strprintf(_("Copyright (C) %i-%i"), 2009, COPYRIGHT_YEAR) +
  3918. @@ -1677,6 +1679,9 @@ bool AppInitMain(Config &config, boost::thread_group &threadGroup,
  3919.          }
  3920.      }
  3921.  
  3922. +    //fCDYBootstrapping = GetBoolArg("-bootstrap", false);
  3923. +    //fSkipHardforkIBD = GetBoolArg("-skiphardforkibd", false);
  3924. +
  3925.      // Start the lightweight task scheduler thread
  3926.      CScheduler::Function serviceLoop =
  3927.          boost::bind(&CScheduler::serviceQueue, &scheduler);
  3928. @@ -1873,6 +1878,9 @@ bool AppInitMain(Config &config, boost::thread_group &threadGroup,
  3929.              GetArg("-maxuploadtarget", DEFAULT_MAX_UPLOAD_TARGET) * 1024 * 1024;
  3930.      }
  3931.    
  3932. +    //if (fCDYBootstrapping)
  3933. +    //    nLocalServices = ServiceFlags(nLocalServices & ~NODE_BITCOIN_CASH);
  3934. +
  3935.      // Step 7: load block chain
  3936.  
  3937.      fReindex = GetBoolArg("-reindex", false);
  3938. @@ -2113,8 +2121,7 @@ bool AppInitMain(Config &config, boost::thread_group &threadGroup,
  3939.  
  3940.      // Encoded addresses using cashaddr instead of base58
  3941.      // Activates by default on Jan, 14
  3942. -    config.SetCashAddrEncoding(
  3943. -        GetBoolArg("-usecashaddr", GetAdjustedTime() > 1515900000));
  3944. +    config.SetCashAddrEncoding(false);  // disabled for bitcoin candy
  3945.  
  3946.  // Step 8: load wallet
  3947.  #ifdef ENABLE_WALLET
  3948. diff --git a/src/miner.cpp b/src/miner.cpp
  3949. index 287200b..290331b 100644
  3950. --- a/src/miner.cpp
  3951. +++ b/src/miner.cpp
  3952. @@ -202,17 +202,29 @@ BlockAssembler::CreateNewBlock(const CScript &scriptPubKeyIn) {
  3953.      pblock->vtx[0] = MakeTransactionRef(coinbaseTx);
  3954.      pblocktemplate->vTxFees[0] = -1 * nFees;
  3955.  
  3956. -    uint64_t nSerializeSize =
  3957. -        GetSerializeSize(*pblock, SER_NETWORK, PROTOCOL_VERSION);
  3958. +    const Consensus::Params& params = chainparams.GetConsensus();
  3959. +    int ser_flags = (nHeight < params.cdyHeight) ? SERIALIZE_BLOCK_LEGACY : 0;
  3960. +    uint64_t nSerializeSize = GetSerializeSize(*pblock, SER_NETWORK, PROTOCOL_VERSION | ser_flags);
  3961.  
  3962.      LogPrintf("CreateNewBlock(): total size: %u txs: %u fees: %ld sigops %d\n",
  3963.                nSerializeSize, nBlockTx, nFees, nBlockSigOps);
  3964.  
  3965. +    arith_uint256 nonce;
  3966. +    if (nHeight >= params.cdyHeight) {
  3967. +        // Randomise nonce for new block foramt.
  3968. +        nonce = UintToArith256(GetRandHash());
  3969. +        // Clear the top and bottom 16 bits (for local use as thread flags and counters)
  3970. +        nonce <<= 32;
  3971. +        nonce >>= 16;
  3972. +    }
  3973.      // Fill in header.
  3974.      pblock->hashPrevBlock = pindexPrev->GetBlockHash();
  3975. +    pblock->nHeight        = pindexPrev->nHeight + 1;
  3976. +    memset(pblock->nReserved, 0, sizeof(pblock->nReserved));
  3977.      UpdateTime(pblock, *config, pindexPrev);
  3978.      pblock->nBits = GetNextWorkRequired(pindexPrev, pblock, *config);
  3979. -    pblock->nNonce = 0;
  3980. +    pblock->nNonce         = ArithToUint256(nonce);
  3981. +    pblock->nSolution.clear();
  3982.      pblocktemplate->vTxSigOpsCount[0] =
  3983.          GetSigOpCountWithoutP2SH(*pblock->vtx[0]);
  3984.  
  3985. diff --git a/src/net.cpp b/src/net.cpp
  3986. index 527a1a2..331e32c 100644
  3987. --- a/src/net.cpp
  3988. +++ b/src/net.cpp
  3989. @@ -91,7 +91,7 @@ void CConnman::AddOneShot(const std::string &strDest) {
  3990.  }
  3991.  
  3992.  unsigned short GetListenPort() {
  3993. -    return (unsigned short)(GetArg("-port", Params().GetDefaultPort()));
  3994. +    return (unsigned short)(GetArg("-port", Params().GetDefaultPort(fCDYBootstrapping)));//Yang
  3995.  }
  3996.  
  3997.  // find 'best' local address for a particular peer
  3998. @@ -351,7 +351,7 @@ CNode *CConnman::ConnectNode(CAddress addrConnect, const char *pszDest,
  3999.      SOCKET hSocket;
  4000.      bool proxyConnectionFailed = false;
  4001.      if (pszDest ? ConnectSocketByName(addrConnect, hSocket, pszDest,
  4002. -                                      Params().GetDefaultPort(),
  4003. +                                      Params().GetDefaultPort(fCDYBootstrapping),
  4004.                                        nConnectTimeout, &proxyConnectionFailed)
  4005.                  : ConnectSocket(addrConnect, hSocket, nConnectTimeout,
  4006.                                  &proxyConnectionFailed)) {
  4007. @@ -390,6 +390,10 @@ CNode *CConnman::ConnectNode(CAddress addrConnect, const char *pszDest,
  4008.              new CNode(id, nLocalServices, GetBestHeight(), hSocket, addrConnect,
  4009.                        CalculateKeyedNetGroup(addrConnect), nonce,
  4010.                        pszDest ? pszDest : "", false);
  4011. +        if (fCDYBootstrapping) {
  4012. +            pnode->fUsesCDYMagic = false;
  4013. +        }
  4014. +
  4015.          pnode->nServicesExpected =
  4016.              ServiceFlags(addrConnect.nServices & nRelevantServices);
  4017.          pnode->AddRef();
  4018. @@ -670,6 +674,7 @@ void CNode::copyStats(CNodeStats &stats) {
  4019.          X(nRecvBytes);
  4020.      }
  4021.      X(fWhitelisted);
  4022. +    X(fUsesCDYMagic);
  4023.  
  4024.      // It is common for nodes with good ping times to suddenly become lagged,
  4025.      // due to a new block arriving or other large transfer. Merely reporting
  4026. @@ -706,7 +711,7 @@ bool CNode::ReceiveMsgBytes(const char *pch, unsigned int nBytes,
  4027.      while (nBytes > 0) {
  4028.          // Get current incomplete message, or create a new one.
  4029.          if (vRecvMsg.empty() || vRecvMsg.back().complete()) {
  4030. -            vRecvMsg.push_back(CNetMessage(Params().NetMagic(), SER_NETWORK,
  4031. +            vRecvMsg.push_back(CNetMessage(GetMagic(Params()), SER_NETWORK,
  4032.                                             INIT_PROTO_VERSION));
  4033.          }
  4034.  
  4035. @@ -1684,7 +1689,7 @@ void CConnman::ThreadDNSAddressSeed() {
  4036.                  for (const CNetAddr &ip : vIPs) {
  4037.                      int nOneDay = 24 * 3600;
  4038.                      CAddress addr =
  4039. -                        CAddress(CService(ip, Params().GetDefaultPort()),
  4040. +                        CAddress(CService(ip, Params().GetDefaultPort(fCDYBootstrapping)),
  4041.                                   requiredServiceBits);
  4042.                      // Use a random age between 3 and 7 days old.
  4043.                      addr.nTime = GetTime() - 3 * nOneDay - GetRand(4 * nOneDay);
  4044. @@ -1891,7 +1896,9 @@ void CConnman::ThreadOpenConnections() {
  4045.  
  4046.              // do not allow non-default ports, unless after 50 invalid addresses
  4047.              // selected already.
  4048. -            if (addr.GetPort() != Params().GetDefaultPort() && nTries < 50) {
  4049. +            if ((addr.GetPort() != Params().GetDefaultPort() ||
  4050. +                 (fCDYBootstrapping && addr.GetPort() != Params().GetDefaultPort(true)))
  4051. +            && nTries < 50) {
  4052.                  continue;
  4053.              }
  4054.  
  4055. @@ -1954,7 +1961,7 @@ std::vector<AddedNodeInfo> CConnman::GetAddedNodeInfo() {
  4056.  
  4057.      for (const std::string &strAddNode : lAddresses) {
  4058.          CService service(
  4059. -            LookupNumeric(strAddNode.c_str(), Params().GetDefaultPort()));
  4060. +            LookupNumeric(strAddNode.c_str(), Params().GetDefaultPort(fCDYBootstrapping)));
  4061.          if (service.IsValid()) {
  4062.              // strAddNode is an IP:port
  4063.              auto it = mapConnected.find(service);
  4064. @@ -2006,7 +2013,7 @@ void CConnman::ThreadOpenAddedConnections() {
  4065.                  // IP/port.
  4066.                  tried = true;
  4067.                  CService service(LookupNumeric(info.strAddedNode.c_str(),
  4068. -                                               Params().GetDefaultPort()));
  4069. +                                               Params().GetDefaultPort(fCDYBootstrapping)));
  4070.                  OpenNetworkConnection(CAddress(service, NODE_NONE), false,
  4071.                                        &grant, info.strAddedNode.c_str(), false,
  4072.                                        false, true);
  4073. @@ -2842,6 +2849,7 @@ CNode::CNode(NodeId idIn, ServiceFlags nLocalServicesIn,
  4074.      nPingUsecStart = 0;
  4075.      nPingUsecTime = 0;
  4076.      fPingQueued = false;
  4077. +    fUsesCDYMagic = true;
  4078.      nMinPingUsecTime = std::numeric_limits<int64_t>::max();
  4079.      minFeeFilter = Amount(0);
  4080.      lastSentFeeFilter = Amount(0);
  4081. @@ -2926,7 +2934,7 @@ void CConnman::PushMessage(CNode *pnode, CSerializedNetMsg &&msg) {
  4082.      std::vector<uint8_t> serializedHeader;
  4083.      serializedHeader.reserve(CMessageHeader::HEADER_SIZE);
  4084.      uint256 hash = Hash(msg.data.data(), msg.data.data() + nMessageSize);
  4085. -    CMessageHeader hdr(Params().NetMagic(), msg.command.c_str(), nMessageSize);
  4086. +    CMessageHeader hdr(pnode->GetMagic(Params()), msg.command.c_str(), nMessageSize);
  4087.      memcpy(hdr.pchChecksum, hash.begin(), CMessageHeader::CHECKSUM_SIZE);
  4088.  
  4089.      CVectorWriter{SER_NETWORK, INIT_PROTO_VERSION, serializedHeader, 0, hdr};
  4090. diff --git a/src/net.h b/src/net.h
  4091. index d54b4e8..ffe7f95 100644
  4092. --- a/src/net.h
  4093. +++ b/src/net.h
  4094. @@ -91,7 +91,7 @@ static const bool DEFAULT_BLOCKSONLY = false;
  4095.  // Force DNS seed use ahead of UAHF fork, to ensure peers are found
  4096.  // as long as seeders are working.
  4097.  // TODO: Change this back to false after the forked network is stable.
  4098. -static const bool DEFAULT_FORCEDNSSEED = true;
  4099. +static const bool DEFAULT_FORCEDNSSEED = false;
  4100.  static const size_t DEFAULT_MAXRECEIVEBUFFER = 5 * 1000;
  4101.  static const size_t DEFAULT_MAXSENDBUFFER = 1 * 1000;
  4102.  
  4103. @@ -520,6 +520,7 @@ public:
  4104.      double dMinPing;
  4105.      std::string addrLocal;
  4106.      CAddress addr;
  4107. +    bool fUsesCDYMagic;
  4108.  };
  4109.  
  4110.  class CNetMessage {
  4111. @@ -700,6 +701,8 @@ public:
  4112.      std::atomic<int64_t> nMinPingUsecTime;
  4113.      // Whether a ping is requested.
  4114.      std::atomic<bool> fPingQueued;
  4115. +    // Whether the node uses the bitcoin candy magic to communicate.
  4116. +    std::atomic<bool> fUsesCDYMagic;
  4117.      // Minimum fee rate with which to filter inv's to this node
  4118.      Amount minFeeFilter;
  4119.      CCriticalSection cs_feeFilter;
  4120. @@ -749,6 +752,10 @@ public:
  4121.      void SetSendVersion(int nVersionIn);
  4122.      int GetSendVersion() const;
  4123.  
  4124. +    const CMessageHeader::MessageMagic& GetMagic(const CChainParams &params) const {
  4125. +        return fUsesCDYMagic ? params.NetMagic() : params.NetMagicLegacy();
  4126. +    }
  4127. +
  4128.      CService GetAddrLocal() const;
  4129.      //! May not be called more than once
  4130.      void SetAddrLocal(const CService &addrLocalIn);
  4131. @@ -810,6 +817,8 @@ public:
  4132.      std::string GetAddrName() const;
  4133.      //! Sets the addrName only if it was not previously set
  4134.      void MaybeSetAddrName(const std::string &addrNameIn);
  4135. +    
  4136. +    bool IsLegacyBlockHeader(int version) { return version < CDY_HARD_FORK_VERSION; };
  4137.  };
  4138.  
  4139.  /**
  4140. diff --git a/src/net_processing.cpp b/src/net_processing.cpp
  4141. index 43b8f37..48dbf69 100644
  4142. --- a/src/net_processing.cpp
  4143. +++ b/src/net_processing.cpp
  4144. @@ -525,8 +525,11 @@ void MaybeSetPeerAsAnnouncingHeaderAndIDs(NodeId nodeid, CConnman &connman) {
  4145.  
  4146.  // Requires cs_main
  4147.  bool CanDirectFetch(const Consensus::Params &consensusParams) {
  4148. -    return chainActive.Tip()->GetBlockTime() >
  4149. -           GetAdjustedTime() - consensusParams.nPowTargetSpacing * 20;
  4150. +    int64_t target_time = GetAdjustedTime();
  4151. +    if (fCDYBootstrapping && consensusParams.BitcoinPostforkTime > 0) {
  4152. +        target_time = consensusParams.BitcoinPostforkTime;
  4153. +    }
  4154. +    return chainActive.Tip()->GetBlockTime() > target_time - consensusParams.nPowTargetSpacing * 20;
  4155.  }
  4156.  
  4157.  // Requires cs_main
  4158. @@ -637,6 +640,7 @@ void FindNextBlocksToDownload(NodeId nodeid, unsigned int count,
  4159.          for (const CBlockIndex *pindex : vToFetch) {
  4160.              if (!pindex->IsValid(BLOCK_VALID_TREE)) {
  4161.                  // We consider the chain that this peer is on invalid.
  4162. +                LogPrintf("%s: Invalid block at height %d(%s)\n", __func__, pindex->nHeight, pindex->phashBlock->ToString());
  4163.                  return;
  4164.              }
  4165.              if (pindex->nStatus & BLOCK_HAVE_DATA ||
  4166. @@ -1232,6 +1236,8 @@ static void ProcessGetData(const Config &config, CNode *pfrom,
  4167.                          assert(!"cannot load block from disk");
  4168.                      }
  4169.  
  4170. +                    int legacy_block_flag = (pfrom->IsLegacyBlockHeader(pfrom->GetSendVersion())
  4171. +                                                 ? SERIALIZE_BLOCK_LEGACY : 0);
  4172.                      if (inv.type == MSG_BLOCK) {
  4173.                          connman.PushMessage(
  4174.                              pfrom, msgMaker.Make(NetMsgType::BLOCK, block));
  4175. @@ -1248,7 +1254,7 @@ static void ProcessGetData(const Config &config, CNode *pfrom,
  4176.                          }
  4177.                          if (sendMerkleBlock) {
  4178.                              connman.PushMessage(
  4179. -                                pfrom, msgMaker.Make(NetMsgType::MERKLEBLOCK,
  4180. +                                pfrom, msgMaker.Make(legacy_block_flag,NetMsgType::MERKLEBLOCK,
  4181.                                                       merkleBlock));
  4182.                              // CMerkleBlock just contains hashes, so also push
  4183.                              // any transactions in the block the client did not
  4184. @@ -1265,7 +1271,7 @@ static void ProcessGetData(const Config &config, CNode *pfrom,
  4185.                              for (PairType &pair : merkleBlock.vMatchedTxn) {
  4186.                                  connman.PushMessage(
  4187.                                      pfrom,
  4188. -                                    msgMaker.Make(NetMsgType::TX,
  4189. +                                    msgMaker.Make(legacy_block_flag,NetMsgType::TX,
  4190.                                                    *block.vtx[pair.first]));
  4191.                              }
  4192.                          }
  4193. @@ -1277,7 +1283,7 @@ static void ProcessGetData(const Config &config, CNode *pfrom,
  4194.                          // against a compact block, and we don't feel like
  4195.                          // constructing the object for them, so instead we
  4196.                          // respond with the full, non-compact block.
  4197. -                        int nSendFlags = 0;
  4198. +                        int nSendFlags = legacy_block_flag;
  4199.                          if (CanDirectFetch(consensusParams) &&
  4200.                              mi->second->nHeight >=
  4201.                                  chainActive.Height() - MAX_CMPCTBLOCK_DEPTH) {
  4202. @@ -1599,6 +1605,9 @@ static bool ProcessMessage(const Config &config, CNode *pfrom,
  4203.                    pfrom->addr.ToString().c_str(), cleanSubVer, pfrom->nVersion,
  4204.                    pfrom->nStartingHeight, addrMe.ToString(), pfrom->id,
  4205.                    remoteAddr);
  4206. +        if (pfrom->fUsesCDYMagic) {
  4207. +            LogPrintf("peer %d uses CDY magic in its headers\n", pfrom->id);
  4208. +        }
  4209.  
  4210.          int64_t nTimeOffset = nTime - GetTime();
  4211.          pfrom->nTimeOffset = nTimeOffset;
  4212. @@ -1701,6 +1710,8 @@ static bool ProcessMessage(const Config &config, CNode *pfrom,
  4213.                  return true;
  4214.              }
  4215.  
  4216. +            if (addr.GetPort() != chainparams.GetDefaultPort()) continue;
  4217. +
  4218.              if ((addr.nServices & REQUIRED_SERVICES) != REQUIRED_SERVICES) {
  4219.                  continue;
  4220.              }
  4221. @@ -2041,8 +2052,9 @@ static bool ProcessMessage(const Config &config, CNode *pfrom,
  4222.          // will re-announce the new block via headers (or compact blocks again)
  4223.          // in the SendMessages logic.
  4224.          nodestate->pindexBestHeaderSent = pindex ? pindex : chainActive.Tip();
  4225. -        connman.PushMessage(pfrom,
  4226. -                            msgMaker.Make(NetMsgType::HEADERS, vHeaders));
  4227. +        
  4228. +        int legacy_block_flag = pfrom->IsLegacyBlockHeader(pfrom->GetSendVersion()) ? SERIALIZE_BLOCK_LEGACY : 0;
  4229. +        connman.PushMessage(pfrom, msgMaker.Make(legacy_block_flag, NetMsgType::HEADERS, vHeaders));
  4230.      }
  4231.  
  4232.      else if (strCommand == NetMsgType::TX) {
  4233. @@ -2604,12 +2616,17 @@ static bool ProcessMessage(const Config &config, CNode *pfrom,
  4234.          }
  4235.      }
  4236.  
  4237. -    // Ignore headers received while importing
  4238. -    else if (strCommand == NetMsgType::HEADERS && !fImporting && !fReindex) {
  4239. +
  4240. +    else if (strCommand == NetMsgType::HEADERS && !fImporting && !fReindex) // Ignore headers received while importing
  4241. +    {
  4242. +        // Deserialize in legacy format.
  4243. +        int legacy_block_flag = pfrom->IsLegacyBlockHeader(pfrom->GetRecvVersion()) ? SERIALIZE_BLOCK_LEGACY : 0;
  4244. +        int original_version = vRecv.GetVersion();
  4245. +        vRecv.SetVersion(original_version | legacy_block_flag);
  4246. +
  4247.          std::vector<CBlockHeader> headers;
  4248.  
  4249. -        // Bypass the normal CBlock deserialization, as we don't want to risk
  4250. -        // deserializing 2000 full blocks.
  4251. +        // Bypass the normal CBlock deserialization, as we don't want to risk deserializing 2000 full blocks.
  4252.          unsigned int nCount = ReadCompactSize(vRecv);
  4253.          if (nCount > MAX_HEADERS_RESULTS) {
  4254.              LOCK(cs_main);
  4255. @@ -2619,9 +2636,9 @@ static bool ProcessMessage(const Config &config, CNode *pfrom,
  4256.          headers.resize(nCount);
  4257.          for (unsigned int n = 0; n < nCount; n++) {
  4258.              vRecv >> headers[n];
  4259. -            // Ignore tx count; assume it is 0.
  4260. -            ReadCompactSize(vRecv);
  4261. +            ReadCompactSize(vRecv); // ignore tx count; assume it is 0.
  4262.          }
  4263. +        vRecv.SetVersion(original_version);
  4264.  
  4265.          if (nCount == 0) {
  4266.              // Nothing interesting. Stop asking this peers for more headers.
  4267. @@ -2648,10 +2665,16 @@ static bool ProcessMessage(const Config &config, CNode *pfrom,
  4268.                      mapBlockIndex.end() &&
  4269.                  nCount < MAX_BLOCKS_TO_ANNOUNCE) {
  4270.                  nodestate->nUnconnectingHeaders++;
  4271. +                //Yang Setting stop_hash according to the fork block hash  
  4272. +                uint256 stop_hash;
  4273. +                if (fCDYBootstrapping) {
  4274. +                    stop_hash = chainparams.GetConsensus().BitcoinPostforkBlock;
  4275. +                }
  4276. +                
  4277.                  connman.PushMessage(pfrom, msgMaker.Make(NetMsgType::GETHEADERS,
  4278.                                                           chainActive.GetLocator(
  4279.                                                               pindexBestHeader),
  4280. -                                                         uint256()));
  4281. +                                                         stop_hash));
  4282.                  LogPrint("net", "received header %s: missing prev block %s, "
  4283.                                  "sending getheaders (%d) to end (peer=%d, "
  4284.                                  "nUnconnectingHeaders=%d)\n",
  4285. @@ -2687,13 +2710,24 @@ static bool ProcessMessage(const Config &config, CNode *pfrom,
  4286.  
  4287.          CValidationState state;
  4288.          if (!ProcessNewBlockHeaders(config, headers, state, &pindexLast)) {
  4289. +            if (fCDYBootstrapping && pindexLast != nullptr) {
  4290. +                LogPrint("net", "though found invalid headers, continue with valid headers for CDY bootstrapping.\n");
  4291. +            }
  4292. +            else
  4293. +            {
  4294. +                
  4295.                int nDoS;
  4296. -            if (state.IsInvalid(nDoS)) {
  4297. -                if (nDoS > 0) {
  4298. +              if (state.IsInvalid(nDoS))
  4299. +              {
  4300. +                if (nDoS > 0)
  4301. +                {
  4302.                      LOCK(cs_main);
  4303.                      Misbehaving(pfrom, nDoS, state.GetRejectReason());
  4304.                  }
  4305. +                //if(chainActive.Height()>config.GetChainParams().GetConsensus().cdyHeight)
  4306.                  return error("invalid header received");
  4307. +                //else return true;
  4308. +              }
  4309.              }
  4310.          }
  4311.  
  4312. @@ -2720,10 +2754,15 @@ static bool ProcessMessage(const Config &config, CNode *pfrom,
  4313.                      "net",
  4314.                      "more getheaders (%d) to end to peer=%d (startheight:%d)\n",
  4315.                      pindexLast->nHeight, pfrom->id, pfrom->nStartingHeight);
  4316. +                uint256 stop_hash;
  4317. +                if (fCDYBootstrapping) {
  4318. +                    stop_hash = chainparams.GetConsensus().BitcoinPostforkBlock;
  4319. +                }
  4320. +                
  4321.                  connman.PushMessage(
  4322.                      pfrom, msgMaker.Make(NetMsgType::GETHEADERS,
  4323.                                           chainActive.GetLocator(pindexLast),
  4324. -                                         uint256()));
  4325. +                                         stop_hash));
  4326.              }
  4327.  
  4328.              bool fCanDirectFetch = CanDirectFetch(chainparams.GetConsensus());
  4329. @@ -2802,8 +2841,14 @@ static bool ProcessMessage(const Config &config, CNode *pfrom,
  4330.      else if (strCommand == NetMsgType::BLOCK && !fImporting &&
  4331.               !fReindex) // Ignore blocks received while importing
  4332.      {
  4333. +        // Deserialize in legacy format.
  4334. +        int legacy_block_flag = pfrom->IsLegacyBlockHeader(pfrom->GetRecvVersion()) ? SERIALIZE_BLOCK_LEGACY : 0;
  4335. +        int original_version = vRecv.GetVersion();
  4336. +        vRecv.SetVersion(original_version | legacy_block_flag);
  4337. +
  4338.          std::shared_ptr<CBlock> pblock = std::make_shared<CBlock>();
  4339.          vRecv >> *pblock;
  4340. +        vRecv.SetVersion(original_version);
  4341.  
  4342.          LogPrint("net", "received block %s peer=%d\n",
  4343.                   pblock->GetHash().ToString(), pfrom->id);
  4344. @@ -3127,10 +3172,19 @@ bool ProcessMessages(const Config &config, CNode *pfrom, CConnman &connman,
  4345.  
  4346.      msg.SetVersion(pfrom->GetRecvVersion());
  4347.  
  4348. +    // This is a new peer. Before doing anything, we need to detect what magic
  4349. +    // the peer is using.
  4350. +    if (pfrom->nVersion == 0) {
  4351. +        if (memcmp(std::begin(msg.hdr.pchMessageStart), std::begin(chainparams.NetMagic()), CMessageHeader::MESSAGE_START_SIZE) == 0) {
  4352. +            pfrom->fUsesCDYMagic = true;
  4353. +        } else if (fCDYBootstrapping) {
  4354. +            // Allow to connect to Bitcoin clients when bootstrapping.
  4355. +            pfrom->fUsesCDYMagic = false;
  4356. +        }
  4357. +    }
  4358. +
  4359.      // Scan for message start
  4360. -    if (memcmp(std::begin(msg.hdr.pchMessageStart),
  4361. -               std::begin(chainparams.NetMagic()),
  4362. -               CMessageHeader::MESSAGE_START_SIZE) != 0) {
  4363. +    if (memcmp(std::begin(msg.hdr.pchMessageStart), std::begin(pfrom->GetMagic(chainparams)), CMessageHeader::MESSAGE_START_SIZE) != 0) {
  4364.          LogPrintf("PROCESSMESSAGE: INVALID MESSAGESTART %s peer=%d\n",
  4365.                    SanitizeString(msg.hdr.GetCommand()), pfrom->id);
  4366.          pfrom->fDisconnect = true;
  4367. @@ -3139,7 +3193,7 @@ bool ProcessMessages(const Config &config, CNode *pfrom, CConnman &connman,
  4368.  
  4369.      // Read header
  4370.      CMessageHeader &hdr = msg.hdr;
  4371. -    if (!hdr.IsValid(chainparams.NetMagic())) {
  4372. +    if (!hdr.IsValid(pfrom->GetMagic(chainparams))) {
  4373.          LogPrintf("PROCESSMESSAGE: ERRORS IN HEADER %s peer=%d\n",
  4374.                    SanitizeString(hdr.GetCommand()), pfrom->id);
  4375.          return fMoreWork;
  4376. @@ -3355,10 +3409,9 @@ bool SendMessages(const Config &config, CNode *pto, CConnman &connman,
  4377.              LogPrint("net",
  4378.                       "initial getheaders (%d) to peer=%d (startheight:%d)\n",
  4379.                       pindexStart->nHeight, pto->id, pto->nStartingHeight);
  4380. -            connman.PushMessage(
  4381. -                pto,
  4382. -                msgMaker.Make(NetMsgType::GETHEADERS,
  4383. -                              chainActive.GetLocator(pindexStart), uint256()));
  4384. +            uint256 stop_hash;
  4385. +            if (fCDYBootstrapping) stop_hash = consensusParams.BitcoinPostforkBlock;
  4386. +            connman.PushMessage(pto, msgMaker.Make(NetMsgType::GETHEADERS, chainActive.GetLocator(pindexStart), stop_hash));
  4387.          }
  4388.      }
  4389.  
  4390. @@ -3485,8 +3538,10 @@ bool SendMessages(const Config &config, CNode *pto, CConnman &connman,
  4391.                               __func__, vHeaders.front().GetHash().ToString(),
  4392.                               pto->id);
  4393.                  }
  4394. -                connman.PushMessage(
  4395. -                    pto, msgMaker.Make(NetMsgType::HEADERS, vHeaders));
  4396. +                int legacy_block_flag = pto->IsLegacyBlockHeader(pto->GetSendVersion()) ? SERIALIZE_BLOCK_LEGACY : 0;
  4397. +                connman.PushMessage(pto, msgMaker.Make(legacy_block_flag, NetMsgType::HEADERS, vHeaders));
  4398. +                
  4399. +          
  4400.                  state.pindexBestHeaderSent = pBestIndex;
  4401.              } else {
  4402.                  fRevertToInv = true;
  4403. diff --git a/src/netbase.cpp b/src/netbase.cpp
  4404. index ef116a4..8867720 100644
  4405. --- a/src/netbase.cpp
  4406. +++ b/src/netbase.cpp
  4407. @@ -35,6 +35,8 @@ static proxyType nameProxy;
  4408.  static CCriticalSection cs_proxyInfos;
  4409.  int nConnectTimeout = DEFAULT_CONNECT_TIMEOUT;
  4410.  bool fNameLookup = DEFAULT_NAME_LOOKUP;
  4411. +bool fSkipHardforkIBD = false;
  4412. +bool fCDYBootstrapping = false;
  4413.  
  4414.  // Need ample time for negotiation for very slow proxies such as Tor
  4415.  // (milliseconds)
  4416. diff --git a/src/netbase.h b/src/netbase.h
  4417. index 762327b..fb11c98 100644
  4418. --- a/src/netbase.h
  4419. +++ b/src/netbase.h
  4420. @@ -19,6 +19,8 @@
  4421.  
  4422.  extern int nConnectTimeout;
  4423.  extern bool fNameLookup;
  4424. +extern bool fCDYBootstrapping;
  4425. +extern bool fSkipHardforkIBD;
  4426.  
  4427.  //! -timeout default
  4428.  static const int DEFAULT_CONNECT_TIMEOUT = 5000;
  4429. diff --git a/src/pow.cpp b/src/pow.cpp
  4430. index 8ddbc45..3d92792 100644
  4431. --- a/src/pow.cpp
  4432. +++ b/src/pow.cpp
  4433. @@ -11,11 +11,16 @@
  4434.  #include "chainparams.h"
  4435.  #include "config.h"
  4436.  #include "consensus/params.h"
  4437. +//#include "chainparams.h"
  4438. +#include "crypto/equihash.h"
  4439.  #include "primitives/block.h"
  4440. +#include "streams.h"
  4441.  #include "uint256.h"
  4442.  #include "util.h"
  4443.  #include "validation.h"
  4444.  
  4445. +unsigned int BitcoinGetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHeader *pblock, const Consensus::Params& params);
  4446. +
  4447.  /**
  4448.   * Compute the next required proof of work using the legacy Bitcoin difficulty
  4449.   * adjustment + Emergency Difficulty Adjustment (EDA).
  4450. @@ -34,12 +39,12 @@ static uint32_t GetNextEDAWorkRequired(const CBlockIndex *pindexPrev,
  4451.          const CBlockIndex *pindexFirst = pindexPrev->GetAncestor(nHeightFirst);
  4452.          assert(pindexFirst);
  4453.  
  4454. -        return CalculateNextWorkRequired(pindexPrev,
  4455. -                                         pindexFirst->GetBlockTime(), config);
  4456. +        return CalculateBCCNextWorkRequired(pindexPrev,
  4457. +                                         pindexFirst->GetBlockTime(), params);
  4458.      }
  4459.  
  4460.      const uint32_t nProofOfWorkLimit =
  4461. -        UintToArith256(params.powLimit).GetCompact();
  4462. +        UintToArith256(params.PowLimit(false)).GetCompact();
  4463.  
  4464.      if (params.fPowAllowMinDifficultyBlocks) {
  4465.          // Special difficulty rule for testnet:
  4466. @@ -95,75 +100,74 @@ static uint32_t GetNextEDAWorkRequired(const CBlockIndex *pindexPrev,
  4467.  uint32_t GetNextWorkRequired(const CBlockIndex *pindexPrev,
  4468.                               const CBlockHeader *pblock, const Config &config) {
  4469.      const Consensus::Params &params = config.GetChainParams().GetConsensus();
  4470. -
  4471. +    assert(pindexPrev != nullptr);
  4472. +    int nHeight = pindexPrev->nHeight + 1;
  4473. +    bool postfork = nHeight >= params.cdyHeight;
  4474. +    unsigned int nProofOfWorkLimit = UintToArith256(params.PowLimit(postfork)).GetCompact();
  4475.      // Genesis block
  4476.      if (pindexPrev == nullptr) {
  4477.          return UintToArith256(params.powLimit).GetCompact();
  4478.      }
  4479.      
  4480. -    // Special rule for regtest: we never retarget.
  4481. -    if (params.fPowNoRetargeting) {
  4482. -        return pindexPrev->nBits;
  4483. -    }
  4484. -
  4485. +    if (postfork == false) {
  4486. +       // LogPrintf("Before hard fork, get bitcoin NextWorkRequired.\n");
  4487.          if (IsDAAEnabled(config, pindexPrev)) {
  4488.              return GetNextCashWorkRequired(pindexPrev, pblock, config);
  4489.          }
  4490. -
  4491. +        else if (IsUAHFenabled(config, pindexPrev))
  4492.              return GetNextEDAWorkRequired(pindexPrev, pblock, config);
  4493. +        else
  4494. +            return BitcoinGetNextWorkRequired(pindexPrev, pblock, params);
  4495. +    }
  4496. +    else if (nHeight< params.cdyHeight + params.nPowAveragingWindow)  //Yang our fork start with small pow
  4497. +    {
  4498. +        return nProofOfWorkLimit;
  4499.      }
  4500.      
  4501. -uint32_t CalculateNextWorkRequired(const CBlockIndex *pindexPrev,
  4502. -                                   int64_t nFirstBlockTime,
  4503. -                                   const Config &config) {
  4504. -    const Consensus::Params &params = config.GetChainParams().GetConsensus();
  4505. -
  4506. +    // Special rule for regtest: we never retarget.
  4507.      if (params.fPowNoRetargeting) {
  4508.          return pindexPrev->nBits;
  4509.      }
  4510.  
  4511. -    // Limit adjustment step
  4512. -    int64_t nActualTimespan = pindexPrev->GetBlockTime() - nFirstBlockTime;
  4513. -    if (nActualTimespan < params.nPowTargetTimespan / 4) {
  4514. -        nActualTimespan = params.nPowTargetTimespan / 4;
  4515. +    const CBlockIndex* pindexFirst = pindexPrev;
  4516. +    arith_uint256 bnTot {0};
  4517. +    for (int i = 0; pindexFirst && i < params.nPowAveragingWindow; i++) {
  4518. +        arith_uint256 bnTmp;
  4519. +        bnTmp.SetCompact(pindexFirst->nBits);
  4520. +        bnTot += bnTmp;
  4521. +        pindexFirst = pindexFirst->pprev;
  4522.      }
  4523.  
  4524. -    if (nActualTimespan > params.nPowTargetTimespan * 4) {
  4525. -        nActualTimespan = params.nPowTargetTimespan * 4;
  4526. -    }
  4527. +    if (pindexFirst == NULL)
  4528. +        return nProofOfWorkLimit;
  4529.  
  4530. -    // Retarget
  4531. -    const arith_uint256 bnPowLimit = UintToArith256(params.powLimit);
  4532. -    arith_uint256 bnNew;
  4533. -    bnNew.SetCompact(pindexPrev->nBits);
  4534. -    bnNew *= nActualTimespan;
  4535. -    bnNew /= params.nPowTargetTimespan;
  4536. +    arith_uint256 bnAvg {bnTot / params.nPowAveragingWindow};
  4537.  
  4538. -    if (bnNew > bnPowLimit) bnNew = bnPowLimit;
  4539.  
  4540. -    return bnNew.GetCompact();
  4541. +    return CalculateNextWorkRequired(bnAvg, pindexPrev->GetMedianTimePast(), pindexFirst->GetMedianTimePast(), params);
  4542.  }
  4543.  
  4544. -bool CheckProofOfWork(uint256 hash, uint32_t nBits, const Config &config) {
  4545. -    bool fNegative;
  4546. -    bool fOverflow;
  4547. -    arith_uint256 bnTarget;
  4548. +unsigned int CalculateNextWorkRequired(arith_uint256 bnAvg, int64_t nLastBlockTime, int64_t nFirstBlockTime, const Consensus::Params& params)
  4549. +{
  4550.  
  4551. -    bnTarget.SetCompact(nBits, &fNegative, &fOverflow);
  4552. +    // Limit adjustment
  4553. +    int64_t nActualTimespan = nLastBlockTime - nFirstBlockTime;
  4554.  
  4555. -    // Check range
  4556. -    if (fNegative || bnTarget == 0 || fOverflow ||
  4557. -        bnTarget >
  4558. -            UintToArith256(config.GetChainParams().GetConsensus().powLimit)) {
  4559. -        return false;
  4560. -    }
  4561. +    if (nActualTimespan < params.MinActualTimespan())
  4562. +        nActualTimespan = params.MinActualTimespan();
  4563. +    if (nActualTimespan > params.MaxActualTimespan())
  4564. +        nActualTimespan = params.MaxActualTimespan();
  4565.  
  4566. -    // Check proof of work matches claimed amount
  4567. -    if (UintToArith256(hash) > bnTarget) {
  4568. -        return false;
  4569. -    }
  4570. +    // Retarget
  4571. +    const arith_uint256 bnPowLimit = UintToArith256(params.PowLimit(true));
  4572. +    arith_uint256 bnNew {bnAvg};
  4573. +    bnNew /= params.AveragingWindowTimespan();
  4574. +    bnNew *= nActualTimespan;
  4575.  
  4576. -    return true;
  4577. +    if (bnNew > bnPowLimit)
  4578. +        bnNew = bnPowLimit;
  4579. +
  4580. +    return bnNew.GetCompact();
  4581.  }
  4582.  
  4583.  /**
  4584. @@ -288,3 +292,140 @@ uint32_t GetNextCashWorkRequired(const CBlockIndex *pindexPrev,
  4585.  
  4586.      return nextTarget.GetCompact();
  4587.  }
  4588. +
  4589. +// Depricated for Bitcoin Cash X
  4590. +unsigned int CalculateBCCNextWorkRequired(const CBlockIndex* pindexLast, int64_t nFirstBlockTime, const Consensus::Params& params)
  4591. +{
  4592. +    if (params.fPowNoRetargeting)
  4593. +        return pindexLast->nBits;
  4594. +
  4595. +    
  4596. +    // Limit adjustment step
  4597. +    int64_t nActualTimespan = pindexLast->GetBlockTime() - nFirstBlockTime;
  4598. +    if (nActualTimespan < params.nPowTargetTimespanLegacy / 4) {
  4599. +        nActualTimespan = params.nPowTargetTimespanLegacy / 4;
  4600. +    }
  4601. +
  4602. +    if (nActualTimespan > params.nPowTargetTimespanLegacy * 4) {
  4603. +        nActualTimespan = params.nPowTargetTimespanLegacy * 4;
  4604. +    }
  4605. +
  4606. +    // Retarget
  4607. +    const arith_uint256 bnPowLimit = UintToArith256(params.powLimitLegacy);
  4608. +    arith_uint256 bnNew;
  4609. +    bnNew.SetCompact(pindexLast->nBits);
  4610. +    bnNew *= nActualTimespan;
  4611. +    bnNew /= params.nPowTargetTimespanLegacy;
  4612. +
  4613. +    if (bnNew > bnPowLimit) bnNew = bnPowLimit;
  4614. +    return bnNew.GetCompact();
  4615. +}
  4616. +
  4617. +bool CheckEquihashSolution(const CBlockHeader *pblock, const CChainParams& params)
  4618. +{
  4619. +    unsigned int n = params.EquihashN();
  4620. +    unsigned int k = params.EquihashK();
  4621. +
  4622. +    // Hash state
  4623. +    crypto_generichash_blake2b_state state;
  4624. +    EhInitialiseState(n, k, state);
  4625. +
  4626. +    // I = the block header minus nonce and solution.
  4627. +    CEquihashInput I{*pblock};
  4628. +    // I||V
  4629. +    CDataStream ss(SER_NETWORK, PROTOCOL_VERSION);
  4630. +    ss << I;
  4631. +    ss << pblock->nNonce;
  4632. +
  4633. +    // H(I||V||...
  4634. +    crypto_generichash_blake2b_update(&state, (unsigned char*)&ss[0], ss.size());
  4635. +
  4636. +    bool isValid;
  4637. +    EhIsValidSolution(n, k, state, pblock->nSolution, isValid);
  4638. +    if (!isValid)
  4639. +        return error("CheckEquihashSolution(): invalid solution");
  4640. +
  4641. +    return true;
  4642. +}
  4643. +
  4644. +bool CheckProofOfWork(uint256 hash, uint32_t nBits, bool postfork, const Config &config) {
  4645. +    const Consensus::Params &params = config.GetChainParams().GetConsensus();
  4646. +    bool fNegative;
  4647. +    bool fOverflow;
  4648. +    arith_uint256 bnTarget;
  4649. +    
  4650. +    bnTarget.SetCompact(nBits, &fNegative, &fOverflow);
  4651. +    // if (postfork) printf("Params hash  :%s\n", hash.GetHex().c_str());
  4652. +    // Check range
  4653. +    if (fNegative || bnTarget == 0 || fOverflow || bnTarget > UintToArith256(params.PowLimit(postfork)))
  4654. +        return false;
  4655. +
  4656. +    // Check proof of work matches claimed amount
  4657. +    if (UintToArith256(hash) > bnTarget)
  4658. +        return false;
  4659. +
  4660. +    return true;
  4661. +}
  4662. +
  4663. +// Depricated for Bitcoin CDY
  4664. +unsigned int BitcoinCalculateNextWorkRequired(const CBlockIndex* pindexLast, int64_t nFirstBlockTime, const Consensus::Params& params)
  4665. +{
  4666. +    if (params.fPowNoRetargeting)
  4667. +        return pindexLast->nBits;
  4668. +
  4669. +    // Limit adjustment step
  4670. +    int64_t nActualTimespan = pindexLast->GetBlockTime() - nFirstBlockTime;
  4671. +    if (nActualTimespan < params.nPowTargetTimespanLegacy/4)
  4672. +        nActualTimespan = params.nPowTargetTimespanLegacy/4;
  4673. +    if (nActualTimespan > params.nPowTargetTimespanLegacy*4)
  4674. +        nActualTimespan = params.nPowTargetTimespanLegacy*4;
  4675. +
  4676. +    // Retarget
  4677. +    const arith_uint256 bnPowLimit = UintToArith256(params.PowLimit(false));
  4678. +    arith_uint256 bnNew;
  4679. +    bnNew.SetCompact(pindexLast->nBits);
  4680. +    bnNew *= nActualTimespan;
  4681. +    bnNew /= params.nPowTargetTimespanLegacy;
  4682. +
  4683. +    if (bnNew > bnPowLimit)
  4684. +        bnNew = bnPowLimit;
  4685. +
  4686. +    return bnNew.GetCompact();
  4687. +}
  4688. +
  4689. +// Deprecated for Bitcoin CDY
  4690. +unsigned int BitcoinGetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHeader *pblock, const Consensus::Params& params)
  4691. +{
  4692. +    assert(pindexLast != nullptr);
  4693. +    unsigned int nProofOfWorkLimit = UintToArith256(params.PowLimit(false)).GetCompact();
  4694. +
  4695. +    // Only change once per difficulty adjustment interval
  4696. +    if ((pindexLast->nHeight+1) % params.DifficultyAdjustmentInterval() != 0)
  4697. +    {
  4698. +        if (params.fPowAllowMinDifficultyBlocks)
  4699. +        {
  4700. +            // Special difficulty rule for testnet:
  4701. +            // If the new block's timestamp is more than 2* 10 minutes
  4702. +            // then allow mining of a min-difficulty block.
  4703. +            if (pblock->GetBlockTime() > pindexLast->GetBlockTime() + params.nPowTargetSpacing*2)
  4704. +                return nProofOfWorkLimit;
  4705. +            else
  4706. +            {
  4707. +                // Return the last non-special-min-difficulty-rules-block
  4708. +                const CBlockIndex* pindex = pindexLast;
  4709. +                while (pindex->pprev && pindex->nHeight % params.DifficultyAdjustmentInterval() != 0 && pindex->nBits == nProofOfWorkLimit)
  4710. +                    pindex = pindex->pprev;
  4711. +                return pindex->nBits;
  4712. +            }
  4713. +        }
  4714. +        return pindexLast->nBits;
  4715. +    }
  4716. +
  4717. +    // Go back by what we want to be 14 days worth of blocks
  4718. +    int nHeightFirst = pindexLast->nHeight - (params.DifficultyAdjustmentInterval()-1);
  4719. +    assert(nHeightFirst >= 0);
  4720. +    const CBlockIndex* pindexFirst = pindexLast->GetAncestor(nHeightFirst);
  4721. +    assert(pindexFirst);
  4722. +
  4723. +    return BitcoinCalculateNextWorkRequired(pindexLast, pindexFirst->GetBlockTime(), params);
  4724. +}
  4725. diff --git a/src/pow.h b/src/pow.h
  4726. index d7a7cab..9ac72cf 100644
  4727. --- a/src/pow.h
  4728. +++ b/src/pow.h
  4729. @@ -5,6 +5,8 @@
  4730.  
  4731.  #ifndef BITCOIN_POW_H
  4732.  #define BITCOIN_POW_H
  4733. +#include "arith_uint256.h"
  4734. +#include "consensus/params.h"
  4735.  
  4736.  #include <cstdint>
  4737.  
  4738. @@ -12,18 +14,22 @@ class CBlockHeader;
  4739.  class CBlockIndex;
  4740.  class Config;
  4741.  class uint256;
  4742. +class CChainParams;
  4743.  
  4744.  uint32_t GetNextWorkRequired(const CBlockIndex *pindexPrev,
  4745.                               const CBlockHeader *pblock, const Config &config);
  4746. -uint32_t CalculateNextWorkRequired(const CBlockIndex *pindexPrev,
  4747. -                                   int64_t nFirstBlockTime,
  4748. -                                   const Config &config);
  4749. +unsigned int CalculateNextWorkRequired(arith_uint256 bnAvg, int64_t nLastBlockTime, int64_t nFirstBlockTime, const Consensus::Params& params);
  4750. +
  4751. +/** Check whether the Equihash solution in a block header is valid */
  4752. +bool CheckEquihashSolution(const CBlockHeader *pblock, const CChainParams&);
  4753. +
  4754. +unsigned int CalculateBCCNextWorkRequired(const CBlockIndex* pindexLast, int64_t nFirstBlockTime, const Consensus::Params& params);
  4755.  
  4756.  /**
  4757.   * Check whether a block hash satisfies the proof-of-work requirement specified
  4758.   * by nBits
  4759.   */
  4760. -bool CheckProofOfWork(uint256 hash, uint32_t nBits, const Config &config);
  4761. +bool CheckProofOfWork(uint256 hash, uint32_t nBits, bool postfork, const Config &config);
  4762.  
  4763.  /**
  4764.   * Bitcoin cash's difficulty adjustment mechanism.
  4765. diff --git a/src/primitives/block.cpp b/src/primitives/block.cpp
  4766. index 7a3b249..2fe7270 100644
  4767. --- a/src/primitives/block.cpp
  4768. +++ b/src/primitives/block.cpp
  4769. @@ -5,22 +5,39 @@
  4770.  
  4771.  #include "primitives/block.h"
  4772.  
  4773. +#include "chainparams.h"
  4774. +#include "consensus/params.h"
  4775.  #include "crypto/common.h"
  4776.  #include "hash.h"
  4777.  #include "tinyformat.h"
  4778.  #include "utilstrencodings.h"
  4779.  
  4780. +uint256 CBlockHeader::GetHash(const Consensus::Params& params) const
  4781. +{
  4782. +    int version;
  4783. +    if (nHeight >= (uint32_t)params.cdyHeight) {
  4784. +        version = PROTOCOL_VERSION;
  4785. +    } else {
  4786. +        version = PROTOCOL_VERSION | SERIALIZE_BLOCK_LEGACY;
  4787. +    }
  4788. +    CHashWriter writer(SER_GETHASH, version);
  4789. +    ::Serialize(writer, *this);
  4790. +    return writer.GetHash();
  4791. +}
  4792.  uint256 CBlockHeader::GetHash() const {
  4793. -    return SerializeHash(*this);
  4794. +    const Consensus::Params& consensusParams = Params().GetConsensus();
  4795. +    return GetHash(consensusParams);
  4796.  }
  4797.  
  4798.  std::string CBlock::ToString() const {
  4799.      std::stringstream s;
  4800. -    s << strprintf("CBlock(hash=%s, ver=0x%08x, hashPrevBlock=%s, "
  4801. -                   "hashMerkleRoot=%s, nTime=%u, nBits=%08x, nNonce=%u, "
  4802. -                   "vtx=%u)\n",
  4803. -                   GetHash().ToString(), nVersion, hashPrevBlock.ToString(),
  4804. -                   hashMerkleRoot.ToString(), nTime, nBits, nNonce, vtx.size());
  4805. +    s << strprintf("CBlock(hash=%s, ver=0x%08x, hashPrevBlock=%s, hashMerkleRoot=%s, nHeight=%u, nTime=%u, nBits=%08x, nNonce=%s, vtx=%u)\n",
  4806. +        GetHash().ToString(),
  4807. +        nVersion,
  4808. +        hashPrevBlock.ToString(),
  4809. +        hashMerkleRoot.ToString(),
  4810. +        nHeight, nTime, nBits, nNonce.GetHex(),
  4811. +        vtx.size());
  4812.      for (unsigned int i = 0; i < vtx.size(); i++) {
  4813.          s << "  " << vtx[i]->ToString() << "\n";
  4814.      }
  4815. diff --git a/src/primitives/block.h b/src/primitives/block.h
  4816. index c594a97..ea44e47 100644
  4817. --- a/src/primitives/block.h
  4818. +++ b/src/primitives/block.h
  4819. @@ -6,9 +6,18 @@
  4820.  #ifndef BITCOIN_PRIMITIVES_BLOCK_H
  4821.  #define BITCOIN_PRIMITIVES_BLOCK_H
  4822.  
  4823. +#include "arith_uint256.h"
  4824.  #include "primitives/transaction.h"
  4825.  #include "serialize.h"
  4826.  #include "uint256.h"
  4827. +#include "version.h"
  4828. +#include <string.h>
  4829. +
  4830. +namespace Consensus {
  4831. +    struct Params;
  4832. +};
  4833. +
  4834. +static const int SERIALIZE_BLOCK_LEGACY = 0x04000000;
  4835.  
  4836.  /**
  4837.   * Nodes collect new transactions into a block, hash them into a hash tree, and
  4838. @@ -21,12 +30,16 @@
  4839.  class CBlockHeader {
  4840.  public:
  4841.      // header
  4842. +    static const size_t HEADER_SIZE = 4+32+32+4+4+4;  // Excluding Equihash solution
  4843.      int32_t nVersion;
  4844.      uint256 hashPrevBlock;
  4845.      uint256 hashMerkleRoot;
  4846. +    uint32_t nHeight;
  4847. +    uint32_t nReserved[7];
  4848.      uint32_t nTime;
  4849.      uint32_t nBits;
  4850. -    uint32_t nNonce;
  4851. +    uint256 nNonce;
  4852. +    std::vector<unsigned char> nSolution;  // Equihash solution.
  4853.  
  4854.      CBlockHeader() { SetNull(); }
  4855.  
  4856. @@ -34,26 +47,44 @@ public:
  4857.  
  4858.      template <typename Stream, typename Operation>
  4859.      inline void SerializationOp(Stream &s, Operation ser_action) {
  4860. +        bool new_format = !(s.GetVersion() & SERIALIZE_BLOCK_LEGACY);
  4861.          READWRITE(this->nVersion);
  4862.          READWRITE(hashPrevBlock);
  4863.          READWRITE(hashMerkleRoot);
  4864. +        if (new_format) {
  4865. +            READWRITE(nHeight);
  4866. +            for(size_t i = 0; i < (sizeof(nReserved) / sizeof(nReserved[0])); i++) {
  4867. +                READWRITE(nReserved[i]);
  4868. +            }
  4869. +        }
  4870.          READWRITE(nTime);
  4871.          READWRITE(nBits);
  4872. +        if (new_format) {
  4873.              READWRITE(nNonce);
  4874. +            READWRITE(nSolution);
  4875. +        } else {
  4876. +            uint32_t legacy_nonce = (uint32_t)nNonce.GetUint64(0);
  4877. +            READWRITE(legacy_nonce);
  4878. +            nNonce = ArithToUint256(arith_uint256(legacy_nonce));
  4879. +        }
  4880.      }
  4881.  
  4882.      void SetNull() {
  4883.          nVersion = 0;
  4884.          hashPrevBlock.SetNull();
  4885.          hashMerkleRoot.SetNull();
  4886. +        nHeight = 0;
  4887. +        memset(nReserved, 0, sizeof(nReserved));
  4888.          nTime = 0;
  4889.          nBits = 0;
  4890. -        nNonce = 0;
  4891. +        nNonce.SetNull();
  4892. +        nSolution.clear();
  4893.      }
  4894.  
  4895.      bool IsNull() const { return (nBits == 0); }
  4896.  
  4897.      uint256 GetHash() const;
  4898. +    uint256 GetHash(const Consensus::Params& params) const;
  4899.  
  4900.      int64_t GetBlockTime() const { return (int64_t)nTime; }
  4901.  };
  4902. @@ -92,14 +123,45 @@ public:
  4903.          block.nVersion = nVersion;
  4904.          block.hashPrevBlock = hashPrevBlock;
  4905.          block.hashMerkleRoot = hashMerkleRoot;
  4906. +        block.nHeight        = nHeight;
  4907. +        memcpy(block.nReserved, nReserved, sizeof(block.nReserved));
  4908.          block.nTime = nTime;
  4909.          block.nBits = nBits;
  4910.          block.nNonce = nNonce;
  4911. +        block.nSolution      = nSolution;
  4912.          return block;
  4913.      }
  4914.  
  4915.      std::string ToString() const;
  4916.  };
  4917. +/**
  4918. + * Custom serializer for CBlockHeader that omits the nonce and solution, for use
  4919. + * as input to Equihash.
  4920. + */
  4921. +class CEquihashInput : private CBlockHeader
  4922. +{
  4923. +public:
  4924. +    CEquihashInput(const CBlockHeader &header)
  4925. +    {
  4926. +        CBlockHeader::SetNull();
  4927. +        *((CBlockHeader*)this) = header;
  4928. +    }
  4929. +
  4930. +    ADD_SERIALIZE_METHODS;
  4931. +
  4932. +    template <typename Stream, typename Operation>
  4933. +    inline void SerializationOp(Stream& s, Operation ser_action) {
  4934. +        READWRITE(this->nVersion);
  4935. +        READWRITE(hashPrevBlock);
  4936. +        READWRITE(hashMerkleRoot);
  4937. +        READWRITE(nHeight);
  4938. +        for(size_t i = 0; i < (sizeof(nReserved) / sizeof(nReserved[0])); i++) {
  4939. +            READWRITE(nReserved[i]);
  4940. +        }
  4941. +        READWRITE(nTime);
  4942. +        READWRITE(nBits);
  4943. +    }
  4944. +};
  4945.  
  4946.  /**
  4947.   * Describes a place in the block chain to another node such that if the other
  4948. diff --git a/src/primitives/transaction.cpp b/src/primitives/transaction.cpp
  4949. index 9c23f89..e599b3c 100644
  4950. --- a/src/primitives/transaction.cpp
  4951. +++ b/src/primitives/transaction.cpp
  4952. @@ -48,9 +48,9 @@ CTxOut::CTxOut(const Amount &nValueIn, CScript scriptPubKeyIn) {
  4953.  }
  4954.  
  4955.  std::string CTxOut::ToString() const {
  4956. -    return strprintf("CTxOut(nValue=%d.%08d, scriptPubKey=%s)",
  4957. -                     nValue.GetSatoshis() / COIN.GetSatoshis(),
  4958. -                     nValue.GetSatoshis() % COIN.GetSatoshis(),
  4959. +    return strprintf("CTxOut(nValue=%d.%05d, scriptPubKey=%s)",
  4960. +                     nValue.GetSatoshis() / (COIN.GetSatoshis() / COIN_MULTIPLE),
  4961. +                     nValue.GetSatoshis() % (COIN.GetSatoshis() / COIN_MULTIPLE),
  4962.                       HexStr(scriptPubKey).substr(0, 30));
  4963.  }
  4964.  
  4965. diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp
  4966. index 86173c9..69d70fa 100644
  4967. --- a/src/rpc/blockchain.cpp
  4968. +++ b/src/rpc/blockchain.cpp
  4969. @@ -12,6 +12,7 @@
  4970.  #include "coins.h"
  4971.  #include "config.h"
  4972.  #include "consensus/validation.h"
  4973. +#include "consensus/params.h"
  4974.  #include "hash.h"
  4975.  #include "policy/policy.h"
  4976.  #include "primitives/transaction.h"
  4977. @@ -56,13 +57,49 @@ static double GetDifficultyFromBits(uint32_t nBits) {
  4978.      return dDiff;
  4979.  }
  4980.  
  4981. +double GetDifficultyINTERNAL(const CBlockIndex* blockindex)
  4982. +{
  4983. +    // Floating point number that is a multiple of the minimum difficulty,
  4984. +    // minimum difficulty = 1.0.
  4985. +
  4986. +    uint32_t bits = blockindex->nBits;
  4987. +
  4988. +    uint32_t powLimit =
  4989. +        UintToArith256(Params().GetConsensus().powLimit).GetCompact();
  4990. +    int nShift = (bits >> 24) & 0xff;
  4991. +    int nShiftAmount = (powLimit >> 24) & 0xff;
  4992. +
  4993. +    double dDiff =
  4994. +        (double)(powLimit & 0x00ffffff) /
  4995. +        (double)(bits & 0x00ffffff);
  4996. +
  4997. +    while (nShift < nShiftAmount)
  4998. +    {
  4999. +        dDiff *= 256.0;
  5000. +        nShift++;
  5001. +    }
  5002. +    while (nShift > nShiftAmount)
  5003. +    {
  5004. +        dDiff /= 256.0;
  5005. +        nShift--;
  5006. +    }
  5007. +
  5008. +    return dDiff;
  5009. +}
  5010. +
  5011.  double GetDifficulty(const CBlockIndex *blockindex) {
  5012.      // Floating point number that is a multiple of the minimum difficulty,
  5013.      // minimum difficulty = 1.0.
  5014.      if (blockindex == nullptr) {
  5015. +        if (chainActive.Tip() == nullptr)
  5016.              return 1.0;
  5017. +        else
  5018. +            blockindex = chainActive.Tip();
  5019.      }
  5020.  
  5021. +    if (blockindex->nHeight >= Params().GetConsensus().cdyHeight) {
  5022. +        return GetDifficultyINTERNAL(blockindex);
  5023. +    }
  5024.      return GetDifficultyFromBits(blockindex->nBits);
  5025.  }
  5026.  
  5027. @@ -83,7 +120,9 @@ UniValue blockheaderToJSON(const CBlockIndex *blockindex) {
  5028.      result.push_back(Pair("time", int64_t(blockindex->nTime)));
  5029.      result.push_back(
  5030.          Pair("mediantime", int64_t(blockindex->GetMedianTimePast())));
  5031. -    result.push_back(Pair("nonce", uint64_t(blockindex->nNonce)));
  5032. +    result.push_back(Pair("nonceUint32", (uint64_t)((uint32_t)blockindex->nNonce.GetUint64(0))));
  5033. +    result.push_back(Pair("nonce", blockindex->nNonce.GetHex()));
  5034. +    result.push_back(Pair("solution", HexStr(blockindex->nSolution)));
  5035.      result.push_back(Pair("bits", strprintf("%08x", blockindex->nBits)));
  5036.      result.push_back(Pair("difficulty", GetDifficulty(blockindex)));
  5037.      result.push_back(Pair("chainwork", blockindex->nChainWork.GetHex()));
  5038. @@ -109,8 +148,9 @@ UniValue blockToJSON(const Config &config, const CBlock &block,
  5039.          confirmations = chainActive.Height() - blockindex->nHeight + 1;
  5040.      }
  5041.      result.push_back(Pair("confirmations", confirmations));
  5042. -    result.push_back(Pair(
  5043. -        "size", (int)::GetSerializeSize(block, SER_NETWORK, PROTOCOL_VERSION)));
  5044. +    const Consensus::Params& consensusParams = config.GetChainParams().GetConsensus();
  5045. +    int ser_flags = (blockindex->nHeight < consensusParams.cdyHeight) ? SERIALIZE_BLOCK_LEGACY : 0;
  5046. +    result.push_back(Pair("size", (int)::GetSerializeSize(block, SER_NETWORK, PROTOCOL_VERSION | ser_flags)));
  5047.      result.push_back(Pair("height", blockindex->nHeight));
  5048.      result.push_back(Pair("version", block.nVersion));
  5049.      result.push_back(Pair("versionHex", strprintf("%08x", block.nVersion)));
  5050. @@ -127,9 +167,9 @@ UniValue blockToJSON(const Config &config, const CBlock &block,
  5051.      }
  5052.      result.push_back(Pair("tx", txs));
  5053.      result.push_back(Pair("time", block.GetBlockTime()));
  5054. -    result.push_back(
  5055. -        Pair("mediantime", int64_t(blockindex->GetMedianTimePast())));
  5056. -    result.push_back(Pair("nonce", uint64_t(block.nNonce)));
  5057. +    result.push_back(Pair("mediantime", (int64_t)blockindex->GetMedianTimePast()));
  5058. +    result.push_back(Pair("nonceUint32", (uint64_t)((uint32_t)block.nNonce.GetUint64(0))));
  5059. +    result.push_back(Pair("nonce", block.nNonce.GetHex()));
  5060.      result.push_back(Pair("bits", strprintf("%08x", block.nBits)));
  5061.      result.push_back(Pair("difficulty", GetDifficulty(blockindex)));
  5062.      result.push_back(Pair("chainwork", blockindex->nChainWork.GetHex()));
  5063. @@ -691,8 +731,8 @@ UniValue getblockheader(const Config &config, const JSONRPCRequest &request) {
  5064.              "blockheader <hash>.\n"
  5065.              "\nArguments:\n"
  5066.              "1. \"hash\"          (string, required) The block hash\n"
  5067. -            "2. verbose           (boolean, optional, default=true) true for a "
  5068. -            "json object, false for the hex encoded data\n"
  5069. +            "2. \"verbose\"       (boolean, optional, default=true) true for a json object, false for the hex encoded data\n"
  5070. +            "3. \"legacy\"        (boolean, optional, default=false) indicates if the block should be in legacy format\n"
  5071.              "\nResult (for verbose = true):\n"
  5072.              "{\n"
  5073.              "  \"hash\" : \"hash\",     (string) the block hash (same as "
  5074. @@ -736,8 +776,12 @@ UniValue getblockheader(const Config &config, const JSONRPCRequest &request) {
  5075.      uint256 hash(uint256S(strHash));
  5076.  
  5077.      bool fVerbose = true;
  5078. -    if (request.params.size() > 1) {
  5079. +    if (!request.params[1].isNull())
  5080.          fVerbose = request.params[1].get_bool();
  5081. +
  5082. +    bool legacy_format = false;
  5083. +    if (request.params.size() == 3 && request.params[2].get_bool() == true) {
  5084. +        legacy_format = true;
  5085.      }
  5086.  
  5087.      if (mapBlockIndex.count(hash) == 0) {
  5088. @@ -747,7 +791,8 @@ UniValue getblockheader(const Config &config, const JSONRPCRequest &request) {
  5089.      CBlockIndex *pblockindex = mapBlockIndex[hash];
  5090.  
  5091.      if (!fVerbose) {
  5092. -        CDataStream ssBlock(SER_NETWORK, PROTOCOL_VERSION);
  5093. +        int ser_flags = legacy_format ? SERIALIZE_BLOCK_LEGACY : 0;
  5094. +        CDataStream ssBlock(SER_NETWORK, PROTOCOL_VERSION | ser_flags);
  5095.          ssBlock << pblockindex->GetBlockHeader();
  5096.          std::string strHex = HexStr(ssBlock.begin(), ssBlock.end());
  5097.          return strHex;
  5098. @@ -758,18 +803,20 @@ UniValue getblockheader(const Config &config, const JSONRPCRequest &request) {
  5099.  
  5100.  UniValue getblock(const Config &config, const JSONRPCRequest &request) {
  5101.      if (request.fHelp || request.params.size() < 1 ||
  5102. -        request.params.size() > 2) {
  5103. +        request.params.size() > 3) {
  5104.          throw std::runtime_error(
  5105. -            "getblock \"blockhash\" ( verbose )\n"
  5106. +            "getblock \"blockhash\" ( verbose legacy )\n"
  5107.              "\nIf verbose is false, returns a string that is serialized, "
  5108.              "hex-encoded data for block 'hash'.\n"
  5109.              "If verbose is true, returns an Object with information about "
  5110.              "block <hash>.\n"
  5111.              "\nArguments:\n"
  5112.              "1. \"blockhash\"          (string, required) The block hash\n"
  5113. -            "2. verbose                (boolean, optional, default=true) true "
  5114. -            "for a json object, false for the hex encoded data\n"
  5115. -            "\nResult (for verbose = true):\n"
  5116. +            "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"
  5117. +            "3. \"legacy\"             (boolean, optional, default=false) indicates if the block should be in legacy format\n"
  5118. +            "\nResult (for verbosity = 0):\n"
  5119. +            "\"data\"             (string) A string that is serialized, hex-encoded data for block 'hash'.\n"
  5120. +            "\nResult (for verbosity = 1):\n"
  5121.              "{\n"
  5122.              "  \"hash\" : \"hash\",     (string) the block hash (same as "
  5123.              "provided)\n"
  5124. @@ -814,22 +861,26 @@ UniValue getblock(const Config &config, const JSONRPCRequest &request) {
  5125.      std::string strHash = request.params[0].get_str();
  5126.      uint256 hash(uint256S(strHash));
  5127.  
  5128. -    bool fVerbose = true;
  5129. -    if (request.params.size() > 1) {
  5130. -        fVerbose = request.params[1].get_bool();
  5131. +    int verbosity = 1;
  5132. +    if (!request.params[1].isNull()) {
  5133. +        if(request.params[1].isNum())
  5134. +            verbosity = request.params[1].get_int();
  5135. +        else
  5136. +            verbosity = request.params[1].get_bool() ? 1 : 0;
  5137. +    }
  5138. +    bool legacy_format = false;
  5139. +    if (request.params.size() == 3 && request.params[2].get_bool() == true) {
  5140. +        legacy_format = true;
  5141.      }
  5142.  
  5143. -    if (mapBlockIndex.count(hash) == 0) {
  5144. +    if (mapBlockIndex.count(hash) == 0)
  5145.          throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Block not found");
  5146. -    }
  5147.  
  5148.      CBlock block;
  5149.      CBlockIndex *pblockindex = mapBlockIndex[hash];
  5150.  
  5151. -    if (fHavePruned && !(pblockindex->nStatus & BLOCK_HAVE_DATA) &&
  5152. -        pblockindex->nTx > 0) {
  5153. +    if (fHavePruned && !(pblockindex->nStatus & BLOCK_HAVE_DATA) && pblockindex->nTx > 0)
  5154.          throw JSONRPCError(RPC_MISC_ERROR, "Block not available (pruned data)");
  5155. -    }
  5156.  
  5157.      if (!ReadBlockFromDisk(block, pblockindex, config)) {
  5158.          // Block not found on disk. This could be because we have the block
  5159. @@ -839,15 +890,15 @@ UniValue getblock(const Config &config, const JSONRPCRequest &request) {
  5160.          throw JSONRPCError(RPC_MISC_ERROR, "Block not found on disk");
  5161.      }
  5162.  
  5163. -    if (!fVerbose) {
  5164. -        CDataStream ssBlock(SER_NETWORK,
  5165. -                            PROTOCOL_VERSION | RPCSerializationFlags());
  5166. +    if (verbosity <= 0) {
  5167. +        int ser_flags = legacy_format ? SERIALIZE_BLOCK_LEGACY : 0;
  5168. +        CDataStream ssBlock(SER_NETWORK, PROTOCOL_VERSION | ser_flags | RPCSerializationFlags());
  5169.          ssBlock << block;
  5170.          std::string strHex = HexStr(ssBlock.begin(), ssBlock.end());
  5171.          return strHex;
  5172.      }
  5173.  
  5174. -    return blockToJSON(config, block, pblockindex);
  5175. +    return blockToJSON(config, block, pblockindex, verbosity >= 2);
  5176.  }
  5177.  
  5178.  struct CCoinsStats {
  5179. @@ -1629,9 +1680,9 @@ static const CRPCCommand commands[] = {
  5180.      { "blockchain",         "getblockchaininfo",      getblockchaininfo,      true,  {} },
  5181.      { "blockchain",         "getbestblockhash",       getbestblockhash,       true,  {} },
  5182.      { "blockchain",         "getblockcount",          getblockcount,          true,  {} },
  5183. -    { "blockchain",         "getblock",               getblock,               true,  {"blockhash","verbose"} },
  5184. +    { "blockchain",         "getblock",               getblock,               true,  {"blockhash","verbosity|verbose","legacy"} },
  5185.      { "blockchain",         "getblockhash",           getblockhash,           true,  {"height"} },
  5186. -    { "blockchain",         "getblockheader",         getblockheader,         true,  {"blockhash","verbose"} },
  5187. +    { "blockchain",         "getblockheader",         getblockheader,         true,  {"blockhash","verbose","legacy"} },
  5188.      { "blockchain",         "getchaintips",           getchaintips,           true,  {} },
  5189.      { "blockchain",         "getdifficulty",          getdifficulty,          true,  {} },
  5190.      { "blockchain",         "getmempoolancestors",    getmempoolancestors,    true,  {"txid","verbose"} },
  5191. diff --git a/src/rpc/mining.cpp b/src/rpc/mining.cpp
  5192. index dabb147..2902609 100644
  5193. --- a/src/rpc/mining.cpp
  5194. +++ b/src/rpc/mining.cpp
  5195. @@ -11,6 +11,7 @@
  5196.  #include "consensus/params.h"
  5197.  #include "consensus/validation.h"
  5198.  #include "core_io.h"
  5199. +#include "crypto/equihash.h"
  5200.  #include "dstencode.h"
  5201.  #include "init.h"
  5202.  #include "miner.h"
  5203. @@ -114,6 +115,8 @@ static UniValue generateBlocks(const Config &config,
  5204.                                 int nGenerate, uint64_t nMaxTries,
  5205.                                 bool keepScript) {
  5206.      static const int nInnerLoopCount = 0x100000;
  5207. +    static const int nInnerLoopEquihashMask = 0xFFFF;
  5208. +    static const int nInnerLoopEquihashCount = 0xFFFF;
  5209.      int nHeightStart = 0;
  5210.      int nHeightEnd = 0;
  5211.      int nHeight = 0;
  5212. @@ -128,11 +131,11 @@ static UniValue generateBlocks(const Config &config,
  5213.  
  5214.      unsigned int nExtraNonce = 0;
  5215.      UniValue blockHashes(UniValue::VARR);
  5216. +    const CChainParams& params = config.GetChainParams();
  5217. +    unsigned int n = params.EquihashN();
  5218. +    unsigned int k = params.EquihashK();
  5219.      while (nHeight < nHeightEnd) {
  5220. -        std::unique_ptr<CBlockTemplate> pblocktemplate(
  5221. -            BlockAssembler(config, Params())
  5222. -                .CreateNewBlock(coinbaseScript->reserveScript));
  5223. -
  5224. +        std::unique_ptr<CBlockTemplate> pblocktemplate(BlockAssembler(config, Params()).CreateNewBlock(coinbaseScript->reserveScript));
  5225.          if (!pblocktemplate.get()) {
  5226.              throw JSONRPCError(RPC_INTERNAL_ERROR, "Couldn't create new block");
  5227.          }
  5228. @@ -143,18 +146,60 @@ static UniValue generateBlocks(const Config &config,
  5229.              LOCK(cs_main);
  5230.              IncrementExtraNonce(config, pblock, chainActive.Tip(), nExtraNonce);
  5231.          }
  5232. -
  5233. -        while (nMaxTries > 0 && pblock->nNonce < nInnerLoopCount &&
  5234. -               !CheckProofOfWork(pblock->GetHash(), pblock->nBits, config)) {
  5235. -            ++pblock->nNonce;
  5236. +        if (pblock->nHeight < (uint32_t)params.GetConsensus().cdyHeight) {
  5237. +            // Solve sha256d.
  5238. +            while (nMaxTries > 0 && (int)pblock->nNonce.GetUint64(0) < nInnerLoopCount &&
  5239. +                   !CheckProofOfWork(pblock->GetHash(), pblock->nBits, false, config)) {
  5240. +                pblock->nNonce = ArithToUint256(UintToArith256(pblock->nNonce) + 1);
  5241. +                --nMaxTries;
  5242. +            }
  5243. +        } else {
  5244. +            // Solve Equihash.
  5245. +            crypto_generichash_blake2b_state eh_state;
  5246. +            EhInitialiseState(n, k, eh_state);
  5247. +
  5248. +            // I = the block header minus nonce and solution.
  5249. +            CEquihashInput I{*pblock};
  5250. +            CDataStream ss(SER_NETWORK, PROTOCOL_VERSION);
  5251. +            ss << I;
  5252. +
  5253. +            // H(I||...
  5254. +            crypto_generichash_blake2b_update(&eh_state, (unsigned char*)&ss[0], ss.size());
  5255. +
  5256. +            while (nMaxTries > 0 &&
  5257. +                   ((int)pblock->nNonce.GetUint64(0) & nInnerLoopEquihashMask) < nInnerLoopEquihashCount) {
  5258. +                // Yes, there is a chance every nonce could fail to satisfy the -regtest
  5259. +                // target -- 1 in 2^(2^256). That ain't gonna happen
  5260. +                pblock->nNonce = ArithToUint256(UintToArith256(pblock->nNonce) + 1);
  5261. +
  5262. +                // H(I||V||...
  5263. +                crypto_generichash_blake2b_state curr_state;
  5264. +                curr_state = eh_state;
  5265. +                crypto_generichash_blake2b_update(&curr_state,
  5266. +                                                  pblock->nNonce.begin(),
  5267. +                                                  pblock->nNonce.size());
  5268. +
  5269. +                // (x_1, x_2, ...) = A(I, V, n, k)
  5270. +                std::function<bool(std::vector<unsigned char>)> validBlock =
  5271. +                        [&config,&pblock](std::vector<unsigned char> soln) {
  5272. +                    pblock->nSolution = soln;
  5273. +                    // TODO(h4x3rotab): Add metrics counter like Zcash? `solutionTargetChecks.increment();`
  5274. +                    // TODO(h4x3rotab): Maybe switch to EhBasicSolve and better deal with `nMaxTries`?
  5275. +                    return CheckProofOfWork(pblock->GetHash(), pblock->nBits, true, config);
  5276. +                };
  5277. +                bool found = EhBasicSolveUncancellable(n, k, curr_state, validBlock);
  5278.                  --nMaxTries;
  5279. +                // TODO(h4x3rotab): Add metrics counter like Zcash? `ehSolverRuns.increment();`
  5280. +                if (found) {
  5281. +                    break;
  5282. +                }
  5283. +            }
  5284.          }
  5285.  
  5286.          if (nMaxTries == 0) {
  5287.              break;
  5288.          }
  5289. -
  5290. -        if (pblock->nNonce == nInnerLoopCount) {
  5291. +        if ((int)pblock->nNonce.GetUint64(0) == nInnerLoopCount) {
  5292.              continue;
  5293.          }
  5294.  
  5295. @@ -526,18 +571,16 @@ static UniValue getblocktemplate(const Config &config,
  5296.          }
  5297.          lpval = find_value(oparam, "longpollid");
  5298.  
  5299. -        if (strMode == "proposal") {
  5300. +        if (strMode == "proposal" || strMode == "proposal_legacy")
  5301. +        {
  5302.              const UniValue &dataval = find_value(oparam, "data");
  5303. -            if (!dataval.isStr()) {
  5304. -                throw JSONRPCError(RPC_TYPE_ERROR,
  5305. -                                   "Missing data String key for proposal");
  5306. -            }
  5307. +            if (!dataval.isStr())
  5308. +                throw JSONRPCError(RPC_TYPE_ERROR, "Missing data String key for proposal");
  5309.  
  5310.              CBlock block;
  5311. -            if (!DecodeHexBlk(block, dataval.get_str())) {
  5312. -                throw JSONRPCError(RPC_DESERIALIZATION_ERROR,
  5313. -                                   "Block decode failed");
  5314. -            }
  5315. +            bool legacy_format = (strMode == "proposal_legacy");
  5316. +            if (!DecodeHexBlk(block, dataval.get_str(), legacy_format))
  5317. +                throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "Block decode failed");
  5318.  
  5319.              uint256 hash = block.GetHash();
  5320.              BlockMap::iterator mi = mapBlockIndex.find(hash);
  5321. @@ -554,9 +597,10 @@ static UniValue getblocktemplate(const Config &config,
  5322.  
  5323.              CBlockIndex *const pindexPrev = chainActive.Tip();
  5324.              // TestBlockValidity only supports blocks built on the current Tip
  5325. -            if (block.hashPrevBlock != pindexPrev->GetBlockHash()) {
  5326. +            if (block.hashPrevBlock != pindexPrev->GetBlockHash())
  5327.                  return "inconclusive-not-best-prevblk";
  5328. -            }
  5329. +            if (!legacy_format && block.nHeight != (uint32_t)pindexPrev->nHeight + 1)
  5330. +                return "inconclusive-bad-height";
  5331.              CValidationState state;
  5332.              TestBlockValidity(config, state, block, pindexPrev, false, true);
  5333.              return BIP22ValidationResult(config, state);
  5334. @@ -683,7 +727,8 @@ static UniValue getblocktemplate(const Config &config,
  5335.  
  5336.      // Update nTime
  5337.      UpdateTime(pblock, config, pindexPrev);
  5338. -    pblock->nNonce = 0;
  5339. +    pblock->nNonce = uint256();
  5340. +    pblock->nSolution.clear();
  5341.  
  5342.      UniValue aCaps(UniValue::VARR);
  5343.      aCaps.push_back("proposal");
  5344. @@ -855,7 +900,7 @@ protected:
  5345.  static UniValue submitblock(const Config &config,
  5346.                              const JSONRPCRequest &request) {
  5347.      if (request.fHelp || request.params.size() < 1 ||
  5348. -        request.params.size() > 2) {
  5349. +        request.params.size() > 3) {
  5350.          throw std::runtime_error(
  5351.              "submitblock \"hexdata\" ( \"jsonparametersobject\" )\n"
  5352.              "\nAttempts to submit new block to network.\n"
  5353. @@ -863,14 +908,9 @@ static UniValue submitblock(const Config &config,
  5354.              "See https://en.bitcoin.it/wiki/BIP_0022 for full specification.\n"
  5355.  
  5356.              "\nArguments\n"
  5357. -            "1. \"hexdata\"        (string, required) the hex-encoded block "
  5358. -            "data to submit\n"
  5359. -            "2. \"parameters\"     (string, optional) object of optional "
  5360. -            "parameters\n"
  5361. -            "    {\n"
  5362. -            "      \"workid\" : \"id\"    (string, optional) if the server "
  5363. -            "provided a workid, it MUST be included with submissions\n"
  5364. -            "    }\n"
  5365. +            "1. \"hexdata\"        (string, required) the hex-encoded block data to submit\n"
  5366. +            "2. \"dummy\"          (optional) dummy value, for compatibility with BIP22. This value is ignored.\n"
  5367. +            "3. \"legacy\"         (boolean, optional) indicates if the block is in legacy foramt. default: false.\n"
  5368.              "\nResult:\n"
  5369.              "\nExamples:\n" +
  5370.              HelpExampleCli("submitblock", "\"mydata\"") +
  5371. @@ -879,7 +919,11 @@ static UniValue submitblock(const Config &config,
  5372.  
  5373.      std::shared_ptr<CBlock> blockptr = std::make_shared<CBlock>();
  5374.      CBlock &block = *blockptr;
  5375. -    if (!DecodeHexBlk(block, request.params[0].get_str())) {
  5376. +    bool legacy_format = false;
  5377. +    if (request.params.size() == 3 && request.params[2].get_bool() == true) {
  5378. +        legacy_format = true;
  5379. +    }
  5380. +    if (!DecodeHexBlk(block, request.params[0].get_str(), legacy_format)) {
  5381.          throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "Block decode failed");
  5382.      }
  5383.  
  5384. @@ -925,6 +969,40 @@ static UniValue submitblock(const Config &config,
  5385.      return BIP22ValidationResult(config, sc.state);
  5386.  }
  5387.  
  5388. +UniValue getblocksubsidy(const Config &config, const JSONRPCRequest& request)
  5389. +{
  5390. +  if (request.fHelp || request.params.size() > 1)
  5391. +    throw std::runtime_error(
  5392. +      "getblocksubsidy height\n"
  5393. +      "\nReturns block subsidy reward of block at index provided.\n"
  5394. +      "\nArguments:\n"
  5395. +      "1. height          (numeric, optional) The block height. If not provided, defaults to the current height of the chain.\n"
  5396. +      "\nResult:\n"
  5397. +      "{\n"
  5398. +      "\"miner\": n,    (numeric) The mining reward amount in satoshis.\n"
  5399. +      "\"founders\": f, (numeric) Always 0, for Zcash mining compatibility.\n"
  5400. +      "}\n"
  5401. +      "\nExamples:\n"
  5402. +      + HelpExampleCli("getblocksubsidy", "1000")
  5403. +      + HelpExampleRpc("getblocksubsidy", "1000")
  5404. +    );
  5405. +
  5406. +  RPCTypeCheck(request.params, {UniValue::VNUM});
  5407. +
  5408. +  LOCK(cs_main);
  5409. +  int nHeight = (request.params.size() == 1) ? request.params[0].get_int() : chainActive.Height();
  5410. +  if (nHeight < 0)
  5411. +    throw JSONRPCError(RPC_INVALID_PARAMETER, "Block height out of range.");
  5412. +
  5413. +  UniValue result(UniValue::VOBJ);
  5414. +
  5415. +  CAmount nReward = GetBlockSubsidy(nHeight, config.GetChainParams().GetConsensus()).GetSatoshis();
  5416. +  result.push_back(Pair("miner", nReward));
  5417. +  result.push_back(Pair("founders", 0));
  5418. +
  5419. +  return result;
  5420. +}
  5421. +
  5422.  static UniValue estimatefee(const Config &config,
  5423.                              const JSONRPCRequest &request) {
  5424.      if (request.fHelp || request.params.size() != 1) {
  5425. @@ -1011,7 +1089,7 @@ static UniValue estimatesmartfee(const Config &config,
  5426.              "\nResult:\n"
  5427.              "{\n"
  5428.              "  \"feerate\" : x.x,     (numeric) estimate fee-per-kilobyte (in "
  5429. -            "BCH)\n"
  5430. +            "CDY)\n"
  5431.              "  \"blocks\" : n         (numeric) block number where estimate "
  5432.              "was found\n"
  5433.              "}\n"
  5434. @@ -1090,6 +1168,7 @@ static const CRPCCommand commands[] = {
  5435.      {"mining",     "prioritisetransaction", prioritisetransaction, true, {"txid", "priority_delta", "fee_delta"}},
  5436.      {"mining",     "getblocktemplate",      getblocktemplate,      true, {"template_request"}},
  5437.      {"mining",     "submitblock",           submitblock,           true, {"hexdata", "parameters"}},
  5438. +    {"mining",     "getblocksubsidy",       getblocksubsidy,       true, {"height"}},
  5439.  
  5440.      {"generating", "generate",              generate,              true, {"nblocks", "maxtries"}},
  5441.      {"generating", "generatetoaddress",     generatetoaddress,     true, {"nblocks", "address", "maxtries"}},
  5442. diff --git a/src/rpc/server.cpp b/src/rpc/server.cpp
  5443. index ace8bc3..a19d0b7 100644
  5444. --- a/src/rpc/server.cpp
  5445. +++ b/src/rpc/server.cpp
  5446. @@ -114,7 +114,7 @@ Amount AmountFromValue(const UniValue &value) {
  5447.          throw JSONRPCError(RPC_TYPE_ERROR, "Amount is not a number or string");
  5448.  
  5449.      int64_t n;
  5450. -    if (!ParseFixedPoint(value.getValStr(), 8, &n))
  5451. +    if (!ParseFixedPoint(value.getValStr(), COIN_DECIMAL_COUNT, &n))
  5452.          throw JSONRPCError(RPC_TYPE_ERROR, "Invalid amount");
  5453.  
  5454.      Amount amt(n);
  5455. @@ -127,9 +127,9 @@ UniValue ValueFromAmount(const Amount &amount) {
  5456.      int64_t amt = amount.GetSatoshis();
  5457.      bool sign = amt < 0;
  5458.      int64_t n_abs = (sign ? -amt : amt);
  5459. -    int64_t quotient = n_abs / COIN.GetSatoshis();
  5460. -    int64_t remainder = n_abs % COIN.GetSatoshis();
  5461. -    return UniValue(UniValue::VNUM, strprintf("%s%d.%08d", sign ? "-" : "",
  5462. +    int64_t quotient = n_abs / (COIN.GetSatoshis() / COIN_MULTIPLE);
  5463. +    int64_t remainder = n_abs % (COIN.GetSatoshis() / COIN_MULTIPLE);
  5464. +    return UniValue(UniValue::VNUM, strprintf("%s%d.%05d", sign ? "-" : "",
  5465.                                                quotient, remainder));
  5466.  }
  5467.  
  5468. diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp
  5469. index 78b2edb..acb4c36 100644
  5470. --- a/src/script/interpreter.cpp
  5471. +++ b/src/script/interpreter.cpp
  5472. @@ -1348,11 +1348,16 @@ PrecomputedTransactionData::PrecomputedTransactionData(
  5473.      hashOutputs = GetOutputsHash(txTo);
  5474.  }
  5475.  
  5476. +//modified SignatureHash by hmc
  5477.  uint256 SignatureHash(const CScript &scriptCode, const CTransaction &txTo,
  5478.                        unsigned int nIn, uint32_t nHashType, const Amount amount,
  5479.                        const PrecomputedTransactionData *cache, uint32_t flags) {
  5480. +    uint32_t nForkHashType = nHashType;
  5481.      if ((nHashType & SIGHASH_FORKID) &&
  5482.          (flags & SCRIPT_ENABLE_SIGHASH_FORKID)) {
  5483. +        
  5484. +        if(flags & SCRIPT_ENABLE_CHANGE_FORKID)
  5485. +            nForkHashType |= FORKID_IN_USE << 8;
  5486.          uint256 hashPrevouts;
  5487.          uint256 hashSequence;
  5488.          uint256 hashOutputs;
  5489. @@ -1395,7 +1400,7 @@ uint256 SignatureHash(const CScript &scriptCode, const CTransaction &txTo,
  5490.          // Locktime
  5491.          ss << txTo.nLockTime;
  5492.          // Sighash type
  5493. -        ss << nHashType;
  5494. +        ss << nForkHashType;
  5495.  
  5496.          return ss.GetHash();
  5497.      }
  5498. @@ -1421,7 +1426,7 @@ uint256 SignatureHash(const CScript &scriptCode, const CTransaction &txTo,
  5499.  
  5500.      // Serialize and hash
  5501.      CHashWriter ss(SER_GETHASH, 0);
  5502. -    ss << txTmp << nHashType;
  5503. +    ss << txTmp << nForkHashType;
  5504.      return ss.GetHash();
  5505.  }
  5506.  
  5507. diff --git a/src/script/interpreter.h b/src/script/interpreter.h
  5508. index 5d56c14..7eecafc 100644
  5509. --- a/src/script/interpreter.h
  5510. +++ b/src/script/interpreter.h
  5511. @@ -27,6 +27,16 @@ enum {
  5512.      SIGHASH_ANYONECANPAY = 0x80,
  5513.  };
  5514.  
  5515. +//add by hmc
  5516. +/** Fork IDs **/
  5517. +enum
  5518. +{
  5519. +    FORKID_BCC = 0,
  5520. +    FORKID_CDY = 0x6f,  // 111
  5521. +};
  5522. +//add by hmc
  5523. +static const uint32_t FORKID_IN_USE = FORKID_CDY;
  5524. +
  5525.  /** Script verification flags */
  5526.  enum {
  5527.      SCRIPT_VERIFY_NONE = 0,
  5528. @@ -115,15 +125,18 @@ enum {
  5529.      // Do we accept signature using SIGHASH_FORKID
  5530.      //
  5531.      SCRIPT_ENABLE_SIGHASH_FORKID = (1U << 16),
  5532. +    
  5533. +    //add by hmc
  5534. +    SCRIPT_ENABLE_CHANGE_FORKID = (1U << 17),
  5535.  };
  5536.  
  5537.  bool CheckSignatureEncoding(const std::vector<uint8_t> &vchSig, uint32_t flags,
  5538.                              ScriptError *serror);
  5539. -
  5540. +//modyfied by hmc
  5541.  uint256 SignatureHash(const CScript &scriptCode, const CTransaction &txTo,
  5542.                        unsigned int nIn, uint32_t nHashType, const Amount amount,
  5543.                        const PrecomputedTransactionData *cache = nullptr,
  5544. -                      uint32_t flags = SCRIPT_ENABLE_SIGHASH_FORKID);
  5545. +                      uint32_t flags = SCRIPT_ENABLE_SIGHASH_FORKID | SCRIPT_ENABLE_CHANGE_FORKID);
  5546.  
  5547.  class BaseSignatureChecker {
  5548.  public:
  5549. diff --git a/src/script/sign.cpp b/src/script/sign.cpp
  5550. index c46f7c6..f0fdf23 100644
  5551. --- a/src/script/sign.cpp
  5552. +++ b/src/script/sign.cpp
  5553. @@ -163,7 +163,7 @@ bool ProduceSignature(const BaseSignatureCreator &creator,
  5554.      // Test solution
  5555.      return solved &&
  5556.             VerifyScript(sigdata.scriptSig, fromPubKey,
  5557. -                        STANDARD_SCRIPT_VERIFY_FLAGS, creator.Checker());
  5558. +                        STANDARD_SCRIPT_VERIFY_FLAGS | SCRIPT_ENABLE_CHANGE_FORKID, creator.Checker());
  5559.  }
  5560.  
  5561.  SignatureData DataFromTransaction(const CMutableTransaction &tx,
  5562. diff --git a/src/script/standard.h b/src/script/standard.h
  5563. index 8e39bf3..c6de050 100644
  5564. --- a/src/script/standard.h
  5565. +++ b/src/script/standard.h
  5566. @@ -41,6 +41,7 @@ extern unsigned nMaxDatacarrierBytes;
  5567.   * details.
  5568.   */
  5569.  static const uint32_t MANDATORY_SCRIPT_VERIFY_FLAGS =
  5570. +    SCRIPT_ENABLE_CHANGE_FORKID |
  5571.      SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_STRICTENC |
  5572.      SCRIPT_ENABLE_SIGHASH_FORKID | SCRIPT_VERIFY_LOW_S | SCRIPT_VERIFY_NULLFAIL;
  5573.  
  5574. diff --git a/src/seeder/bitcoin.cpp b/src/seeder/bitcoin.cpp
  5575. index f2f1c23..e9b7744 100644
  5576. --- a/src/seeder/bitcoin.cpp
  5577. +++ b/src/seeder/bitcoin.cpp
  5578. @@ -13,7 +13,7 @@
  5579.  bool fTestNet;
  5580.  
  5581.  // The network magic to use.
  5582. -CMessageHeader::MessageMagic netMagic = {0xe3, 0xe1, 0xf3, 0xe8};
  5583. +CMessageHeader::MessageMagic netMagic = {0xe3, 0xc3, 0xc4, 0xd9};
  5584.  
  5585.  #define BITCOIN_SEED_NONCE 0x0539a019ca550825ULL
  5586.  
  5587. @@ -100,7 +100,7 @@ class CSeederNode {
  5588.          CAddress me(myService, ServiceFlags(NODE_NETWORK | NODE_BITCOIN_CASH));
  5589.          BeginMessage("version");
  5590.          int nBestHeight = GetRequireHeight();
  5591. -        std::string ver = "/bitcoin-cash-seeder:0.15/";
  5592. +        std::string ver = "/bitcoin-candy-seeder:0.16/";
  5593.          vSend << PROTOCOL_VERSION << nLocalServices << nTime << you << me
  5594.                << nLocalNonce << ver << nBestHeight;
  5595.          EndMessage();
  5596. diff --git a/src/seeder/bitcoin.h b/src/seeder/bitcoin.h
  5597. index f7b7dd1..aee16bb 100644
  5598. --- a/src/seeder/bitcoin.h
  5599. +++ b/src/seeder/bitcoin.h
  5600. @@ -13,7 +13,7 @@
  5601.   */
  5602.  extern bool fTestNet;
  5603.  static inline unsigned short GetDefaultPort(const bool testnet = fTestNet) {
  5604. -    return testnet ? 18333 : 8333;
  5605. +    return testnet ? 18367 : 8367;
  5606.  }
  5607.  
  5608.  // The network magic to use.
  5609. diff --git a/src/seeder/main.cpp b/src/seeder/main.cpp
  5610. index 877b5ba..5a814a0 100644
  5611. --- a/src/seeder/main.cpp
  5612. +++ b/src/seeder/main.cpp
  5613. @@ -441,12 +441,9 @@ extern "C" void *ThreadStats(void *) {
  5614.  }
  5615.  
  5616.  static const std::string mainnet_seeds[] = {
  5617. -    "seed.bitcoinabc.org", "seed-abc.bitcoinforks.org", "seed.bitprim.org",
  5618. -    "seed.deadalnix.me",   "seeder.criptolayer.net",    ""};
  5619. +    "s1.bitcoincandy.one",  "s2.bitcoincandy.one", "s3.bitcoincandy.one",  ""};
  5620.  static const std::string testnet_seeds[] = {
  5621. -    "testnet-seed.bitcoinabc.org",    "testnet-seed-abc.bitcoinforks.org",
  5622. -    "testnet-seed.bitprim.org",       "testnet-seed.deadalnix.me",
  5623. -    "testnet-seeder.criptolayer.net", ""};
  5624. +    "ts1.bitcoincandy.one", ""};
  5625.  static const std::string *seeds = mainnet_seeds;
  5626.  
  5627.  const static unsigned int MAX_HOSTS_PER_SEED = 128;
  5628. @@ -507,9 +504,9 @@ int main(int argc, char **argv) {
  5629.      if (opts.fUseTestNet) {
  5630.          printf("Using testnet.\n");
  5631.          netMagic[0] = 0xf4;
  5632. -        netMagic[1] = 0xe5;
  5633. -        netMagic[2] = 0xf3;
  5634. -        netMagic[3] = 0xf4;
  5635. +        netMagic[1] = 0x43;
  5636. +        netMagic[2] = 0x44;
  5637. +        netMagic[3] = 0x59;
  5638.          seeds = testnet_seeds;
  5639.          fTestNet = true;
  5640.      }
  5641. diff --git a/src/test/equihash_tests.cpp b/src/test/equihash_tests.cpp
  5642. new file mode 100644
  5643. index 0000000..b487d87
  5644. diff --git a/src/txdb.cpp b/src/txdb.cpp
  5645. index adf062d..dc9c36a 100644
  5646. --- a/src/txdb.cpp
  5647. +++ b/src/txdb.cpp
  5648. @@ -250,13 +250,17 @@ bool CBlockTreeDB::LoadBlockIndexGuts(
  5649.          pindexNew->nUndoPos = diskindex.nUndoPos;
  5650.          pindexNew->nVersion = diskindex.nVersion;
  5651.          pindexNew->hashMerkleRoot = diskindex.hashMerkleRoot;
  5652. +        memcpy(pindexNew->nReserved, diskindex.nReserved, sizeof(pindexNew->nReserved));
  5653.          pindexNew->nTime = diskindex.nTime;
  5654.          pindexNew->nBits = diskindex.nBits;
  5655.          pindexNew->nNonce = diskindex.nNonce;
  5656. +        pindexNew->nSolution      = diskindex.nSolution;
  5657.          pindexNew->nStatus = diskindex.nStatus;
  5658.          pindexNew->nTx = diskindex.nTx;
  5659.  
  5660. -        if (!CheckProofOfWork(pindexNew->GetBlockHash(), pindexNew->nBits,
  5661. +        // TODO(h4x3rotab): Check Equihash solution? Not sure why Zcash doesn't do it here.
  5662. +        bool postfork = pindexNew->nHeight >= (uint32_t)config.GetChainParams().GetConsensus().cdyHeight;
  5663. +        if (!CheckProofOfWork(pindexNew->GetBlockHash(), pindexNew->nBits, postfork,
  5664.                                config)) {
  5665.              return error("LoadBlockIndex(): CheckProofOfWork failed: %s",
  5666.                           pindexNew->ToString());
  5667. diff --git a/src/univalue/gen/gen.cpp b/src/univalue/gen/gen.cpp
  5668. deleted file mode 100644
  5669. index 85fe209..0000000
  5670. +++ /dev/null
  5671. @@ -1,82 +0,0 @@
  5672. -// Copyright 2014 BitPay Inc.
  5673. -// Distributed under the MIT software license, see the accompanying
  5674. -// file COPYING or http://www.opensource.org/licenses/mit-license.php.
  5675. -
  5676. -//
  5677. -// To re-create univalue_escapes.h:
  5678. -// $ g++ -o gen gen.cpp
  5679. -// $ ./gen > univalue_escapes.h
  5680. -//
  5681. -
  5682. -#include <stdio.h>
  5683. -#include <string.h>
  5684. -#include "univalue.h"
  5685. -
  5686. -static bool initEscapes;
  5687. -static std::string escapes[256];
  5688. -
  5689. -static void initJsonEscape()
  5690. -{
  5691. -    // Escape all lower control characters (some get overridden with smaller sequences below)
  5692. -    for (int ch=0x00; ch<0x20; ++ch) {
  5693. -        char tmpbuf[20];
  5694. -        snprintf(tmpbuf, sizeof(tmpbuf), "\\u%04x", ch);
  5695. -        escapes[ch] = std::string(tmpbuf);
  5696. -    }
  5697. -
  5698. -    escapes[(int)'"'] = "\\\"";
  5699. -    escapes[(int)'\\'] = "\\\\";
  5700. -    escapes[(int)'\b'] = "\\b";
  5701. -    escapes[(int)'\f'] = "\\f";
  5702. -    escapes[(int)'\n'] = "\\n";
  5703. -    escapes[(int)'\r'] = "\\r";
  5704. -    escapes[(int)'\t'] = "\\t";
  5705. -    escapes[(int)'\x7f'] = "\\u007f"; // U+007F DELETE
  5706. -
  5707. -    initEscapes = true;
  5708. -}
  5709. -
  5710. -static void outputEscape()
  5711. -{
  5712. -   printf( "// Automatically generated file. Do not modify.\n"
  5713. -       "#ifndef BITCOIN_UNIVALUE_UNIVALUE_ESCAPES_H\n"
  5714. -       "#define BITCOIN_UNIVALUE_UNIVALUE_ESCAPES_H\n"
  5715. -       "static const char *escapes[256] = {\n");
  5716. -
  5717. -   for (unsigned int i = 0; i < 256; i++) {
  5718. -       if (escapes[i].empty()) {
  5719. -           printf("\tNULL,\n");
  5720. -       } else {
  5721. -           printf("\t\"");
  5722. -
  5723. -           unsigned int si;
  5724. -           for (si = 0; si < escapes[i].size(); si++) {
  5725. -               char ch = escapes[i][si];
  5726. -               switch (ch) {
  5727. -               case '"':
  5728. -                   printf("\\\"");
  5729. -                   break;
  5730. -               case '\\':
  5731. -                   printf("\\\\");
  5732. -                   break;
  5733. -               default:
  5734. -                   printf("%c", escapes[i][si]);
  5735. -                   break;
  5736. -               }
  5737. -           }
  5738. -
  5739. -           printf("\",\n");
  5740. -       }
  5741. -   }
  5742. -
  5743. -   printf( "};\n"
  5744. -       "#endif // BITCOIN_UNIVALUE_UNIVALUE_ESCAPES_H\n");
  5745. -}
  5746. -
  5747. -int main (int argc, char *argv[])
  5748. -{
  5749. -   initJsonEscape();
  5750. -   outputEscape();
  5751. -   return 0;
  5752. -}
  5753. -
  5754. diff --git a/src/util.cpp b/src/util.cpp
  5755. index 2551ba4..bcd46a1 100644
  5756. --- a/src/util.cpp
  5757. +++ b/src/util.cpp
  5758. @@ -88,8 +88,8 @@
  5759.  #include <openssl/conf.h>
  5760.  #include <openssl/rand.h>
  5761.  
  5762. -const char *const BITCOIN_CONF_FILENAME = "bitcoin.conf";
  5763. -const char *const BITCOIN_PID_FILENAME = "bitcoind.pid";
  5764. +const char *const BITCOIN_CONF_FILENAME = "bitcoincandy.conf";
  5765. +const char *const BITCOIN_PID_FILENAME = "bcandyd.pid";
  5766.  
  5767.  CCriticalSection cs_args;
  5768.  std::map<std::string, std::string> mapArgs;
  5769. @@ -106,6 +106,9 @@ bool fLogIPs = DEFAULT_LOGIPS;
  5770.  std::atomic<bool> fReopenDebugLog(false);
  5771.  CTranslationInterface translationInterface;
  5772.  
  5773. +/** Log categories bitfield. */
  5774. +std::atomic<uint32_t> logCategories(0);
  5775. +
  5776.  /** Init OpenSSL library multithreading support */
  5777.  static CCriticalSection **ppmutexOpenSSL;
  5778.  void locking_callback(int mode, int i, const char *file,
  5779. @@ -460,7 +463,7 @@ boost::filesystem::path GetDefaultDataDir() {
  5780.  // Unix: ~/.bitcoin
  5781.  #ifdef WIN32
  5782.      // Windows
  5783. -    return GetSpecialFolderPath(CSIDL_APPDATA) / "Bitcoin";
  5784. +    return GetSpecialFolderPath(CSIDL_APPDATA) / "BitcoinCandy";
  5785.  #else
  5786.      fs::path pathRet;
  5787.      char *pszHome = getenv("HOME");
  5788. @@ -470,10 +473,10 @@ boost::filesystem::path GetDefaultDataDir() {
  5789.          pathRet = fs::path(pszHome);
  5790.  #ifdef MAC_OSX
  5791.      // Mac
  5792. -    return pathRet / "Library/Application Support/Bitcoin";
  5793. +    return pathRet / "Library/Application Support/BitcoinCandy";
  5794.  #else
  5795.      // Unix
  5796. -    return pathRet / ".bitcoin";
  5797. +    return pathRet / ".bitcoincandy";
  5798.  #endif
  5799.  #endif
  5800.  }
  5801. @@ -819,8 +822,8 @@ std::string CopyrightHolders(const std::string &strPrefix) {
  5802.      // Check for untranslated substitution to make sure Bitcoin ABC copyright
  5803.      // is not removed by accident.
  5804.      if (strprintf(COPYRIGHT_HOLDERS, COPYRIGHT_HOLDERS_SUBSTITUTION)
  5805. -            .find("Bitcoin ABC") == std::string::npos) {
  5806. -        strCopyrightHolders += "\n" + strPrefix + "The Bitcoin ABC developers";
  5807. +            .find("Bitcoin Candy") == std::string::npos) {
  5808. +        strCopyrightHolders += "\n" + strPrefix + "The Bitcoin Candy developers";
  5809.      }
  5810.      return strCopyrightHolders;
  5811.  }
  5812. diff --git a/src/util.h b/src/util.h
  5813. index 821dd3c..8f80a86 100644
  5814. --- a/src/util.h
  5815. +++ b/src/util.h
  5816. @@ -54,6 +54,8 @@ extern CTranslationInterface translationInterface;
  5817.  extern const char *const BITCOIN_CONF_FILENAME;
  5818.  extern const char *const BITCOIN_PID_FILENAME;
  5819.  
  5820. +extern std::atomic<uint32_t> logCategories;
  5821. +
  5822.  /**
  5823.   * Translation function: Call Translate signal on UI interface, which returns a
  5824.   * boost::optional result. If no translation slot is registered, nothing is
  5825. @@ -67,6 +69,40 @@ inline std::string _(const char *psz) {
  5826.  void SetupEnvironment();
  5827.  bool SetupNetworking();
  5828.  
  5829. +namespace BCLog {
  5830. +    enum LogFlags : uint32_t {
  5831. +        NONE        = 0,
  5832. +        NET         = (1 <<  0),
  5833. +        TOR         = (1 <<  1),
  5834. +        MEMPOOL     = (1 <<  2),
  5835. +        HTTP        = (1 <<  3),
  5836. +        BENCH       = (1 <<  4),
  5837. +        ZMQ         = (1 <<  5),
  5838. +        DB          = (1 <<  6),
  5839. +        RPC         = (1 <<  7),
  5840. +        ESTIMATEFEE = (1 <<  8),
  5841. +        ADDRMAN     = (1 <<  9),
  5842. +        SELECTCOINS = (1 << 10),
  5843. +        REINDEX     = (1 << 11),
  5844. +        CMPCTBLOCK  = (1 << 12),
  5845. +        RAND        = (1 << 13),
  5846. +        PRUNE       = (1 << 14),
  5847. +        PROXY       = (1 << 15),
  5848. +        MEMPOOLREJ  = (1 << 16),
  5849. +        LIBEVENT    = (1 << 17),
  5850. +        COINDB      = (1 << 18),
  5851. +        QT          = (1 << 19),
  5852. +        LEVELDB     = (1 << 20),
  5853. +        POW         = (1 << 30),
  5854. +        ALL         = ~(uint32_t)0,
  5855. +    };
  5856. +}
  5857. +/** Return true if log accepts specified category */
  5858. +static inline bool LogAcceptCategory(uint32_t category)
  5859. +{
  5860. +    return (logCategories.load(std::memory_order_relaxed) & category) != 0;
  5861. +}
  5862. +
  5863.  /** Return true if log accepts specified category */
  5864.  bool LogAcceptCategory(const char *category);
  5865.  /** Send a string to the log output */
  5866. diff --git a/src/utilmoneystr.cpp b/src/utilmoneystr.cpp
  5867. index 596d236..5501742 100644
  5868. --- a/src/utilmoneystr.cpp
  5869. +++ b/src/utilmoneystr.cpp
  5870. @@ -14,9 +14,9 @@ std::string FormatMoney(const Amount &amt) {
  5871.      // number formatting.
  5872.      int64_t n = amt.GetSatoshis();
  5873.      int64_t n_abs = (n > 0 ? n : -n);
  5874. -    int64_t quotient = n_abs / COIN.GetSatoshis();
  5875. -    int64_t remainder = n_abs % COIN.GetSatoshis();
  5876. -    std::string str = strprintf("%d.%08d", quotient, remainder);
  5877. +    int64_t quotient = n_abs / (COIN.GetSatoshis() / COIN_MULTIPLE);
  5878. +    int64_t remainder = n_abs % (COIN.GetSatoshis() / COIN_MULTIPLE);
  5879. +    std::string str = strprintf("%d.%05d", quotient, remainder);
  5880.  
  5881.      // Right-trim excess zeros before the decimal point:
  5882.      int nTrim = 0;
  5883. @@ -41,7 +41,7 @@ bool ParseMoney(const char *pszIn, Amount &nRet) {
  5884.      for (; *p; p++) {
  5885.          if (*p == '.') {
  5886.              p++;
  5887. -            int64_t nMult = 10 * CENT.GetSatoshis();
  5888. +            int64_t nMult = 10 * (CENT.GetSatoshis() / COIN_MULTIPLE);
  5889.              while (isdigit(*p) && (nMult > 0)) {
  5890.                  nUnits += nMult * (*p++ - '0');
  5891.                  nMult /= 10;
  5892. @@ -56,9 +56,9 @@ bool ParseMoney(const char *pszIn, Amount &nRet) {
  5893.          if (!isspace(*p)) return false;
  5894.      // guard against 63 bit overflow
  5895.      if (strWhole.size() > 10) return false;
  5896. -    if (nUnits < 0 || nUnits > COIN.GetSatoshis()) return false;
  5897. +    if (nUnits < 0 || nUnits > (COIN.GetSatoshis() / COIN_MULTIPLE)) return false;
  5898.      int64_t nWhole = atoi64(strWhole);
  5899. -    Amount nValue = nWhole * COIN + Amount(nUnits);
  5900. +    Amount nValue = nWhole * (COIN / COIN_MULTIPLE) + Amount(nUnits);
  5901.  
  5902.      nRet = nValue;
  5903.      return true;
  5904. diff --git a/src/validation.cpp b/src/validation.cpp
  5905. index 9474aef..76e336d 100644
  5906. --- a/src/validation.cpp
  5907. +++ b/src/validation.cpp
  5908. @@ -16,6 +16,7 @@
  5909.  #include "consensus/validation.h"
  5910.  #include "hash.h"
  5911.  #include "init.h"
  5912. +#include "netbase.h"
  5913.  #include "policy/fees.h"
  5914.  #include "policy/policy.h"
  5915.  #include "pow.h"
  5916. @@ -80,6 +81,7 @@ uint64_t nPruneTarget = 0;
  5917.  int64_t nMaxTipAge = DEFAULT_MAX_TIP_AGE;
  5918.  
  5919.  uint256 hashAssumeValid;
  5920. +arith_uint256 nMinimumChainWork;
  5921.  
  5922.  CFeeRate minRelayTxFee = CFeeRate(DEFAULT_MIN_RELAY_TX_FEE);
  5923.  Amount maxTxFee = DEFAULT_TRANSACTION_MAXFEE;
  5924. @@ -91,7 +93,7 @@ static void CheckBlockIndex(const Consensus::Params &consensusParams);
  5925.  /** Constant stuff for coinbase transactions we create: */
  5926.  CScript COINBASE_FLAGS;
  5927.  
  5928. -const std::string strMessageMagic = "Bitcoin Signed Message:\n";
  5929. +const std::string strMessageMagic = "Bitcoin Candy Signed Message:\n";
  5930.  
  5931.  // Internal stuff
  5932.  namespace {
  5933. @@ -606,6 +608,18 @@ static bool IsCurrentForFeeEstimation() {
  5934.      return true;
  5935.  }
  5936.  
  5937. +static bool IsCDHFenabled(const Config &config, int nHeight) {
  5938. +    return nHeight >= config.GetChainParams().GetConsensus().cdyHeight;
  5939. +}
  5940. +
  5941. +bool IsCDHFenabled(const Config &config, const CBlockIndex *pindexPrev) {
  5942. +    if (pindexPrev == nullptr) {
  5943. +        return false;
  5944. +    }
  5945. +
  5946. +    return IsCDHFenabled(config, pindexPrev->nHeight);
  5947. +}
  5948. +
  5949.  static bool IsUAHFenabled(const Config &config, int nHeight) {
  5950.      return nHeight >= config.GetChainParams().GetConsensus().uahfHeight;
  5951.  }
  5952. @@ -1146,11 +1160,15 @@ bool ReadBlockFromDisk(CBlock &block, const CDiskBlockPos &pos,
  5953.                       e.what(), pos.ToString());
  5954.      }
  5955.  
  5956. -    // Check the header
  5957. -    if (!CheckProofOfWork(block.GetHash(), block.nBits, config)) {
  5958. -        return error("ReadBlockFromDisk: Errors in block header at %s",
  5959. -                     pos.ToString());
  5960. +    const Consensus::Params& consensusParams = Params().GetConsensus();
  5961. +    // Check Equihash solution
  5962. +    bool postfork = block.nHeight >= (uint32_t)consensusParams.cdyHeight;
  5963. +    if (postfork && !CheckEquihashSolution(&block, Params())) {
  5964. +        return error("ReadBlockFromDisk: Errors in block header at %s (bad Equihash solution)", pos.ToString());
  5965.      }
  5966. +    // Check the header
  5967. +    if (!CheckProofOfWork(block.GetHash(), block.nBits, postfork, config))
  5968. +        return error("ReadBlockFromDisk: Errors in block header at %s", pos.ToString());
  5969.  
  5970.      return true;
  5971.  }
  5972. @@ -1171,11 +1189,24 @@ bool ReadBlockFromDisk(CBlock &block, const CBlockIndex *pindex,
  5973.  }
  5974.  
  5975.  Amount GetBlockSubsidy(int nHeight, const Consensus::Params &consensusParams) {
  5976. -    int halvings = nHeight / consensusParams.nSubsidyHalvingInterval;
  5977. +    int halvings;
  5978. +    if(nHeight>=consensusParams.cdyHeight) {
  5979. +        halvings = (consensusParams.cdyHeight + (nHeight - consensusParams.cdyHeight)/5) /  consensusParams.nSubsidyHalvingInterval;
  5980. +    }
  5981. +    else halvings = nHeight / consensusParams.nSubsidyHalvingInterval;
  5982. +
  5983.      // Force block reward to zero when right shift is undefined.
  5984. +    //  Yang determine later if we use this or BTG premine window mechanism
  5985. +    if (nHeight == consensusParams.cdyHeight)
  5986. +       return 210000 * COIN;// * COIN_SCALE;
  5987. +    
  5988.      if (halvings >= 64) return Amount(0);
  5989.  
  5990. -    Amount nSubsidy = 50 * COIN;
  5991. +    Amount nSubsidy = 50 * COIN;// * COIN_SCALE;
  5992. +    
  5993. +    if(nHeight>=consensusParams.cdyHeight) {
  5994. +        nSubsidy = 10 * COIN;// * COIN_SCALE;
  5995. +    }  
  5996.      // Subsidy is cut in half every 210,000 blocks which will occur
  5997.      // approximately every 4 years.
  5998.      return Amount(nSubsidy.GetSatoshis() >> halvings);
  5999. @@ -1196,8 +1227,12 @@ bool IsInitialBlockDownload() {
  6000.      if (chainActive.Tip()->nChainWork <
  6001.          UintToArith256(chainParams.GetConsensus().nMinimumChainWork))
  6002.          return true;
  6003. -    if (chainActive.Tip()->GetBlockTime() < (GetTime() - nMaxTipAge))
  6004. +    if (fSkipHardforkIBD && chainActive.Tip()->nHeight + 1 >= (int)chainParams.GetConsensus().cdyHeight)
  6005. +        return false;
  6006. +    int64_t target_time = fCDYBootstrapping ? (int64_t)chainParams.GetConsensus().BitcoinPostforkTime : GetTime();
  6007. +    if (chainActive.Tip()->GetBlockTime() < (target_time - nMaxTipAge))
  6008.          return true;
  6009. +    LogPrintf("Leaving InitialBlockDownload (latching to false)\n");
  6010.      latchToFalse.store(true, std::memory_order_relaxed);
  6011.      return false;
  6012.  }
  6013. @@ -1835,7 +1870,11 @@ static uint32_t GetBlockScriptFlags(const CBlockIndex *pindex,
  6014.      }
  6015.  
  6016.      // If the UAHF is enabled, we start accepting replay protected txns
  6017. -    if (IsUAHFenabled(config, pindex->pprev)) {
  6018. +    if(IsCDHFenabled(config, pindex->pprev)){
  6019. +        flags |= SCRIPT_VERIFY_STRICTENC;
  6020. +        flags |= SCRIPT_ENABLE_SIGHASH_FORKID;
  6021. +        flags |= SCRIPT_ENABLE_CHANGE_FORKID;
  6022. +    } else if (IsUAHFenabled(config, pindex->pprev)) {
  6023.          flags |= SCRIPT_VERIFY_STRICTENC;
  6024.          flags |= SCRIPT_ENABLE_SIGHASH_FORKID;
  6025.      }
  6026. @@ -3198,8 +3237,17 @@ bool FindUndoPos(CValidationState &state, int nFile, CDiskBlockPos &pos,
  6027.  
  6028.  static bool CheckBlockHeader(const Config &config, const CBlockHeader &block,
  6029.                               CValidationState &state, bool fCheckPOW = true) {
  6030. -    // Check proof of work matches claimed amount
  6031. -    if (fCheckPOW && !CheckProofOfWork(block.GetHash(), block.nBits, config)) {
  6032. +    // Yang Check proof of work matches claimed amount
  6033. +    const Consensus::Params &consensusParams = Params().GetConsensus();
  6034. +    bool postfork = block.nHeight >= (uint32_t)consensusParams.cdyHeight;
  6035. +    
  6036. +    if (fCheckPOW && postfork && !CheckEquihashSolution(&block, Params())) {
  6037. +        LogPrintf("CheckBlockHeader(): Equihash solution invalid at height %d\n", block.nHeight);
  6038. +        return state.DoS(100, error("CheckBlockHeader(): Equihash solution invalid"),
  6039. +                         REJECT_INVALID, "invalid-solution");
  6040. +    }
  6041. +    
  6042. +    if (fCheckPOW && !CheckProofOfWork(block.GetHash(), block.nBits, postfork, config)) {
  6043.          return state.DoS(50, false, REJECT_INVALID, "high-hash", false,
  6044.                           "proof of work failed");
  6045.      }
  6046. @@ -3359,6 +3407,10 @@ static bool ContextualCheckBlockHeader(const Config &config,
  6047.                           "incorrect proof of work");
  6048.      }
  6049.  
  6050. +    // Check block height for blocks after CDY fork.
  6051. +    if (nHeight >= consensusParams.cdyHeight && block.nHeight != (uint32_t)nHeight)
  6052. +        return state.Invalid(false, REJECT_INVALID, "bad-height", "incorrect block height");
  6053. +
  6054.      // Check timestamp against prev
  6055.      if (block.GetBlockTime() <= pindexPrev->GetMedianTimePast()) {
  6056.          return state.Invalid(false, REJECT_INVALID, "time-too-old",
  6057. @@ -3507,6 +3559,7 @@ static bool AcceptBlockHeader(const Config &config, const CBlockHeader &block,
  6058.                  *ppindex = pindex;
  6059.              }
  6060.              if (pindex->nStatus & BLOCK_FAILED_MASK) {
  6061. +                LogPrintf("%s: block %d(%s, nStatus=%x) is marked invalid\n", __func__, pindex->nHeight, hash.ToString(), pindex->nStatus);
  6062.                  return state.Invalid(error("%s: block %s is marked invalid",
  6063.                                             __func__, hash.ToString()),
  6064.                                       0, "duplicate");
  6065. @@ -3981,8 +4034,7 @@ FILE *OpenUndoFile(const CDiskBlockPos &pos, bool fReadOnly) {
  6066.      return OpenDiskFile(pos, "rev", fReadOnly);
  6067.  }
  6068.  
  6069. -boost::filesystem::path GetBlockPosFilename(const CDiskBlockPos &pos,
  6070. -                                            const char *prefix) {
  6071. +boost::filesystem::path GetBlockPosFilename(const CDiskBlockPos &pos, const char *prefix) {
  6072.      return GetDataDir() / "blocks" / strprintf("%s%05u.dat", prefix, pos.nFile);
  6073.  }
  6074.  
  6075. diff --git a/src/version.h b/src/version.h
  6076. index 3cbe33d..16ff091 100644
  6077. --- a/src/version.h
  6078. +++ b/src/version.h
  6079. @@ -8,7 +8,7 @@
  6080.  /**
  6081.   * network protocol versioning
  6082.   */
  6083. -static const int PROTOCOL_VERSION = 70015;
  6084. +static const int PROTOCOL_VERSION = 70016;
  6085.  
  6086.  //! initial proto version, to be increased after version/verack negotiation
  6087.  static const int INIT_PROTO_VERSION = 209;
  6088. @@ -47,4 +47,5 @@ static const int SHORT_IDS_BLOCKS_VERSION = 70014;
  6089.  //! not banning for invalid compact blocks starts with this version
  6090.  static const int INVALID_CB_NO_BAN_VERSION = 70015;
  6091.  
  6092. +static const int CDY_HARD_FORK_VERSION = 70016;
  6093.  #endif // BITCOIN_VERSION_H
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement