노출되는 이미지가 불편하시겠지만 양해를 구합니다. 노출, 클릭등에 관한 자료로 활용 중입니다.

NiceHash 사용하기 순서

 

1. BTC입금하기 

2. Pool등록하기(사용하는 Pool 정보 입력)

3. 구매 하기 ( Hash단가, Hash사이즈, 총 금액 )



#  BTC 입금하기 

 

- 설명은 생략(Deposit하는 방식은 동일함)


#  Pool등록 하기

 


 

-등록시에 Test Pool 통해서 성공 여부를 확인후에 Add Pool 실행하여 등록


 

 

#  Standard구매 ( 가격, Hash제한의 변동 가능 )



- Standard방식을 선택하고, 등록한 Pool를 설정


- Fixed3가지 값이 고정되며, 24시간동안 유지 된다.


- 구매(Place Order)전에 pool호환 여부를 반드시 확인해야 한다. 


 

#  Standard구매 후 목록에 추가된 화면




 

*  Pool 등록 에러

 

- 사용중이 pool과 호환이 되지 않는 경우이므로, nicehash를 사용할 수 없다.

블로그 이미지

StartGuide

I want to share the basic to programming of each category and how to solve the error. This basic instruction can be extended further. And I have been worked in southeast Asia more than 3 years. And I want to have the chance to work another country.

,
노출되는 이미지가 불편하시겠지만 양해를 구합니다. 노출, 클릭등에 관한 자료로 활용 중입니다.


BitCoin 0.15 vs LiteCoin 0.15 ( 소스 코드 비교 )



- 비트 코인

+ 라이트 코인


--- a/src/Makefile.am

+++ b/src/Makefile.am

@@ -66,11 +66,11 @@ TESTS =

 BENCHMARKS =

 

 if BUILD_BITCOIND

-  bin_PROGRAMS += bitcoind

+  bin_PROGRAMS += litecoind

 endif

 

 if BUILD_BITCOIN_UTILS

-  bin_PROGRAMS += bitcoin-cli bitcoin-tx

+  bin_PROGRAMS += litecoin-cli litecoin-tx

 endif

 

 .PHONY: FORCE check-symbols check-security

@@ -246,7 +246,7 @@ libbitcoin_wallet_a_SOURCES = \

   $(BITCOIN_CORE_H)

 

 # crypto primitives library

-crypto_libbitcoin_crypto_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_CONFIG_INCLUDES)

+crypto_libbitcoin_crypto_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_CONFIG_INCLUDES) $(SSL_CFLAGS)

 crypto_libbitcoin_crypto_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)

 crypto_libbitcoin_crypto_a_SOURCES = \

   crypto/aes.cpp \

@@ -260,6 +260,9 @@ crypto_libbitcoin_crypto_a_SOURCES = \

   crypto/hmac_sha512.h \

   crypto/ripemd160.cpp \

   crypto/ripemd160.h \

+  crypto/scrypt.cpp \

+  crypto/scrypt-sse2.cpp \

+  crypto/scrypt.h \

   crypto/sha1.cpp \

   crypto/sha1.h \

   crypto/sha256.cpp \

@@ -367,16 +370,16 @@ nodist_libbitcoin_util_a_SOURCES = $(srcdir)/obj/build.h

 #

 

 # bitcoind binary #

-bitcoind_SOURCES = bitcoind.cpp

-bitcoind_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES)

-bitcoind_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)

-bitcoind_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS)

+litecoind_SOURCES = bitcoind.cpp

+litecoind_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES)

+litecoind_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)

+litecoind_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS)

 

 if TARGET_WINDOWS

-bitcoind_SOURCES += bitcoind-res.rc

+litecoind_SOURCES += bitcoind-res.rc

 endif

 

-bitcoind_LDADD = \

+litecoind_LDADD = \

   $(LIBBITCOIN_SERVER) \

   $(LIBBITCOIN_COMMON) \

   $(LIBUNIVALUE) \

@@ -390,38 +393,38 @@ bitcoind_LDADD = \

   $(LIBMEMENV) \

   $(LIBSECP256K1)

 

-bitcoind_LDADD += $(BOOST_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) $(ZMQ_LIBS)

+litecoind_LDADD += $(BOOST_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) $(ZMQ_LIBS)

 

 # bitcoin-cli binary #

-bitcoin_cli_SOURCES = bitcoin-cli.cpp

-bitcoin_cli_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(EVENT_CFLAGS)

-bitcoin_cli_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)

-bitcoin_cli_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS)

+litecoin_cli_SOURCES = bitcoin-cli.cpp

+litecoin_cli_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(EVENT_CFLAGS)

+litecoin_cli_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)

+litecoin_cli_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS)

 

 if TARGET_WINDOWS

-bitcoin_cli_SOURCES += bitcoin-cli-res.rc

+litecoin_cli_SOURCES += bitcoin-cli-res.rc

 endif

 

-bitcoin_cli_LDADD = \

+litecoin_cli_LDADD = \

   $(LIBBITCOIN_CLI) \

   $(LIBUNIVALUE) \

   $(LIBBITCOIN_UTIL) \

   $(LIBBITCOIN_CRYPTO)

 

-bitcoin_cli_LDADD += $(BOOST_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(EVENT_LIBS)

+litecoin_cli_LDADD += $(BOOST_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(EVENT_LIBS)

 #

 

 # bitcoin-tx binary #

-bitcoin_tx_SOURCES = bitcoin-tx.cpp

-bitcoin_tx_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES)

-bitcoin_tx_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)

-bitcoin_tx_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS)

+litecoin_tx_SOURCES = bitcoin-tx.cpp

+litecoin_tx_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES)

+litecoin_tx_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)

+litecoin_tx_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS)

 

 if TARGET_WINDOWS

-bitcoin_tx_SOURCES += bitcoin-tx-res.rc

+litecoin_tx_SOURCES += bitcoin-tx-res.rc

 endif

 

-bitcoin_tx_LDADD = \

+litecoin_tx_LDADD = \

   $(LIBUNIVALUE) \

   $(LIBBITCOIN_COMMON) \

   $(LIBBITCOIN_UTIL) \

@@ -429,7 +432,7 @@ bitcoin_tx_LDADD = \

   $(LIBBITCOIN_CRYPTO) \

   $(LIBSECP256K1)

 

-bitcoin_tx_LDADD += $(BOOST_LIBS) $(CRYPTO_LIBS)

+litecoin_tx_LDADD += $(BOOST_LIBS) $(CRYPTO_LIBS)

 #

 

 # bitcoinconsensus library #

@@ -442,8 +445,8 @@ if GLIBC_BACK_COMPAT

 endif

 

 libbitcoinconsensus_la_LDFLAGS = $(AM_LDFLAGS) -no-undefined $(RELDFLAGS)

-libbitcoinconsensus_la_LIBADD = $(LIBSECP256K1)

-libbitcoinconsensus_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(builddir)/obj -I$(srcdir)/secp256k1/include -DBUILD_BITCOIN_INTERNAL

+libbitcoinconsensus_la_LIBADD = $(LIBSECP256K1) $(CRYPTO_LIBS)

+libbitcoinconsensus_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(builddir)/obj -I$(srcdir)/secp256k1/include -DBUILD_BITCOIN_INTERNAL $(SSL_CFLAGS)

 libbitcoinconsensus_la_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)

 

 endif

--- a/src/Makefile.bench.include

+++ b/src/Makefile.bench.include

@@ -2,15 +2,15 @@

 # Distributed under the MIT software license, see the accompanying

 # file COPYING or http://www.opensource.org/licenses/mit-license.php.

 

-bin_PROGRAMS += bench/bench_bitcoin

+bin_PROGRAMS += bench/bench_litecoin

 BENCH_SRCDIR = bench

-BENCH_BINARY = bench/bench_bitcoin$(EXEEXT)

+BENCH_BINARY = bench/bench_litecoin$(EXEEXT)

 

 RAW_TEST_FILES = \

   bench/data/block413567.raw

 GENERATED_TEST_FILES = $(RAW_TEST_FILES:.raw=.raw.h)

 

-bench_bench_bitcoin_SOURCES = \

+bench_bench_litecoin_SOURCES = \

   bench/bench_bitcoin.cpp \

   bench/bench.cpp \

   bench/bench.h \

@@ -28,11 +28,11 @@ bench_bench_bitcoin_SOURCES = \

   bench/perf.h \

   bench/prevector_destructor.cpp

 

-nodist_bench_bench_bitcoin_SOURCES = $(GENERATED_TEST_FILES)

+nodist_bench_bench_litecoin_SOURCES = $(GENERATED_TEST_FILES)

 

-bench_bench_bitcoin_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(EVENT_CLFAGS) $(EVENT_PTHREADS_CFLAGS) -I$(builddir)/bench/

-bench_bench_bitcoin_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)

-bench_bench_bitcoin_LDADD = \

+bench_bench_litecoin_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(EVENT_CLFAGS) $(EVENT_PTHREADS_CFLAGS) -I$(builddir)/bench/

+bench_bench_litecoin_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)

+bench_bench_litecoin_LDADD = \

   $(LIBBITCOIN_SERVER) \

   $(LIBBITCOIN_COMMON) \

   $(LIBBITCOIN_UTIL) \

@@ -45,16 +45,16 @@ bench_bench_bitcoin_LDADD = \

   $(LIBUNIVALUE)

 

 if ENABLE_ZMQ

-bench_bench_bitcoin_LDADD += $(LIBBITCOIN_ZMQ) $(ZMQ_LIBS)

+bench_bench_litecoin_LDADD += $(LIBBITCOIN_ZMQ) $(ZMQ_LIBS)

 endif

 

 if ENABLE_WALLET

-bench_bench_bitcoin_SOURCES += bench/coin_selection.cpp

-bench_bench_bitcoin_LDADD += $(LIBBITCOIN_WALLET) $(LIBBITCOIN_CRYPTO)

+bench_bench_litecoin_SOURCES += bench/coin_selection.cpp

+bench_bench_litecoin_LDADD += $(LIBBITCOIN_WALLET) $(LIBBITCOIN_CRYPTO)

 endif

 

-bench_bench_bitcoin_LDADD += $(BOOST_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS)

-bench_bench_bitcoin_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS)

+bench_bench_litecoin_LDADD += $(BOOST_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS)

+bench_bench_litecoin_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS)

 

 CLEAN_BITCOIN_BENCH = bench/*.gcda bench/*.gcno $(GENERATED_TEST_FILES)

 

--- a/src/addrman.h

+++ b/src/addrman.h

@@ -472,8 +472,6 @@ public:

         nTried = 0;

         nNew = 0;

         nLastGood = 1; //Initially at 1 so that "never" is strictly worse.

-        mapInfo.clear();

-        mapAddr.clear();

     }

 

     CAddrMan()

--- a/src/amount.h

+++ b/src/amount.h

@@ -23,7 +23,7 @@ static const CAmount CENT = 1000000;

  * critical; in unusual circumstances like a(nother) overflow bug that allowed

  * for the creation of coins out of thin air modification could lead to a fork.

  * */

-static const CAmount MAX_MONEY = 21000000 * COIN;

+static const CAmount MAX_MONEY = 84000000 * COIN;

 inline bool MoneyRange(const CAmount& nValue) { return (nValue >= 0 && nValue <= MAX_MONEY); }

 

 #endif //  BITCOIN_AMOUNT_H

--- a/src/base58.cpp

+++ b/src/base58.cpp

@@ -216,12 +216,18 @@ class CBitcoinAddressVisitor : public boost::static_visitor<bool>

 {

 private:

     CBitcoinAddress* addr;

+    CChainParams::Base58Type script_type_;

 

 public:

-    CBitcoinAddressVisitor(CBitcoinAddress* addrIn) : addr(addrIn) {}

+    CBitcoinAddressVisitor(CBitcoinAddress* addrIn, CChainParams::Base58Type script_type) 

+      : addr(addrIn), script_type_(script_type) 

+    {

+        assert(script_type == CChainParams::SCRIPT_ADDRESS || 

+               script_type == CChainParams::SCRIPT_ADDRESS2);

+    }

 

     bool operator()(const CKeyID& id) const { return addr->Set(id); }

-    bool operator()(const CScriptID& id) const { return addr->Set(id); }

+    bool operator()(const CScriptID& id) const { return addr->Set(id, script_type_); }

     bool operator()(const CNoDestination& no) const { return false; }

 };

 

@@ -233,15 +239,17 @@ bool CBitcoinAddress::Set(const CKeyID& id)

     return true;

 }

 

-bool CBitcoinAddress::Set(const CScriptID& id)

+bool CBitcoinAddress::Set(const CScriptID& id, CChainParams::Base58Type type)

 {

-    SetData(Params().Base58Prefix(CChainParams::SCRIPT_ADDRESS), &id, 20);

+    assert(type == CChainParams::SCRIPT_ADDRESS || type == CChainParams::SCRIPT_ADDRESS2);

+    SetData(Params().Base58Prefix(type), &id, 20);

     return true;

 }

 

-bool CBitcoinAddress::Set(const CTxDestination& dest)

+bool CBitcoinAddress::Set(const CTxDestination& dest, CChainParams::Base58Type type)

 {

-    return boost::apply_visitor(CBitcoinAddressVisitor(this), dest);

+    assert(type == CChainParams::SCRIPT_ADDRESS || type == CChainParams::SCRIPT_ADDRESS2);

+    return boost::apply_visitor(CBitcoinAddressVisitor(this, type), dest);

 }

 

 bool CBitcoinAddress::IsValid() const

@@ -253,7 +261,8 @@ bool CBitcoinAddress::IsValid(const CChainParams& params) const

 {

     bool fCorrectSize = vchData.size() == 20;

     bool fKnownVersion = vchVersion == params.Base58Prefix(CChainParams::PUBKEY_ADDRESS) ||

-                         vchVersion == params.Base58Prefix(CChainParams::SCRIPT_ADDRESS);

+                         vchVersion == params.Base58Prefix(CChainParams::SCRIPT_ADDRESS) ||

+                         vchVersion == params.Base58Prefix(CChainParams::SCRIPT_ADDRESS2);

     return fCorrectSize && fKnownVersion;

 }

 

@@ -265,7 +274,8 @@ CTxDestination CBitcoinAddress::Get() const

     memcpy(&id, vchData.data(), 20);

     if (vchVersion == Params().Base58Prefix(CChainParams::PUBKEY_ADDRESS))

         return CKeyID(id);

-    else if (vchVersion == Params().Base58Prefix(CChainParams::SCRIPT_ADDRESS))

+    else if (vchVersion == Params().Base58Prefix(CChainParams::SCRIPT_ADDRESS) ||

+             vchVersion == Params().Base58Prefix(CChainParams::SCRIPT_ADDRESS2))

         return CScriptID(id);

     else

         return CNoDestination();

@@ -283,7 +293,8 @@ bool CBitcoinAddress::GetKeyID(CKeyID& keyID) const

 

 bool CBitcoinAddress::IsScript() const

 {

-    return IsValid() && vchVersion == Params().Base58Prefix(CChainParams::SCRIPT_ADDRESS);

+    return IsValid() && (vchVersion == Params().Base58Prefix(CChainParams::SCRIPT_ADDRESS) ||

+                         vchVersion == Params().Base58Prefix(CChainParams::SCRIPT_ADDRESS2));

 }

 

 void CBitcoinSecret::SetKey(const CKey& vchSecret)

--- a/src/base58.h

+++ b/src/base58.h

@@ -104,8 +104,8 @@ public:

 class CBitcoinAddress : public CBase58Data {

 public:

     bool Set(const CKeyID &id);

-    bool Set(const CScriptID &id);

-    bool Set(const CTxDestination &dest);

+    bool Set(const CScriptID &id, CChainParams::Base58Type type=CChainParams::SCRIPT_ADDRESS2);

+    bool Set(const CTxDestination &dest, CChainParams::Base58Type type=CChainParams::SCRIPT_ADDRESS2);

     bool IsValid() const;

     bool IsValid(const CChainParams &params) const;

 

--- a/src/bench/.gitignore

+++ b/src/bench/.gitignore

@@ -1 +1 @@

-bench_bitcoin

+bench_litecoin

--- a/src/bench/checkblock.cpp

+++ b/src/bench/checkblock.cpp

@@ -17,6 +17,9 @@ namespace block_bench {

 // a block off the wire, but before we can relay the block on to peers using

 // compact block relay.

 

+// Litecoin uses block height 878439, hash 0babe680f55a55d54339511226755f0837261da89a4e78eba4d6436a63026df8

+// which contains 3808 transactions.

+

 static void DeserializeBlockTest(benchmark::State& state)

 {

     CDataStream stream((const char*)block_bench::block413567,

--- a/src/bitcoin-cli-res.rc

+++ b/src/bitcoin-cli-res.rc

@@ -16,14 +16,14 @@ BEGIN

     BEGIN

         BLOCK "040904E4" // U.S. English - multilingual (hex)

         BEGIN

-            VALUE "CompanyName",        "Bitcoin"

-            VALUE "FileDescription",    "bitcoin-cli (JSON-RPC client for " PACKAGE_NAME ")"

+            VALUE "CompanyName",        "Litecoin"

+            VALUE "FileDescription",    "litecoin-cli (JSON-RPC client for " PACKAGE_NAME ")"

             VALUE "FileVersion",        VER_FILEVERSION_STR

-            VALUE "InternalName",       "bitcoin-cli"

+            VALUE "InternalName",       "litecoin-cli"

             VALUE "LegalCopyright",     COPYRIGHT_STR

             VALUE "LegalTrademarks1",   "Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php."

-            VALUE "OriginalFilename",   "bitcoin-cli.exe"

-            VALUE "ProductName",        "bitcoin-cli"

+            VALUE "OriginalFilename",   "litecoin-cli.exe"

+            VALUE "ProductName",        "litecoin-cli"

             VALUE "ProductVersion",     VER_PRODUCTVERSION_STR

         END

     END

--- a/src/bitcoin-cli.cpp

+++ b/src/bitcoin-cli.cpp

@@ -84,10 +84,10 @@ static int AppInitRPC(int argc, char* argv[])

         std::string strUsage = strprintf(_("%s RPC client version"), _(PACKAGE_NAME)) + " " + FormatFullVersion() + "\n";

         if (!gArgs.IsArgSet("-version")) {

             strUsage += "\n" + _("Usage:") + "\n" +

-                  "  bitcoin-cli [options] <command> [params]  " + strprintf(_("Send command to %s"), _(PACKAGE_NAME)) + "\n" +

-                  "  bitcoin-cli [options] -named <command> [name=value] ... " + strprintf(_("Send command to %s (with named arguments)"), _(PACKAGE_NAME)) + "\n" +

-                  "  bitcoin-cli [options] help                " + _("List commands") + "\n" +

-                  "  bitcoin-cli [options] help <command>      " + _("Get help for a command") + "\n";

+                  "  litecoin-cli [options] <command> [params]  " + strprintf(_("Send command to %s"), _(PACKAGE_NAME)) + "\n" +

+                  "  litecoin-cli [options] -named <command> [name=value] ... " + strprintf(_("Send command to %s (with named arguments)"), _(PACKAGE_NAME)) + "\n" +

+                  "  litecoin-cli [options] help                " + _("List commands") + "\n" +

+                  "  litecoin-cli [options] help <command>      " + _("Get help for a command") + "\n";

 

             strUsage += "\n" + HelpMessageCli();

         }

--- a/src/bitcoin-tx-res.rc

+++ b/src/bitcoin-tx-res.rc

@@ -16,14 +16,14 @@ BEGIN

     BEGIN

         BLOCK "040904E4" // U.S. English - multilingual (hex)

         BEGIN

-            VALUE "CompanyName",        "Bitcoin"

-            VALUE "FileDescription",    "bitcoin-tx (CLI Bitcoin transaction editor utility)"

+            VALUE "CompanyName",        "Litecoin"

+            VALUE "FileDescription",    "litecoin-tx (CLI Litecoin transaction editor utility)"

             VALUE "FileVersion",        VER_FILEVERSION_STR

-            VALUE "InternalName",       "bitcoin-tx"

+            VALUE "InternalName",       "litecoin-tx"

             VALUE "LegalCopyright",     COPYRIGHT_STR

             VALUE "LegalTrademarks1",   "Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php."

-            VALUE "OriginalFilename",   "bitcoin-tx.exe"

-            VALUE "ProductName",        "bitcoin-tx"

+            VALUE "OriginalFilename",   "litecoin-tx.exe"

+            VALUE "ProductName",        "litecoin-tx"

             VALUE "ProductVersion",     VER_PRODUCTVERSION_STR

         END

     END

--- a/src/bitcoin-tx.cpp

+++ b/src/bitcoin-tx.cpp

@@ -54,10 +54,10 @@ static int AppInitRawTx(int argc, char* argv[])

     if (argc<2 || gArgs.IsArgSet("-?") || gArgs.IsArgSet("-h") || gArgs.IsArgSet("-help"))

     {

         // First part of help message is specific to this utility

-        std::string strUsage = strprintf(_("%s bitcoin-tx utility version"), _(PACKAGE_NAME)) + " " + FormatFullVersion() + "\n\n" +

+        std::string strUsage = strprintf(_("%s litecoin-tx utility version"), _(PACKAGE_NAME)) + " " + FormatFullVersion() + "\n\n" +

             _("Usage:") + "\n" +

-              "  bitcoin-tx [options] <hex-tx> [commands]  " + _("Update hex-encoded bitcoin transaction") + "\n" +

-              "  bitcoin-tx [options] -create [commands]   " + _("Create hex-encoded bitcoin transaction") + "\n" +

+              "  litecoin-tx [options] <hex-tx> [commands]  " + _("Update hex-encoded litecoin transaction") + "\n" +

+              "  litecoin-tx [options] -create [commands]   " + _("Create hex-encoded litecoin transaction") + "\n" +

               "\n";

 

         fprintf(stdout, "%s", strUsage.c_str());

@@ -310,9 +310,6 @@ static void MutateTxAddOutPubKey(CMutableTransaction& tx, const std::string& str

     }

 

     if (bSegWit) {

-        if (!pubkey.IsCompressed()) {

-            throw std::runtime_error("Uncompressed pubkeys are not useable for SegWit outputs");

-        }

         // Call GetScriptForWitness() to build a P2WSH scriptPubKey

         scriptPubKey = GetScriptForWitness(scriptPubKey);

     }

@@ -380,19 +377,10 @@ static void MutateTxAddOutMultiSig(CMutableTransaction& tx, const std::string& s

     CScript scriptPubKey = GetScriptForMultisig(required, pubkeys);

 

     if (bSegWit) {

-        for (CPubKey& pubkey : pubkeys) {

-            if (!pubkey.IsCompressed()) {

-                throw std::runtime_error("Uncompressed pubkeys are not useable for SegWit outputs");

-            }

-        }

         // Call GetScriptForWitness() to build a P2WSH scriptPubKey

         scriptPubKey = GetScriptForWitness(scriptPubKey);

     }

     if (bScriptHash) {

-        if (scriptPubKey.size() > MAX_SCRIPT_ELEMENT_SIZE) {

-            throw std::runtime_error(strprintf(

-                        "redeemScript exceeds size limit: %d > %d", scriptPubKey.size(), MAX_SCRIPT_ELEMENT_SIZE));

-        }

         // Get the address for the redeem script, then call

         // GetScriptForDestination() to construct a P2SH scriptPubKey.

         CBitcoinAddress addr(scriptPubKey);

@@ -455,19 +443,10 @@ static void MutateTxAddOutScript(CMutableTransaction& tx, const std::string& str

         bScriptHash = (flags.find("S") != std::string::npos);

     }

 

-    if (scriptPubKey.size() > MAX_SCRIPT_SIZE) {

-        throw std::runtime_error(strprintf(

-                    "script exceeds size limit: %d > %d", scriptPubKey.size(), MAX_SCRIPT_SIZE));

-    }

-

     if (bSegWit) {

       scriptPubKey = GetScriptForWitness(scriptPubKey);

     }

     if (bScriptHash) {

-        if (scriptPubKey.size() > MAX_SCRIPT_ELEMENT_SIZE) {

-            throw std::runtime_error(strprintf(

-                        "redeemScript exceeds size limit: %d > %d", scriptPubKey.size(), MAX_SCRIPT_ELEMENT_SIZE));

-        }

       CBitcoinAddress addr(scriptPubKey);

       scriptPubKey = GetScriptForDestination(addr.Get());

     }

--- a/src/bitcoind-res.rc

+++ b/src/bitcoind-res.rc

@@ -16,14 +16,14 @@ BEGIN

     BEGIN

         BLOCK "040904E4" // U.S. English - multilingual (hex)

         BEGIN

-            VALUE "CompanyName",        "Bitcoin"

-            VALUE "FileDescription",    "bitcoind (Bitcoin node with a JSON-RPC server)"

+            VALUE "CompanyName",        "Litecoin"

+            VALUE "FileDescription",    "litecoind (Litecoin node with a JSON-RPC server)"

             VALUE "FileVersion",        VER_FILEVERSION_STR

-            VALUE "InternalName",       "bitcoind"

+            VALUE "InternalName",       "litecoind"

             VALUE "LegalCopyright",     COPYRIGHT_STR

             VALUE "LegalTrademarks1",   "Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php."

-            VALUE "OriginalFilename",   "bitcoind.exe"

-            VALUE "ProductName",        "bitcoind"

+            VALUE "OriginalFilename",   "litecoind.exe"

+            VALUE "ProductName",        "litecoind"

             VALUE "ProductVersion",     VER_PRODUCTVERSION_STR

         END

     END

--- a/src/bitcoind.cpp

+++ b/src/bitcoind.cpp

@@ -85,7 +85,7 @@ bool AppInit(int argc, char* argv[])

         else

         {

             strUsage += "\n" + _("Usage:") + "\n" +

-                  "  bitcoind [options]                     " + strprintf(_("Start %s Daemon"), _(PACKAGE_NAME)) + "\n";

+                  "  litecoind [options]                     " + strprintf(_("Start %s Daemon"), _(PACKAGE_NAME)) + "\n";

 

             strUsage += "\n" + HelpMessage(HMM_BITCOIND);

         }

@@ -119,7 +119,7 @@ bool AppInit(int argc, char* argv[])

         // Error out when loose non-argument tokens are encountered on command line

         for (int i = 1; i < argc; i++) {

             if (!IsSwitchChar(argv[i][0])) {

-                fprintf(stderr, "Error: Command line contains unexpected token '%s', see bitcoind -h for a list of options.\n", argv[i]);

+                fprintf(stderr, "Error: Command line contains unexpected token '%s', see litecoind -h for a list of options.\n", argv[i]);

                 exit(EXIT_FAILURE);

             }

         }

@@ -147,7 +147,7 @@ bool AppInit(int argc, char* argv[])

         if (gArgs.GetBoolArg("-daemon", false))

         {

 #if HAVE_DECL_DAEMON

-            fprintf(stdout, "Bitcoin server starting\n");

+            fprintf(stdout, "Litecoin server starting\n");

 

             // Daemonize

             if (daemon(1, 0)) { // don't chdir (1), do close FDs (0)

--- a/src/chain.h

+++ b/src/chain.h

@@ -294,6 +294,11 @@ public:

         return *phashBlock;

     }

 

+    uint256 GetBlockPoWHash() const

+    {

+        return GetBlockHeader().GetPoWHash();

+    }

+

     int64_t GetBlockTime() const

     {

         return (int64_t)nTime;

--- a/src/chainparams.cpp

+++ b/src/chainparams.cpp

@@ -1,5 +1,5 @@

 // Copyright (c) 2010 Satoshi Nakamoto

-// Copyright (c) 2009-2016 The Bitcoin Core developers

+// Copyright (c) 2009-2015 The Bitcoin Core developers

 // Distributed under the MIT software license, see the accompanying

 // file COPYING or http://www.opensource.org/licenses/mit-license.php.

 

@@ -48,8 +48,8 @@ static CBlock CreateGenesisBlock(const char* pszTimestamp, const CScript& genesi

  */

 static CBlock CreateGenesisBlock(uint32_t nTime, uint32_t nNonce, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward)

 {

-    const char* pszTimestamp = "The Times 03/Jan/2009 Chancellor on brink of second bailout for banks";

-    const CScript genesisOutputScript = CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG;

+    const char* pszTimestamp = "NY Times 05/Oct/2011 Steve Jobs, Apple’s Visionary, Dies at 56";

+    const CScript genesisOutputScript = CScript() << ParseHex("040184710fa689ad5023690c80f3a49c8f13f8d45b8c857fbcbc8bc4a8e4d3eb4b10f4d4604fa08dce601aaf0f470216fe1b51850b4acf21b179c45070ac7b03a9") << OP_CHECKSIG;

     return CreateGenesisBlock(pszTimestamp, genesisOutputScript, nTime, nNonce, nBits, nVersion, genesisReward);

 }

 

@@ -74,66 +74,66 @@ class CMainParams : public CChainParams {

 public:

     CMainParams() {

         strNetworkID = "main";

-        consensus.nSubsidyHalvingInterval = 210000;

-        consensus.BIP34Height = 227931;

-        consensus.BIP34Hash = uint256S("0x000000000000024b89b42a942fe0d9fea3bb44ab7bd1b19115dd6a759c0808b8");

-        consensus.BIP65Height = 388381; // 000000000000000004c2b624ed5d7756c508d90fd0da2c7c679febfa6c4735f0

-        consensus.BIP66Height = 363725; // 00000000000000000379eaa19dce8c9b722d46ae6a57c2f1a988119488b50931

-        consensus.powLimit = uint256S("00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff");

-        consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; // two weeks

-        consensus.nPowTargetSpacing = 10 * 60;

+        consensus.nSubsidyHalvingInterval = 840000;

+        consensus.BIP34Height = 710000;

+        consensus.BIP34Hash = uint256S("fa09d204a83a768ed5a7c8d441fa62f2043abf420cff1226c7b4329aeb9d51cf");

+        consensus.BIP65Height = 918684; // bab3041e8977e0dc3eeff63fe707b92bde1dd449d8efafb248c27c8264cc311a

+        consensus.BIP66Height = 811879; // 7aceee012833fa8952f8835d8b1b3ae233cd6ab08fdb27a771d2bd7bdc491894

+        consensus.powLimit = uint256S("00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); 

+        consensus.nPowTargetTimespan = 3.5 * 24 * 60 * 60; // 3.5 days

+        consensus.nPowTargetSpacing = 2.5 * 60;

         consensus.fPowAllowMinDifficultyBlocks = false;

         consensus.fPowNoRetargeting = false;

-        consensus.nRuleChangeActivationThreshold = 1916; // 95% of 2016

-        consensus.nMinerConfirmationWindow = 2016; // nPowTargetTimespan / nPowTargetSpacing

+        consensus.nRuleChangeActivationThreshold = 6048; // 75% of 8064

+        consensus.nMinerConfirmationWindow = 8064; // nPowTargetTimespan / nPowTargetSpacing * 4

         consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].bit = 28;

         consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nStartTime = 1199145601; // January 1, 2008

         consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = 1230767999; // December 31, 2008

 

         // Deployment of BIP68, BIP112, and BIP113.

         consensus.vDeployments[Consensus::DEPLOYMENT_CSV].bit = 0;

-        consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nStartTime = 1462060800; // May 1st, 2016

-        consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nTimeout = 1493596800; // May 1st, 2017

+        consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nStartTime = 1485561600; // January 28, 2017

+        consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nTimeout = 1517356801; // January 31st, 2018

 

         // Deployment of SegWit (BIP141, BIP143, and BIP147)

         consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].bit = 1;

-        consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].nStartTime = 1479168000; // November 15th, 2016.

-        consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].nTimeout = 1510704000; // November 15th, 2017.

+        consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].nStartTime = 1485561600; // January 28, 2017

+        consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].nTimeout = 1517356801; // January 31st, 2018

 

         // The best chain should have at least this much work.

-        consensus.nMinimumChainWork = uint256S("0x000000000000000000000000000000000000000000723d3581fe1bd55373540a");

+        consensus.nMinimumChainWork = uint256S("0x00000000000000000000000000000000000000000000000ba50a60f8b56c7fe0");

 

         // By default assume that the signatures in ancestors of this block are valid.

-        consensus.defaultAssumeValid = uint256S("0x0000000000000000003b9ce759c2a087d52abc4266f8f4ebd6d768b89defa50a"); //477890

+        consensus.defaultAssumeValid = uint256S("0x29c8c00e1a5f446a6364a29633d3f1ee16428d87c8d3851a1c570be8170b04c2"); //1259849

 

         /**

          * The message start string is designed to be unlikely to occur in normal data.

          * The characters are rarely used upper ASCII, not valid as UTF-8, and produce

          * a large 32-bit integer with any alignment.

          */

-        pchMessageStart[0] = 0xf9;

-        pchMessageStart[1] = 0xbe;

-        pchMessageStart[2] = 0xb4;

-        pchMessageStart[3] = 0xd9;

-        nDefaultPort = 8333;

+        pchMessageStart[0] = 0xfb;

+        pchMessageStart[1] = 0xc0;

+        pchMessageStart[2] = 0xb6;

+        pchMessageStart[3] = 0xdb;

+        nDefaultPort = 9333;

         nPruneAfterHeight = 100000;

 

-        genesis = CreateGenesisBlock(1231006505, 2083236893, 0x1d00ffff, 1, 50 * COIN);

+        genesis = CreateGenesisBlock(1317972665, 2084524493, 0x1e0ffff0, 1, 50 * COIN);

         consensus.hashGenesisBlock = genesis.GetHash();

-        assert(consensus.hashGenesisBlock == uint256S("0x000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"));

-        assert(genesis.hashMerkleRoot == uint256S("0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"));

+        assert(consensus.hashGenesisBlock == uint256S("0x12a765e31ffd4059bada1e25190f6e98c99d9714d334efa41a195a7e7e04bfe2"));

+        assert(genesis.hashMerkleRoot == uint256S("0x97ddfbbae6be97fd6cdf3e7ca13232a3afff2353e29badfab7f73011edd4ced9"));

 

         // Note that of those with the service bits flag, most only support a subset of possible options

-        vSeeds.emplace_back("seed.bitcoin.sipa.be", true); // Pieter Wuille, only supports x1, x5, x9, and xd

-        vSeeds.emplace_back("dnsseed.bluematt.me", true); // Matt Corallo, only supports x9

-        vSeeds.emplace_back("dnsseed.bitcoin.dashjr.org", false); // Luke Dashjr

-        vSeeds.emplace_back("seed.bitcoinstats.com", true); // Christian Decker, supports x1 - xf

-        vSeeds.emplace_back("seed.bitcoin.jonasschnelli.ch", true); // Jonas Schnelli, only supports x1, x5, x9, and xd

-        vSeeds.emplace_back("seed.btc.petertodd.org", true); // Peter Todd, only supports x1, x5, x9, and xd

-

-        base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1,0);

+        vSeeds.emplace_back("seed-a.litecoin.loshan.co.uk", true);

+        vSeeds.emplace_back("dnsseed.thrasher.io", true);

+        vSeeds.emplace_back("dnsseed.litecointools.com", true);

+        vSeeds.emplace_back("dnsseed.litecoinpool.org", true);

+        vSeeds.emplace_back("dnsseed.koin-project.com", false);

+

+        base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1,48);

         base58Prefixes[SCRIPT_ADDRESS] = std::vector<unsigned char>(1,5);

-        base58Prefixes[SECRET_KEY] =     std::vector<unsigned char>(1,128);

+        base58Prefixes[SCRIPT_ADDRESS2] = std::vector<unsigned char>(1,50);

+        base58Prefixes[SECRET_KEY] =     std::vector<unsigned char>(1,176);

         base58Prefixes[EXT_PUBLIC_KEY] = {0x04, 0x88, 0xB2, 0x1E};

         base58Prefixes[EXT_SECRET_KEY] = {0x04, 0x88, 0xAD, 0xE4};

 

@@ -145,28 +145,31 @@ public:

 

         checkpointData = (CCheckpointData) {

             {

-                { 11111, uint256S("0x0000000069e244f73d78e8fd29ba2fd2ed618bd6fa2ee92559f542fdb26e7c1d")},

-                { 33333, uint256S("0x000000002dd5588a74784eaa7ab0507a18ad16a236e7b1ce69f00d7ddfb5d0a6")},

-                { 74000, uint256S("0x0000000000573993a3c9e41ce34471c079dcf5f52a0e824a81e7f953b8661a20")},

-                {105000, uint256S("0x00000000000291ce28027faea320c8d2b054b2e0fe44a773f3eefb151d6bdc97")},

-                {134444, uint256S("0x00000000000005b12ffd4cd315cd34ffd4a594f430ac814c91184a0d42d2b0fe")},

-                {168000, uint256S("0x000000000000099e61ea72015e79632f216fe6cb33d7899acb35b75c8303b763")},

-                {193000, uint256S("0x000000000000059f452a5f7340de6682a977387c17010ff6e6c3bd83ca8b1317")},

-                {210000, uint256S("0x000000000000048b95347e83192f69cf0366076336c639f9b7228e9ba171342e")},

-                {216116, uint256S("0x00000000000001b4f4b433e81ee46494af945cf96014816a4e2370f11b23df4e")},

-                {225430, uint256S("0x00000000000001c108384350f74090433e7fcf79a606b8e797f065b130575932")},

-                {250000, uint256S("0x000000000000003887df1f29024b06fc2200b55f8af8f35453d7be294df2d214")},

-                {279000, uint256S("0x0000000000000001ae8c72a0b0c301f67e3afca10e819efa9041e458e9bd7e40")},

-                {295000, uint256S("0x00000000000000004d9b4ef50f0f9d686fd69db2e03af35a100370c64632a983")},

+                {  1500, uint256S("0x841a2965955dd288cfa707a755d05a54e45f8bd476835ec9af4402a2b59a2967")},

+                {  4032, uint256S("0x9ce90e427198fc0ef05e5905ce3503725b80e26afd35a987965fd7e3d9cf0846")},

+                {  8064, uint256S("0xeb984353fc5190f210651f150c40b8a4bab9eeeff0b729fcb3987da694430d70")},

+                { 16128, uint256S("0x602edf1859b7f9a6af809f1d9b0e6cb66fdc1d4d9dcd7a4bec03e12a1ccd153d")},

+                { 23420, uint256S("0xd80fdf9ca81afd0bd2b2a90ac3a9fe547da58f2530ec874e978fce0b5101b507")},

+                { 50000, uint256S("0x69dc37eb029b68f075a5012dcc0419c127672adb4f3a32882b2b3e71d07a20a6")},

+                { 80000, uint256S("0x4fcb7c02f676a300503f49c764a89955a8f920b46a8cbecb4867182ecdb2e90a")},

+                {120000, uint256S("0xbd9d26924f05f6daa7f0155f32828ec89e8e29cee9e7121b026a7a3552ac6131")},

+                {161500, uint256S("0xdbe89880474f4bb4f75c227c77ba1cdc024991123b28b8418dbbf7798471ff43")},

+                {179620, uint256S("0x2ad9c65c990ac00426d18e446e0fd7be2ffa69e9a7dcb28358a50b2b78b9f709")},

+                {240000, uint256S("0x7140d1c4b4c2157ca217ee7636f24c9c73db39c4590c4e6eab2e3ea1555088aa")},

+                {383640, uint256S("0x2b6809f094a9215bafc65eb3f110a35127a34be94b7d0590a096c3f126c6f364")},

+                {409004, uint256S("0x487518d663d9f1fa08611d9395ad74d982b667fbdc0e77e9cf39b4f1355908a3")},

+                {456000, uint256S("0xbf34f71cc6366cd487930d06be22f897e34ca6a40501ac7d401be32456372004")},

+                {638902, uint256S("0x15238656e8ec63d28de29a8c75fcf3a5819afc953dcd9cc45cecc53baec74f38")},

+                {721000, uint256S("0x198a7b4de1df9478e2463bd99d75b714eab235a2e63e741641dc8a759a9840e5")},

             }

         };

 

         chainTxData = ChainTxData{

-            // Data as of block 000000000000000000d97e53664d17967bd4ee50b23abb92e54a34eb222d15ae (height 478913).

-            1501801925, // * UNIX timestamp of last known number of transactions

-            243756039,  // * total number of transactions between genesis and that timestamp

-                        //   (the tx=... number in the SetBestChain debug.log lines)

-            3.1         // * estimated number of transactions per second after that timestamp

+            // Data as of block db42d00d824950a125f9b08b6b6c282c484781562fa8b3bd29d6ce4a2627c348 (height 1259851).

+            1502955334, // * UNIX timestamp of last known number of transactions

+            11428845,  // * total number of transactions between genesis and that timestamp

+                    //   (the tx=... number in the SetBestChain debug.log lines)

+            0.06     // * estimated number of transactions per second after that timestamp

         };

     }

 };

@@ -178,14 +181,14 @@ class CTestNetParams : public CChainParams {

 public:

     CTestNetParams() {

         strNetworkID = "test";

-        consensus.nSubsidyHalvingInterval = 210000;

-        consensus.BIP34Height = 21111;

-        consensus.BIP34Hash = uint256S("0x0000000023b3a96d3484e5abb3755c413e7d41500f8e2a5c3f0dd01299cd8ef8");

-        consensus.BIP65Height = 581885; // 00000000007f6655f22f98e72ed80d8b06dc761d5da09df0fa1dc4be4f861eb6

-        consensus.BIP66Height = 330776; // 000000002104c8c45e99a8853285a3b592602a3ccde2b832481da85e9e4ba182

-        consensus.powLimit = uint256S("00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff");

-        consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; // two weeks

-        consensus.nPowTargetSpacing = 10 * 60;

+        consensus.nSubsidyHalvingInterval = 840000;

+        consensus.BIP34Height = 76;

+        consensus.BIP34Hash = uint256S("8075c771ed8b495ffd943980a95f702ab34fce3c8c54e379548bda33cc8c0573");

+        consensus.BIP65Height = 76; // 8075c771ed8b495ffd943980a95f702ab34fce3c8c54e379548bda33cc8c0573

+        consensus.BIP66Height = 76; // 8075c771ed8b495ffd943980a95f702ab34fce3c8c54e379548bda33cc8c0573

+        consensus.powLimit = uint256S("00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");

+        consensus.nPowTargetTimespan = 3.5 * 24 * 60 * 60; // 3.5 days

+        consensus.nPowTargetSpacing = 2.5 * 60;

         consensus.fPowAllowMinDifficultyBlocks = true;

         consensus.fPowNoRetargeting = false;

         consensus.nRuleChangeActivationThreshold = 1512; // 75% for testchains

@@ -196,41 +199,42 @@ public:

 

         // Deployment of BIP68, BIP112, and BIP113.

         consensus.vDeployments[Consensus::DEPLOYMENT_CSV].bit = 0;

-        consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nStartTime = 1456790400; // March 1st, 2016

-        consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nTimeout = 1493596800; // May 1st, 2017

+        consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nStartTime = 1483228800; // January 1, 2017

+        consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nTimeout = 1517356801; // January 31st, 2018

 

         // Deployment of SegWit (BIP141, BIP143, and BIP147)

         consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].bit = 1;

-        consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].nStartTime = 1462060800; // May 1st 2016

-        consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].nTimeout = 1493596800; // May 1st 2017

+        consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].nStartTime = 1483228800; // January 1, 2017

+        consensus.vDeployments[Consensus::DEPLOYMENT_SEGWIT].nTimeout = 1517356801; // January 31st, 2018

 

         // The best chain should have at least this much work.

-        consensus.nMinimumChainWork = uint256S("0x00000000000000000000000000000000000000000000002830dab7f76dbb7d63");

+        consensus.nMinimumChainWork = uint256S("0x0000000000000000000000000000000000000000000000000000364b0cbc3568");

 

         // By default assume that the signatures in ancestors of this block are valid.

-        consensus.defaultAssumeValid = uint256S("0x0000000002e9e7b00e1f6dc5123a04aad68dd0f0968d8c7aa45f6640795c37b1"); //1135275

+        consensus.defaultAssumeValid = uint256S("0xad8ff6c2f5580d2b50bd881e11312425ea84fa99f322bf132beb722f97971bba"); //153490

 

-        pchMessageStart[0] = 0x0b;

-        pchMessageStart[1] = 0x11;

-        pchMessageStart[2] = 0x09;

-        pchMessageStart[3] = 0x07;

-        nDefaultPort = 18333;

+        pchMessageStart[0] = 0xfd;

+        pchMessageStart[1] = 0xd2;

+        pchMessageStart[2] = 0xc8;

+        pchMessageStart[3] = 0xf1;

+        nDefaultPort = 19335;

         nPruneAfterHeight = 1000;

 

-        genesis = CreateGenesisBlock(1296688602, 414098458, 0x1d00ffff, 1, 50 * COIN);

+        genesis = CreateGenesisBlock(1486949366, 293345, 0x1e0ffff0, 1, 50 * COIN);

         consensus.hashGenesisBlock = genesis.GetHash();

-        assert(consensus.hashGenesisBlock == uint256S("0x000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943"));

-        assert(genesis.hashMerkleRoot == uint256S("0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"));

+        assert(consensus.hashGenesisBlock == uint256S("0x4966625a4b2851d9fdee139e56211a0d88575f59ed816ff5e6a63deb4e3e29a0"));

+        assert(genesis.hashMerkleRoot == uint256S("0x97ddfbbae6be97fd6cdf3e7ca13232a3afff2353e29badfab7f73011edd4ced9"));

 

         vFixedSeeds.clear();

         vSeeds.clear();

         // nodes with support for servicebits filtering should be at the top

-        vSeeds.emplace_back("testnet-seed.bitcoin.jonasschnelli.ch", true);

-        vSeeds.emplace_back("seed.tbtc.petertodd.org", true);

-        vSeeds.emplace_back("testnet-seed.bluematt.me", false);

+        vSeeds.emplace_back("testnet-seed.litecointools.com", true);

+        vSeeds.emplace_back("seed-b.litecoin.loshan.co.uk", true);

+        vSeeds.emplace_back("dnsseed-testnet.thrasher.io", true);

 

         base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1,111);

         base58Prefixes[SCRIPT_ADDRESS] = std::vector<unsigned char>(1,196);

+        base58Prefixes[SCRIPT_ADDRESS2] = std::vector<unsigned char>(1,58);

         base58Prefixes[SECRET_KEY] =     std::vector<unsigned char>(1,239);

         base58Prefixes[EXT_PUBLIC_KEY] = {0x04, 0x35, 0x87, 0xCF};

         base58Prefixes[EXT_SECRET_KEY] = {0x04, 0x35, 0x83, 0x94};

@@ -241,18 +245,17 @@ public:

         fRequireStandard = false;

         fMineBlocksOnDemand = false;

 

-

         checkpointData = (CCheckpointData) {

             {

-                {546, uint256S("000000002a936ca763904c3c35fce2f3556c559c0214345d31b1bcebf76acb70")},

+                {2056, uint256S("17748a31ba97afdc9a4f86837a39d287e3e7c7290a08a1d816c5969c78a83289")},

             }

         };

 

         chainTxData = ChainTxData{

-            // Data as of block 00000000000001c200b9790dc637d3bb141fe77d155b966ed775b17e109f7c6c (height 1156179)

-            1501802953,

-            14706531,

-            0.15

+            // Data as of block 3351b6229da00b47ad7a8d7e1323b0e2874744b5296e3d6448293463ab758624 (height 153489)

+            1502953751,

+            382986,

+            0.01

         };

 

     }

@@ -271,8 +274,8 @@ public:

         consensus.BIP65Height = 1351; // BIP65 activated on regtest (Used in rpc activation tests)

         consensus.BIP66Height = 1251; // BIP66 activated on regtest (Used in rpc activation tests)

         consensus.powLimit = uint256S("7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");

-        consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; // two weeks

-        consensus.nPowTargetSpacing = 10 * 60;

+        consensus.nPowTargetTimespan = 3.5 * 24 * 60 * 60; // two weeks

+        consensus.nPowTargetSpacing = 2.5 * 60;

         consensus.fPowAllowMinDifficultyBlocks = true;

         consensus.fPowNoRetargeting = true;

         consensus.nRuleChangeActivationThreshold = 108; // 75% for testchains

@@ -297,24 +300,24 @@ public:

         pchMessageStart[1] = 0xbf;

         pchMessageStart[2] = 0xb5;

         pchMessageStart[3] = 0xda;

-        nDefaultPort = 18444;

+        nDefaultPort = 19444;

         nPruneAfterHeight = 1000;

 

-        genesis = CreateGenesisBlock(1296688602, 2, 0x207fffff, 1, 50 * COIN);

+        genesis = CreateGenesisBlock(1296688602, 0, 0x207fffff, 1, 50 * COIN);

         consensus.hashGenesisBlock = genesis.GetHash();

-        assert(consensus.hashGenesisBlock == uint256S("0x0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206"));

-        assert(genesis.hashMerkleRoot == uint256S("0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"));

+        assert(consensus.hashGenesisBlock == uint256S("0x530827f38f93b43ed12af0b3ad25a288dc02ed74d6d7857862df51fc56c416f9"));

+        assert(genesis.hashMerkleRoot == uint256S("0x97ddfbbae6be97fd6cdf3e7ca13232a3afff2353e29badfab7f73011edd4ced9"));

 

         vFixedSeeds.clear(); //!< Regtest mode doesn't have any fixed seeds.

         vSeeds.clear();      //!< Regtest mode doesn't have any DNS seeds.

 

         fDefaultConsistencyChecks = true;

         fRequireStandard = false;

-        fMineBlocksOnDemand = true;

+        fMineBlocksOnDemand = true; 

 

         checkpointData = (CCheckpointData) {

             {

-                {0, uint256S("0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206")},

+                {0, uint256S("530827f38f93b43ed12af0b3ad25a288dc02ed74d6d7857862df51fc56c416f9")},

             }

         };

 

@@ -326,6 +329,7 @@ public:

 

         base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1,111);

         base58Prefixes[SCRIPT_ADDRESS] = std::vector<unsigned char>(1,196);

+        base58Prefixes[SCRIPT_ADDRESS2] = std::vector<unsigned char>(1,58);

         base58Prefixes[SECRET_KEY] =     std::vector<unsigned char>(1,239);

         base58Prefixes[EXT_PUBLIC_KEY] = {0x04, 0x35, 0x87, 0xCF};

         base58Prefixes[EXT_SECRET_KEY] = {0x04, 0x35, 0x83, 0x94};

--- a/src/chainparams.h

+++ b/src/chainparams.h

@@ -50,6 +50,7 @@ public:

     enum Base58Type {

         PUBKEY_ADDRESS,

         SCRIPT_ADDRESS,

+        SCRIPT_ADDRESS2,

         SECRET_KEY,

         EXT_PUBLIC_KEY,

         EXT_SECRET_KEY,

--- a/src/chainparamsbase.cpp

+++ b/src/chainparamsbase.cpp

@@ -32,7 +32,7 @@ class CBaseMainParams : public CBaseChainParams

 public:

     CBaseMainParams()

     {

-        nRPCPort = 8332;

+        nRPCPort = 9332;

     }

 };

 

@@ -44,8 +44,8 @@ class CBaseTestNetParams : public CBaseChainParams

 public:

     CBaseTestNetParams()

     {

-        nRPCPort = 18332;

-        strDataDir = "testnet3";

+        nRPCPort = 19332;

+        strDataDir = "testnet4";

     }

 };

 

@@ -57,7 +57,7 @@ class CBaseRegTestParams : public CBaseChainParams

 public:

     CBaseRegTestParams()

     {

-        nRPCPort = 18332;

+        nRPCPort = 19332;

         strDataDir = "regtest";

     }

 };

--- a/src/chainparamsseeds.h

+++ b/src/chainparamsseeds.h

@@ -1,1472 +1,248 @@

 #ifndef BITCOIN_CHAINPARAMSSEEDS_H

 #define BITCOIN_CHAINPARAMSSEEDS_H

 /**

- * List of fixed seed nodes for the bitcoin network

+ * List of fixed seed nodes for the litecoin network

  * AUTOGENERATED by contrib/seeds/generate-seeds.py

  *

  * Each line contains a 16-byte IPv6 address and a port.

  * IPv4 as well as onion addresses are wrapped inside a IPv6 address accordingly.

  */

 static SeedSpec6 pnSeed6_main[] = {

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x02,0xe4,0x46,0xc6}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x04,0x0f,0xb4,0x1d}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x04,0x0f,0xb4,0x1e}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x02,0x43,0x6e}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x27,0xe0,0x67}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x2b,0x7c,0x9a}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xbd,0xa5,0x66}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xe2,0x95,0x91}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xe4,0x07,0x92}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xe4,0x40,0x47}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xf9,0x98,0x65}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xfe,0x7c,0x37}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xff,0x40,0xe7}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xff,0x5a,0xea}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0e,0xc0,0x08,0x1b}, 21301},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x12,0x3e,0x03,0x56}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x12,0x55,0x23,0x50}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0x1c,0x80,0x41}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0x6c,0x53,0x0c}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0xe9,0x02,0xee}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x1b,0x41,0xa8}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x38,0xf1,0xdb}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x40,0x4b,0x84}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x49,0x46,0x1a}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x79,0x9a,0x8c}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xcb,0x60,0x48}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xe1,0x22,0x3e}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xe3,0x45,0x92}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xe8,0x88,0x77}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0x10,0x7b,0xeb}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0x13,0xcd,0x35}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0x84,0x88,0x23}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0xb8,0xea,0x55}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0xd3,0x66,0xa1}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x30,0x40,0x8c}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x61,0x8d,0x74}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x78,0xa0,0x0c}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x78,0xa4,0x10}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x86,0xe2,0xb5}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x93,0x6e,0x2b}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0xc2,0x0a,0x1e}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0xf7,0x16,0x35}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x26,0x1b,0x41,0x9e}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x26,0x85,0x8d,0x22}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2b,0xf8,0xa0,0x97}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x20,0x82,0x13}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x20,0xc1,0x9d}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x2e,0xa1,0x79}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x38,0x61,0x3f}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x74,0xb2,0x4f}, 8188},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x10,0xf0,0x62}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x14,0xf6,0x64}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x15,0x61,0x87}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x3b,0x0a,0xed}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x3b,0x0d,0x3b}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x94,0x10,0xd2}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xa6,0xa0,0x60}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xbc,0x2c,0x14}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xe5,0xee,0xbb}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xe7,0x10,0x95}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x23,0xb5}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x64,0x82}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0xb8,0x81,0x5e}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0xc7,0x44,0xcc}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x1e,0x26,0xcb}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x3f,0xa2,0xf2}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x61,0x85,0xd0}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x72,0xe3,0xe0}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x33,0x0f,0x00,0x11}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x33,0xae,0x45,0xef}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x07,0x87,0x45}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x0e,0x40,0x52}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0xcc,0x69,0x19}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xff,0xa0,0x57}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3d,0x2f,0x02,0x14}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3d,0x7d,0x83,0x37}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0x2b,0x82,0xb2}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0x6a,0x10,0x6f}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0x6b,0xc8,0x1e}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0x6d,0x14,0x63}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0x85,0xc2,0x02}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0x85,0xc2,0x9c}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0xb0,0x06,0x5e}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0xb6,0xa9,0xde}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0xcd,0x84,0xf5}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0xd8,0xee,0x85}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3f,0xe7,0xef,0xd4}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x40,0x22,0xe7,0x8c}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x40,0xcb,0x66,0x56}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x40,0xe9,0xf5,0x27}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x41,0xb7,0x4c,0x49}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0x60,0xc7,0xa6}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0xc2,0x26,0xfa}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0xc2,0x26,0xfd}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0xc4,0x0c,0x3f}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xd7,0x06,0x22}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xdd,0xc1,0x37}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x44,0x42,0xc1,0xc0}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x44,0x45,0xeb,0xe6}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x44,0x6f,0x0a,0xdb}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x44,0x77,0x8a,0xaf}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x44,0x84,0xc1,0xde}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x44,0xc2,0x2a,0x4c}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x44,0xeb,0x29,0xcc}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x0b,0x61,0x2b}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x29,0x03,0xd4}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x29,0xab,0x23}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x29,0xab,0x24}, 8333},


 -    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x37,0x40,0xd8}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x54,0x2a,0x38}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x46,0x30,0x30,0xfa}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x46,0x70,0x20,0x1d}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x46,0xfa,0x4a,0x14}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x47,0x5d,0xa1,0xa2}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x47,0xc6,0x00,0x7e}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0x05,0xa7,0x29}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0xe0,0x0b,0x67}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x49,0x48,0xa0,0xd5}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4a,0x7a,0xed,0x7c}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4b,0x56,0x89,0x22}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4b,0xa5,0x63,0x90}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0x40,0x4a,0xc1}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0x4c,0xe3,0x88}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0xad,0xa1,0x2c}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0xb2,0x16,0x2c}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0x2f,0x89,0x1b}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0x4d,0x2e,0xfa}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0x5b,0xc1,0x98}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0x5f,0xe2,0xc2}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0x78,0xf6,0xfe}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0xa3,0x88,0x88}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0xcb,0x0d,0x39}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0xec,0x25,0xd6}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0xef,0x25,0x0c}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0xf7,0xb3,0x2c}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x22,0x0e,0x34}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x6d,0xa3,0x99}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0xc4,0xac,0x2d}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4f,0x84,0xe6,0x90}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4f,0xa0,0x02,0x69}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0x52,0x4d,0x8a}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0x64,0xcb,0x97}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0x93,0x44,0xed}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0xed,0xf0,0x66}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x02,0xf6,0x7f}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x07,0x07,0x56}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x07,0x0a,0xee}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x1b,0x60,0x25}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x53,0x60,0x05}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0xe4,0xc2,0xbb}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x2d,0x45,0xd8}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x45,0x2c,0xb7}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x48,0xc6,0x44}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x5f,0xcc,0x0a}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x76,0xec,0x7f}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x76,0xf2,0x04}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x86,0x42,0x92}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xc1,0x6d,0xc7}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xc5,0xd2,0x41}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xc7,0x66,0x0a}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xc8,0xcd,0x1e}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xdd,0x6c,0x1b}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xdd,0x80,0x51}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xdd,0x8b,0x61}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xe8,0xca,0xf6}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x3c,0x40,0xfc}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x3d,0x08,0xe4}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x80,0x29,0x30}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x80,0x6f,0x45}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x89,0x29,0x0a}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x96,0x2b,0x11}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xa9,0x02,0x2b}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xae,0xd1,0x57}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xff,0x2b,0xa3}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x2a,0xc1,0x06}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x34,0x91,0xe7}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x34,0xea,0x46}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x55,0x66,0x71}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x5c,0x5c,0xf7}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x92,0x23,0x7b}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0xd4,0xc6,0xde}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0xd9,0xa3,0x87}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0xf5,0x1b,0xb9}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0xfb,0xcb,0x05}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0x15,0x90,0xe2}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0x19,0xc2,0x0c}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0x19,0xc2,0x1c}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0x90,0x77,0xde}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0xb7,0x8c,0x3e}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0xd6,0xe4,0xcb}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0xd6,0xea,0xfe}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0xda,0x96,0x01}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0xe4,0xc4,0x0a}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x56,0x0f,0x02,0xeb}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x56,0x3d,0x06,0xd2}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0x5c,0x73,0xc2}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0x78,0x08,0x05}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0x78,0x25,0xe6}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0xe9,0xb5,0x92}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0xef,0x65,0x66}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x57,0x4e,0x7e}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x62,0xc6,0x82}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x62,0xe1,0xd6}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x63,0x3a,0xc2}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x96,0xc0,0x11}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0xc4,0x88,0x1f}, 17556},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0xd0,0x3a,0xc1}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0xd0,0x3a,0xc2}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0x16,0x60,0x84}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0x16,0x68,0x30}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0x19,0x50,0x62}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0x22,0x63,0x29}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0x8e,0xc3,0x70}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0xa3,0xe0,0xbb}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0xa3,0xe0,0xc3}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0xee,0x4f,0xeb}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5a,0x2e,0xf0,0xd6}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5a,0x41,0xe8,0x81}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5a,0x47,0x75,0x5a}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5a,0x95,0x26,0xac}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5a,0x9c,0x61,0x91}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5a,0xb1,0x30,0x68}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x6a,0xc2,0x61}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x87,0x00,0xbb}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x96,0xbd,0x9b}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xb9,0xc6,0xd8}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xc4,0x0b,0x2d}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xc5,0x2c,0x85}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xe0,0x00,0xe3}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xe2,0x0a,0x5a}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xe4,0x2d,0x82}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xe5,0x4d,0xef}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xee,0x64,0xf9}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xf0,0x8d,0xa9}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5c,0x1b,0x07,0xd1}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5c,0x36,0x10,0x87}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0x59,0x54,0x5d}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0x64,0x33,0x30}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0x64,0x4c,0x97}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0x68,0xd6,0xeb}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0x73,0x56,0xf6}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0x7b,0x50,0x2f}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0xae,0x58,0xd3}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0xbc,0xe0,0xfd}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0xbe,0x45,0xf2}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0x4a,0x51,0x5d}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0x9c,0x23,0x08}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0xb0,0xed,0xf1}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0xb5,0x2c,0x68}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0xe3,0x2b,0xab}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0x4f,0x66,0xd0}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0x4f,0x66,0xd1}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0x9a,0xed,0x18}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0xb7,0x30,0x3e}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0xb7,0x30,0x47}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0xd5,0xa1,0x02}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0xd5,0xc9,0x5e}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x60,0x14,0xe3,0x27}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x60,0x1c,0x29,0x5b}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0x7f,0x82,0x11}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x64,0x24,0x30,0x65}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x00,0x51,0x2a}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x00,0x51,0x2b}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x67,0x0b,0x40,0x2e}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x67,0x18,0xf4,0x45}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x67,0x2f,0xd2,0x32}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x67,0x4c,0x29,0xa9}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x67,0x50,0xa8,0x39}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x67,0xcb,0x33,0xba}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x67,0xe0,0x76,0x4f}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x67,0xfa,0x04,0x4a}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xc0,0xaa,0xca}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xc4,0x00,0x63}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xc7,0xc0,0x55}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xdb,0xfb,0x2e}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xdf,0x6c,0x21}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xed,0x02,0xbd}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xf7,0xe6,0x1c}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0x96,0x2d,0xd2}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0xae,0x22,0x4d}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0xae,0x22,0x4e}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0xb4,0x47,0x2f}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6c,0x3b,0x0c,0xa3}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6c,0xa8,0x25,0x0d}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6c,0xaf,0x03,0x12}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6c,0xea,0xc1,0x6a}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0x09,0xad,0x0d}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0x65,0xdc,0x97}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xac,0x68,0x77}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xc3,0xc1,0x8a}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xce,0xb1,0x15}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xe2,0x23,0x1c}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xff,0x00,0x6b}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x71,0x1d,0xb7,0x8f}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x72,0x91,0x61,0x49}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x73,0x42,0xcd,0xab}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x43,0xc9,0x28}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0xc2,0xe2,0xa8}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x1c,0x46,0x90}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x18,0xa6,0x49}, 9998},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x4c,0xf4,0xc9}, 10022},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x79,0x52,0x04,0xe8}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x79,0xfe,0xad,0x28}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7b,0xcb,0xa3,0x80}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7c,0xab,0x46,0x2d}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7d,0x3f,0x39,0x07}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7d,0x80,0x23,0x29}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0xd0,0xf4,0x7c}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0xe6,0xd0,0x49}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x83,0x72,0x0a,0xe9}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x83,0x72,0x0a,0xeb}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x84,0xef,0x24,0x69}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x86,0xd5,0xd6,0xe9}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x88,0x3d,0xee,0x79}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x88,0x3e,0x56,0x8c}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x88,0x90,0x80,0x31}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x89,0x30,0x90,0x34}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x89,0x74,0xa0,0xb0}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x89,0x75,0xc1,0x71}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8a,0x13,0x4f,0xd0}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8a,0x44,0x40,0x13}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0x3b,0x60,0x10}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0xa2,0xa0,0xe8}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8d,0x88,0x73,0xe6}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8e,0x3b,0xe8,0x6f}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8e,0x6f,0x02,0x4a}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8e,0xa2,0x80,0x17}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8f,0x6b,0x74,0x05}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8f,0xe5,0x16,0x4a}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8f,0xe5,0x24,0x47}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x90,0x02,0x69,0x3c}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x90,0x4c,0xe0,0xd6}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x92,0xb9,0x13,0x1e}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x93,0x20,0x1e,0x19}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x93,0xe5,0x0d,0xd2}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x94,0x67,0x07,0x77}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x96,0x65,0x72,0xc2}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x96,0xe5,0x00,0x8f}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9a,0x42,0xcf,0x7e}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9e,0x81,0xd4,0xec}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9e,0x81,0xd4,0xfb}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa0,0x10,0xce,0x1f}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xd1,0x01,0xe9}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xd1,0x04,0x7d}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xdc,0xf6,0xe1}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa3,0xac,0xda,0xba}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa6,0xe6,0x46,0x91}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa8,0xeb,0x4a,0x2d}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa9,0x2c,0x22,0x58}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xaa,0x4b,0xc3,0xa8}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0x70,0x02,0x43}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0x5e,0xa4,0x26}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xb7,0xe8,0x6d}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xd0,0xb0,0x7a}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xd4,0xc2,0x72}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xe8,0xe4,0x92}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xaf,0x7e,0x7c,0x5c}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xaf,0x91,0x6d,0x33}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x18,0xc6,0xcd}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x24,0x25,0x3e}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x24,0x63,0xde}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x6a,0x90,0xb7}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb1,0x21,0x01,0x28}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0xa2,0xd6,0xe1}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0xa4,0x6d,0x53}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0xaa,0x8a,0xca}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0xaf,0x88,0x7a}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0xda,0xd1,0xa2}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0xfe,0x02,0x40}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0xfe,0x22,0x90}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0xff,0x29,0x15}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0xff,0x90,0xa3}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb4,0xb5,0xd0,0x2a}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb4,0xc8,0x80,0x3a}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb4,0xeb,0x32,0x0e}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb5,0xd7,0x94,0x9a}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb8,0x40,0x0d,0x2b}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb8,0x5e,0xa4,0xaa}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb8,0x98,0x6b,0xfb}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb8,0xb6,0xe9,0xce}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x04,0x18,0xc7}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x14,0x63,0x31}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x18,0x61,0x0b}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x19,0x30,0x1b}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x19,0x30,0x47}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x1a,0xc4,0xf9}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x1c,0x4c,0xb3}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x23,0x8b,0xfa}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x29,0x71,0x45}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x32,0xd5,0x7b}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x32,0xd5,0x7c}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x32,0xe8,0x72}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x33,0xc0,0x28}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x35,0x81,0xf4}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x47,0xb1,0x64}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x4d,0x81,0xb0}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x52,0xc9,0x33}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x79,0xad,0xdf}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x8c,0xfc,0xfd}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x91,0x81,0xb8}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x91,0x82,0xa3}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x9a,0x9c,0x32}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0xa2,0x7c,0x45}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0xaa,0x2a,0x02}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xba,0x95,0xc5,0x60}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x41,0xd4,0x8a}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x41,0xd5,0x30}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x5d,0xd1,0xc0}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x71,0x4f,0x2d}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x71,0x54,0x74}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x71,0xa4,0xe7}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x7a,0x10,0x99}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0xa5,0xe0,0x1c}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0xaf,0xef,0xe3}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0xd6,0x80,0x12}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0xe3,0x40,0x13}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0xfd,0x02,0x7d}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbd,0x2d,0xcb,0xa6}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbe,0xb8,0xc6,0x22}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0x97,0x91,0xfa}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0xce,0xca,0x06}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0xe4,0x65,0x9d}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x02,0x4c,0x29}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x1b,0xd1,0x64}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x21,0xed,0xbb}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x2e,0x53,0x11}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x31,0x2b,0xdb}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0x18,0xb6,0x1b}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0x1c,0xce,0xc9}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0x3f,0x8f,0xc5}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0x47,0x6d,0x5b}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0x4f,0x08,0x24}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0x87,0x5d,0x26}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0xba,0xa0,0xfd}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0x09,0x8c,0x86}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0x27,0xce,0x1d}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0x43,0x24,0x59}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0xa9,0x63,0x52}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0xd6,0xd6,0xfd}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0xdf,0x47,0x93}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0x25,0x76,0x0b}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0x36,0x71,0x7d}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0x65,0x0c,0x8b}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0x8f,0x0c,0x69}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0xfb,0x53,0x13}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc7,0x7f,0xe0,0x32}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc8,0x0c,0x8a,0x92}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc8,0x74,0x62,0xb9}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc8,0x7a,0x80,0x82}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xca,0x1d,0x06,0x30}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xca,0x85,0x73,0x73}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcb,0x3b,0x11,0xa0}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcc,0x0f,0x0b,0x04}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcc,0x6f,0xf1,0xc3}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcd,0xfb,0x55,0x97}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcf,0xf4,0x46,0x28}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcf,0xfe,0x32,0x48}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd0,0x4c,0x5d,0x53}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd0,0x6b,0x61,0xf2}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd0,0x6e,0x49,0x6b}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd0,0x76,0xeb,0xbe}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0x49,0x8e,0xe2}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0x51,0x09,0xdf}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0x7e,0x6b,0xa6}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0xb1,0x56,0x13}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0xfa,0x06,0xbe}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd2,0x01,0xdb,0x9b}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd2,0xd3,0x6d,0xa5}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd2,0xdf,0x03,0x2c}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd3,0x15,0x81,0x45}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x32,0x62,0xa1}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x33,0x8c,0xb7}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x38,0x6c,0x51}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x53,0x23,0xad}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x5a,0xb3,0xce}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x5d,0xe2,0x5a}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x6e,0xab,0x76}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x05,0x24,0x3a}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x05,0xb5,0xcd}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x11,0x10,0xfb}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x5b,0xcd,0x86}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x5b,0xd3,0x11}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x9b,0x03,0xd8}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0xa8,0x0d,0x97}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0xba,0xaa,0x6d}, 8334},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0xde,0xd0,0x96}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0x20,0xd5,0x70}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0x3b,0x04,0xd4}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0x7e,0xc1,0xa3}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0xc5,0x4f,0x4a}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0xda,0x93,0x8c}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0xe3,0x27,0x54}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0xf5,0xce,0xb5}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0xf9,0x5c,0xe6}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x0c,0xc7,0xcf}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x17,0x02,0xb1}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x17,0x05,0x44}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x1c,0xc2,0x02}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x23,0x82,0x2a}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x40,0x2f,0x8a}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x65,0x48,0xf2}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x91,0x51,0xe5}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0xa8,0x8f,0xa9}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0xa9,0x07,0x6f}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0xb6,0xc0,0x07}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xdb,0x58,0xe8,0xe5}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xdb,0x71,0xf4,0x34}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xdc,0x82,0x80,0x3a}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xdc,0xf4,0xe1,0xef}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xdd,0x8d,0x03,0x0c}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xde,0xa6,0xb0,0x63}, 8333},

-    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xdf,0xfc,0xad,0x93}, 8333},

-    {{0x20,0x01,0x00,0x00,0x41,0x37,0x9e,0x76,0x10,0x25,0x04,0xe5,0xac,0xb0,0x22,0xcd}, 8333},

-    {{0x20,0x01,0x00,0x00,0x41,0x37,0x9e,0x76,0x10,0x78,0x18,0xa6,0x5d,0x2c,0x24,0x61}, 8333},

-    {{0x20,0x01,0x00,0x00,0x41,0x37,0x9e,0x76,0x10,0xec,0x23,0x6a,0xbd,0x3b,0xf3,0xc0}, 8333},

-    {{0x20,0x01,0x00,0x00,0x41,0x37,0x9e,0x76,0x18,0x6d,0x3f,0x17,0xb7,0xad,0x95,0xcf}, 8333},

-    {{0x20,0x01,0x00,0x00,0x41,0x37,0x9e,0x76,0x18,0x70,0x02,0x42,0xac,0x03,0xaa,0xf9}, 8333},

-    {{0x20,0x01,0x00,0x00,0x41,0x37,0x9e,0x76,0x18,0xa6,0x11,0x02,0x2a,0xbf,0xeb,0x70}, 8333},

-    {{0x20,0x01,0x00,0x00,0x41,0x37,0x9e,0x76,0x1c,0xe5,0x24,0x8c,0x4f,0xf5,0x2b,0x1d}, 8333},

-    {{0x20,0x01,0x00,0x00,0x41,0x37,0x9e,0x76,0x20,0x0f,0x15,0x6a,0xbc,0x77,0x3a,0xcd}, 8333},

-    {{0x20,0x01,0x00,0x00,0x41,0x37,0x9e,0x76,0x24,0x18,0x19,0xd1,0xcd,0xdc,0xb1,0xaf}, 8333},

-    {{0x20,0x01,0x00,0x00,0x41,0x37,0x9e,0x76,0x28,0x57,0x3d,0x78,0xaa,0xf8,0xeb,0x28}, 8333},

-    {{0x20,0x01,0x00,0x00,0x41,0x37,0x9e,0x76,0x28,0xb2,0x1b,0x84,0x64,0xfb,0x2d,0x6a}, 8333},

-    {{0x20,0x01,0x00,0x00,0x41,0x37,0x9e,0x76,0x2c,0x70,0x0d,0x51,0xd0,0x46,0x12,0x09}, 8333},

-    {{0x20,0x01,0x00,0x00,0x41,0x37,0x9e,0x76,0x2c,0xac,0x2f,0xcf,0x46,0xbb,0xbe,0x0d}, 8333},

-    {{0x20,0x01,0x00,0x00,0x41,0x37,0x9e,0x76,0x30,0x5e,0x20,0xee,0xa9,0x4f,0x6f,0x69}, 8333},

-    {{0x20,0x01,0x00,0x00,0x41,0x37,0x9e,0x76,0x30,0xcd,0x08,0x49,0xad,0xfe,0x6e,0x67}, 8333},

-    {{0x20,0x01,0x00,0x00,0x41,0x37,0x9e,0x76,0x34,0x5b,0x0f,0x12,0xae,0x1e,0x29,0x48}, 8333},

-    {{0x20,0x01,0x00,0x00,0x41,0x37,0x9e,0x76,0x3c,0x40,0x14,0x6e,0x97,0x41,0x5a,0x3a}, 8333},

-    {{0x20,0x01,0x00,0x00,0x41,0x37,0x9e,0x76,0x3c,0x9e,0x3c,0x3e,0x9d,0x6e,0x73,0x40}, 8333},

-    {{0x20,0x01,0x00,0x00,0x41,0x37,0x9e,0x76,0x04,0x99,0x29,0xa8,0xd0,0x47,0x7e,0xa1}, 8333},

-    {{0x20,0x01,0x00,0x00,0x41,0x37,0x9e,0x76,0x00,0x51,0x00,0x24,0x81,0xb2,0x59,0xe3}, 8333},

-    {{0x20,0x01,0x00,0x00,0x41,0x37,0x9e,0x76,0x08,0x89,0x2d,0x7c,0xb6,0x1b,0xbf,0x0d}, 8333},

-    {{0x20,0x01,0x00,0x00,0x41,0x37,0x9e,0x76,0x0c,0x9f,0x37,0x9c,0xad,0xd2,0xc9,0x38}, 8333},

-    {{0x20,0x01,0x00,0x00,0x41,0x37,0x9e,0x76,0x0c,0xd6,0x2e,0xb4,0xb8,0x2b,0xad,0xdb}, 8333},

-    {{0x20,0x01,0x00,0x00,0x41,0x37,0x9e,0x76,0x0c,0xf0,0x2e,0x3a,0xb2,0x9d,0x62,0x07}, 8333},

-    {{0x20,0x01,0x00,0x00,0x53,0xaa,0x06,0x4c,0x14,0x85,0xfb,0xf9,0xa7,0x98,0x1f,0xfe}, 8333},

-    {{0x20,0x01,0x00,0x00,0x53,0xaa,0x06,0x4c,0x00,0x59,0x61,0x7f,0xa1,0x0d,0x00,0xe0}, 8333},

-    {{0x20,0x01,0x00,0x00,0x5e,0xf5,0x79,0xfb,0x10,0x20,0x2c,0xd0,0x47,0x50,0xeb,0x12}, 8333},

-    {{0x20,0x01,0x00,0x00,0x5e,0xf5,0x79,0xfb,0x10,0x36,0x1d,0x50,0x38,0x81,0x69,0x30}, 8333},

-    {{0x20,0x01,0x00,0x00,0x5e,0xf5,0x79,0xfb,0x10,0xa4,0x27,0xd8,0x9c,0x0a,0xcf,0xa9}, 8333},

-    {{0x20,0x01,0x00,0x00,0x5e,0xf5,0x79,0xfb,0x10,0xae,0x05,0xa8,0x52,0x4b,0xdc,0xc4}, 8333},

-    {{0x20,0x01,0x00,0x00,0x5e,0xf5,0x79,0xfb,0x18,0x92,0x3e,0x3a,0x3f,0x74,0xaf,0xfa}, 8333},

-    {{0x20,0x01,0x00,0x00,0x5e,0xf5,0x79,0xfb,0x1c,0x95,0x1a,0x60,0xd1,0xf5,0x21,0x5b}, 8333},

-    {{0x20,0x01,0x00,0x00,0x5e,0xf5,0x79,0xfb,0x20,0x0b,0x16,0xef,0xb9,0xcf,0x98,0x60}, 8333},

-    {{0x20,0x01,0x00,0x00,0x5e,0xf5,0x79,0xfb,0x28,0xe4,0xfb,0xff,0x32,0x37,0x09,0x92}, 8333},

-    {{0x20,0x01,0x00,0x00,0x5e,0xf5,0x79,0xfb,0x2c,0xe8,0x1d,0x9e,0xb3,0xbf,0xb5,0x3e}, 8333},

-    {{0x20,0x01,0x00,0x00,0x5e,0xf5,0x79,0xfb,0x30,0x0a,0x2e,0x20,0x47,0x50,0xeb,0x12}, 8333},

-    {{0x20,0x01,0x00,0x00,0x5e,0xf5,0x79,0xfb,0x30,0xa2,0x1a,0xd9,0x53,0x24,0x83,0x6a}, 8333},

-    {{0x20,0x01,0x00,0x00,0x5e,0xf5,0x79,0xfb,0x34,0x09,0x19,0x96,0xbc,0xac,0x24,0x1f}, 8333},

-    {{0x20,0x01,0x00,0x00,0x5e,0xf5,0x79,0xfb,0x34,0x4b,0x2b,0xd4,0xbb,0x3e,0x0e,0x26}, 8333},

-    {{0x20,0x01,0x00,0x00,0x5e,0xf5,0x79,0xfb,0x34,0xb3,0x11,0xdb,0xe7,0xda,0xd4,0x61}, 8333},

-    {{0x20,0x01,0x00,0x00,0x5e,0xf5,0x79,0xfb,0x38,0x39,0x2e,0x0c,0xba,0x30,0x28,0x8e}, 8333},

-    {{0x20,0x01,0x00,0x00,0x5e,0xf5,0x79,0xfb,0x38,0x80,0x0e,0xf4,0xb5,0xf0,0xee,0x4d}, 8333},

-    {{0x20,0x01,0x00,0x00,0x5e,0xf5,0x79,0xfb,0x38,0x9f,0x00,0x52,0x9c,0x0c,0x1f,0x41}, 8333},

-    {{0x20,0x01,0x00,0x00,0x5e,0xf5,0x79,0xfb,0x3c,0x73,0x30,0x4a,0x9d,0x8b,0x99,0xd5}, 8333},

-    {{0x20,0x01,0x00,0x00,0x5e,0xf5,0x79,0xfb,0x3c,0xac,0x33,0xe4,0x39,0xca,0x03,0x8c}, 8333},

-    {{0x20,0x01,0x00,0x00,0x5e,0xf5,0x79,0xfb,0x00,0x6f,0x36,0x67,0x53,0x98,0x53,0x8f}, 8333},

-    {{0x20,0x01,0x00,0x00,0x5e,0xf5,0x79,0xfb,0x08,0x8c,0x03,0xe6,0x94,0x54,0x33,0x31}, 8333},

-    {{0x20,0x01,0x00,0x00,0x5e,0xf5,0x79,0xfb,0x00,0x89,0x3b,0x55,0x9f,0xcc,0x8e,0x66}, 8333},

-    {{0x20,0x01,0x00,0x00,0x5e,0xf5,0x79,0xfb,0x0c,0x9b,0x3d,0x65,0xbd,0xf4,0x5d,0x58}, 8333},

-    {{0x20,0x01,0x00,0x00,0x5e,0xf5,0x79,0xfb,0x0c,0xb7,0x08,0xcc,0xb8,0xee,0x68,0x06}, 8333},

-    {{0x20,0x01,0x00,0x00,0x5e,0xf5,0x79,0xfd,0x24,0xf6,0x37,0xb5,0xb9,0xd2,0x2a,0xa7}, 8333},

-    {{0x20,0x01,0x00,0x00,0x5e,0xf5,0x79,0xfd,0x3c,0x63,0x08,0x2e,0xaa,0xbc,0xbd,0x39}, 8333},

-    {{0x20,0x01,0x00,0x00,0x5e,0xf5,0x79,0xfd,0x3c,0xf5,0x2e,0xb7,0xc9,0x66,0x56,0x1d}, 8333},

-    {{0x20,0x01,0x00,0x00,0x5e,0xf5,0x79,0xfd,0x0c,0xf4,0x28,0xe2,0xaa,0xbd,0xb7,0x66}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xb8,0x10,0xf6,0x04,0x53,0x3c,0xa4,0x1a,0x8e}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xb8,0x14,0xdd,0x29,0x8b,0x43,0x1c,0xbf,0xec}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xb8,0x30,0x51,0x15,0x61,0xb6,0x2d,0x73,0xa5}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xb8,0x34,0x67,0x0f,0xfa,0xb6,0x12,0xe9,0xc6}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xb8,0x08,0xe8,0x1e,0x26,0xe8,0xe3,0xee,0xd7}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xb8,0x0c,0x82,0x37,0xb3,0x47,0xee,0x3a,0xe2}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xbd,0x10,0x52,0x3c,0xd8,0xa8,0x9b,0x0e,0x67}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xbd,0x14,0x4d,0x23,0xf3,0xab,0xcb,0x8b,0xcb}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xbd,0x1c,0x2e,0x31,0xdf,0xad,0xf1,0xe6,0x16}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xbd,0x1c,0x41,0x21,0x3b,0xfa,0xcc,0x9c,0x6b}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xbd,0x20,0x93,0x12,0xb5,0x8c,0xbf,0x4f,0x57}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xbd,0x24,0x3a,0x23,0x94,0xfd,0x91,0x71,0x2c}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xbd,0x28,0x33,0x09,0xf8,0xc9,0x4c,0x68,0x81}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xbd,0x2c,0x84,0x29,0xd3,0xae,0x5a,0xf6,0xf0}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xbd,0x2c,0xe4,0x0d,0x50,0xcb,0x22,0x36,0x72}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xbd,0x38,0x24,0x08,0x16,0xc3,0x0d,0xe9,0xd4}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xbd,0x38,0x9a,0x24,0xe9,0xcb,0x5c,0xa1,0xcd}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xbd,0x38,0xbd,0x08,0x8f,0x21,0x93,0x49,0x32}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xbd,0x3c,0x4f,0x0c,0xb1,0xd6,0x5b,0xd7,0x75}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xbd,0x3c,0x51,0x28,0x0b,0xb1,0xe9,0x0f,0xfd}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xbd,0x3c,0x5a,0x02,0xe2,0x21,0x93,0x49,0x32}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xbd,0x3c,0x5e,0x3e,0xbf,0x3d,0xc0,0x70,0x3a}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xbd,0x04,0xc9,0x12,0xfc,0xd1,0xd9,0xdc,0x21}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xbd,0x00,0x6e,0x34,0xe7,0xd0,0xa7,0x67,0x72}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xbd,0x08,0xde,0x1f,0x29,0x2a,0xea,0xf9,0x6f}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xbd,0x0c,0x5f,0x26,0x74,0xa4,0x67,0x78,0x7c}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x6a,0xbd,0x0c,0xc0,0x23,0xa4,0xad,0x7c,0xc9,0x98}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x78,0xcf,0x20,0xc0,0x20,0x97,0xd1,0x88,0x9c,0x3b}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x78,0xcf,0x24,0x20,0x0d,0xda,0x4f,0xf6,0x87,0x94}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x78,0xcf,0x28,0x92,0x0f,0xcb,0x26,0xb2,0x22,0xac}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x78,0xcf,0x30,0x20,0x1a,0xd7,0x26,0xb2,0x22,0xac}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x78,0xcf,0x30,0xae,0x21,0x1b,0xe7,0x17,0x77,0x88}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x78,0xcf,0x30,0xd0,0x6e,0xdd,0xa4,0x18,0xa9,0xe9}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x78,0xcf,0x30,0xd9,0x32,0x78,0xb0,0x04,0x65,0xa7}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x78,0xcf,0x38,0x7a,0x17,0xd5,0xda,0xcb,0xbd,0xf1}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x78,0xcf,0x3c,0x38,0x0c,0x41,0x43,0x3c,0x7b,0x87}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x78,0xcf,0x04,0x67,0x01,0x93,0xa8,0xb0,0xa1,0x22}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x78,0xcf,0x0c,0x65,0xfb,0x96,0x97,0xd2,0xa9,0xb0}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x78,0xcf,0x0c,0x9f,0x26,0x33,0xd1,0x69,0x99,0x99}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x78,0xcf,0x0c,0xe2,0x0a,0xba,0xd1,0x20,0x90,0xdb}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x10,0x5d,0x26,0xf2,0xa2,0x41,0x73,0x39}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x10,0x62,0x3f,0x95,0xe0,0x65,0xfc,0x21}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x10,0xa6,0x19,0xf6,0xab,0x95,0xeb,0xcb}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x14,0xe2,0x22,0xcb,0x73,0x8f,0x94,0x89}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x18,0xfb,0x3d,0xa9,0x89,0x3d,0x1d,0x57}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x1c,0xc3,0x25,0x34,0xe0,0x20,0x53,0xfa}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x20,0x6d,0x2b,0x34,0xd0,0xcb,0x9d,0xe8}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x20,0xcb,0x02,0xcb,0xb9,0xa7,0xca,0x5e}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x24,0x5c,0x27,0x53,0x43,0x82,0x70,0x4b}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x24,0xd6,0x22,0x5f,0x79,0x3b,0x0b,0xf5}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x24,0xda,0x08,0xf0,0xbb,0xf9,0x9c,0x93}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x28,0xa2,0x10,0x7b,0x43,0x8e,0xb0,0x8d}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x2c,0x16,0x0d,0x58,0xb3,0x81,0x0b,0x61}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x2c,0x68,0x30,0x68,0xcb,0x59,0x3b,0xe7}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x2c,0x90,0x38,0x55,0xb9,0x4f,0xc9,0x26}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x2c,0xa2,0x35,0x92,0xc1,0x11,0xdd,0x82}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x2c,0xce,0x1f,0x6e,0xb3,0x81,0x86,0x05}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x34,0x35,0x39,0x15,0x2b,0xcc,0x6c,0xc7}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x34,0x38,0x2b,0x9f,0xad,0x57,0xa7,0x21}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x34,0x74,0x1d,0xf1,0xe7,0x32,0xe5,0xe3}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x38,0xc4,0x37,0xaf,0xab,0x0a,0xf5,0xef}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x00,0x3a,0x39,0xfd,0xa4,0x3b,0x55,0x91}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x3c,0x9d,0x2a,0x45,0xd5,0x37,0x3b,0xd6}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x3c,0xfb,0x2c,0xf5,0x52,0x54,0x4d,0x1e}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x04,0x3f,0x03,0x37,0xad,0xb4,0x63,0x10}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x04,0x93,0x09,0x95,0xd2,0xe9,0x39,0xbe}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x00,0x5b,0x0c,0xe3,0xb2,0x75,0x92,0xab}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x08,0xa8,0x05,0x9d,0xd0,0xcb,0xd5,0x85}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x0c,0x8e,0x1b,0xa0,0xc5,0xa9,0xda,0xce}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x0c,0xdb,0x36,0x5f,0x23,0x02,0xf7,0x29}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x0c,0xf5,0x22,0x2e,0x89,0x3e,0x71,0x6c}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x90,0xd7,0x00,0xd6,0x10,0x85,0xb8,0xdd,0x41,0xc2}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x95,0x3c,0x10,0x1a,0x23,0xb3,0x6b,0x98,0xf8,0x88}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x95,0x3c,0x18,0x05,0x0f,0x38,0x3e,0xb2,0x21,0x21}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x95,0x3c,0x18,0x58,0x16,0xf9,0x38,0x33,0xda,0x19}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x95,0x3c,0x18,0xea,0x27,0x35,0xe7,0x3d,0xad,0xc5}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x95,0x3c,0x1c,0x44,0x2b,0x70,0x9d,0xe7,0xa7,0xcc}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x95,0x3c,0x20,0x0a,0x3f,0x95,0xbb,0x7c,0xc0,0x9f}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x95,0x3c,0x20,0x0c,0x34,0x73,0xb8,0x5d,0x0d,0xdd}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x95,0x3c,0x20,0x0f,0x05,0xa0,0x47,0xc6,0x55,0x07}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x95,0x3c,0x20,0x97,0x20,0x4a,0x47,0xc5,0x58,0x81}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x95,0x3c,0x24,0x8f,0x24,0xcd,0xaa,0xf5,0xde,0xe3}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x95,0x3c,0x28,0x7d,0x16,0x8e,0x3c,0xaf,0x47,0xaf}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x95,0x3c,0x28,0xc1,0x05,0x8d,0xb7,0x21,0x94,0xc1}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x95,0x3c,0x2c,0x31,0x30,0xa3,0x39,0xd3,0x05,0x28}, 8188},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x95,0x3c,0x2c,0x3d,0x30,0x9b,0xd2,0xdb,0x82,0x88}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x95,0x3c,0x2c,0x47,0x1b,0x36,0x52,0xc1,0x3c,0x73}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x95,0x3c,0x30,0x4a,0x10,0xe1,0xb7,0x39,0x82,0x2a}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x95,0x3c,0x30,0xa3,0x29,0xfd,0x33,0xf6,0xea,0xab}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x95,0x3c,0x34,0x27,0x85,0x9b,0xb5,0x25,0x10,0x69}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x95,0x3c,0x34,0x59,0x25,0x41,0x36,0x51,0xd6,0x75}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x95,0x3c,0x04,0xf5,0x9c,0x88,0xaf,0x91,0xd3,0xd3}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x95,0x3c,0x0c,0xd1,0x1d,0x54,0xb8,0x0a,0x42,0xf4}, 8333},

-    {{0x20,0x01,0x00,0x00,0x9d,0x38,0x95,0x3c,0x0c,0xfa,0x37,0xe6,0x9d,0x8e,0x74,0x74}, 8333},

-    {{0x20,0x01,0x13,0xd8,0x1c,0x01,0x20,0x00,0x24,0x70,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x20,0x01,0x14,0x70,0xff,0xfd,0x20,0x2c,0x02,0x25,0x90,0xff,0xfe,0x8f,0x5f,0x62}, 8333},

-    {{0x20,0x01,0x14,0xba,0x02,0x00,0x00,0x00,0x54,0x3c,0x42,0xce,0xa4,0x8b,0xb0,0xd0}, 8333},

-    {{0x20,0x01,0x14,0xba,0x02,0xfc,0x07,0x00,0x41,0xb2,0xdf,0x51,0xef,0xd8,0xf5,0x81}, 8333},

-    {{0x20,0x01,0x19,0xf0,0x50,0x00,0x8c,0x8b,0x54,0x00,0x00,0xff,0xfe,0x1f,0xc0,0x23}, 8333},

-    {{0x20,0x01,0x19,0xf0,0x00,0x05,0x07,0x49,0x54,0x00,0x00,0xff,0xfe,0x71,0xc3,0xfc}, 8333},

-    {{0x20,0x01,0x19,0xf0,0x00,0x05,0x00,0xbc,0x54,0x00,0x00,0xff,0xfe,0x3b,0x93,0x39}, 8333},

-    {{0x20,0x01,0x19,0xf0,0x74,0x02,0x04,0x2c,0x54,0x00,0x00,0xff,0xfe,0x6c,0xb9,0xb8}, 8333},

-    {{0x20,0x01,0x1a,0xf8,0x40,0x10,0xa0,0x8f,0xf8,0x11,0xe5,0xf0,0x3f,0x63,0xe7,0x53}, 8333},

-    {{0x20,0x01,0x1a,0xf8,0x40,0x10,0xa0,0x94,0x33,0x33,0x00,0x00,0x00,0x00,0x8c,0x38}, 8333},

-    {{0x20,0x01,0x1a,0xf8,0x40,0x70,0xa0,0x16,0x33,0x33,0x00,0x00,0x00,0x00,0x5a,0xfb}, 8333},

-    {{0x20,0x01,0x1a,0xf8,0x47,0x00,0xa0,0x71,0x44,0x44,0x00,0x00,0x00,0x00,0xe2,0x6e}, 8333},

-    {{0x20,0x01,0x1b,0xc8,0x01,0xa0,0x59,0x0e,0x02,0xe0,0xf4,0xff,0xfe,0x16,0x3a,0x39}, 8333},

-    {{0x20,0x01,0x20,0x40,0x00,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89}, 8333},

-    {{0x20,0x01,0x02,0x88,0x10,0x01,0x01,0x07,0x29,0x4e,0x55,0x81,0x74,0xbd,0x42,0xf9}, 8333},

-    {{0x20,0x01,0x03,0xc8,0xc1,0x03,0xa0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48}, 8333},

-    {{0x20,0x01,0x41,0x28,0x61,0x35,0x00,0x10,0x02,0x0c,0x29,0xff,0xfe,0x69,0x9e,0x81}, 8333},

-    {{0x20,0x01,0x41,0x28,0x61,0x35,0x20,0x10,0x02,0x1e,0x0b,0xff,0xfe,0xe8,0xa3,0xc0}, 8333},

-    {{0x20,0x01,0x41,0x28,0x61,0x35,0xe0,0x01,0x50,0x54,0x00,0xff,0xfe,0x37,0xe9,0xeb}, 8333},

-    {{0x20,0x01,0x41,0x78,0x00,0x06,0x14,0x27,0x00,0x62,0x01,0x16,0x01,0x88,0x00,0x85}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x10,0x04,0x20,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x10,0x08,0x27,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x01,0x47,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x01,0x6f,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x01,0x73,0x53,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x01,0x74,0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x01,0x7d,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x01,0x8b,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x01,0xc1,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x01,0xd2,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x01,0xe1,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x01,0xe6,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x02,0x16,0xbe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x02,0x20,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x02,0x32,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x02,0x8a,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x02,0x8c,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x02,0x8d,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x02,0x94,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x02,0x95,0x0a,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x03}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x02,0x9c,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x02,0xa2,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x02,0xa2,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x02,0xab,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x02,0xbf,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x02,0xc7,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x03,0x02,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x25}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x03,0x03,0x19,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x52,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0xe2}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x52,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0xe3}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x08,0x1b,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x08,0x3d,0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x08,0x4d,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x08,0x7a,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x08,0x8f,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x08,0xba,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x08,0xbd,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x08,0xbe,0xd3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x08,0xc6,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x08,0xd8,0x44,0x13,0x37,0x00,0x00,0x00,0x00,0x10,0x17}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x08,0x0d,0xdb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x08,0x0d,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x08,0xde,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x08,0xe3,0xe4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x0a,0x4e,0x3f,0x00,0x00,0x00,0x00,0x1c,0x7d,0x6b,0x01}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x0a,0x63,0x5b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x0a,0x68,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x0a,0x6c,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x0a,0x6f,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x0a,0xfa,0xc7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x0d,0x11,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x0d,0x2a,0xc8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},

-    {{0x20,0x01,0x41,0xd0,0x00,0x0e,0x13,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x20,0x01,0x41,0xf0,0x00,0x61,0x00,0x00,0x72,0xf3,0x95,0xff,0xfe,0x09,0x75,0x21}, 8333},

-    {{0x20,0x01,0x41,0xf0,0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07}, 8333},

-    {{0x20,0x01,0x04,0x70,0x1f,0x07,0x15,0x1c,0xba,0xac,0x6f,0xff,0xfe,0xb7,0x3b,0xa9}, 8333},

-    {{0x20,0x01,0x04,0x70,0x1f,0x0b,0x08,0xc4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05}, 8333},

-    {{0x20,0x01,0x04,0x70,0x1f,0x0b,0x09,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11}, 8333},

-    {{0x20,0x01,0x04,0x70,0x1f,0x15,0x11,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10}, 8333},

-    {{0x20,0x01,0x04,0x70,0x1f,0x15,0x1b,0x95,0x2c,0x3e,0x8a,0x9a,0x24,0xe1,0x70,0x84}, 8333},

-    {{0x20,0x01,0x04,0x70,0x1f,0x15,0x0f,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03}, 8333},

-    {{0x20,0x01,0x04,0x70,0x1f,0x1a,0x01,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x20,0x01,0x04,0x70,0x1f,0x1c,0x0b,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x20,0x01,0x04,0x70,0x1f,0x1d,0x03,0xa9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10}, 8333},

-    {{0x20,0x01,0x04,0x70,0x00,0x25,0x04,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x20,0x01,0x04,0x70,0x00,0x28,0x03,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04}, 8333},

-    {{0x20,0x01,0x04,0x70,0x75,0x4f,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7a}, 8333},

-    {{0x20,0x01,0x04,0x70,0x00,0x07,0x0b,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x20,0x01,0x04,0x70,0x7d,0xda,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x20,0x01,0x04,0x70,0x00,0x08,0x0c,0x70,0x02,0x0c,0x29,0xff,0xfe,0x6a,0x8f,0xdc}, 8333},

-    {{0x20,0x01,0x04,0x70,0x00,0x08,0x0c,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54}, 8333},

-    {{0x20,0x01,0x04,0x70,0x00,0x0a,0x0c,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x20,0x01,0x04,0x70,0xd0,0x0d,0x00,0x00,0x36,0x64,0xa9,0xff,0xfe,0x9a,0x51,0x50}, 8333},

-    {{0x20,0x01,0x04,0x70,0xdb,0xf2,0xaa,0xaa,0x00,0x00,0x00,0x00,0x0b,0x17,0xc0,0x1c}, 8333},

-    {{0x20,0x01,0x04,0x70,0xf4,0x57,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6}, 8333},

-    {{0x20,0x01,0x48,0x01,0x78,0x19,0x00,0x74,0xb7,0x45,0xb9,0xd5,0xff,0x10,0xa6,0x1a}, 8333},

-    {{0x20,0x01,0x48,0x01,0x78,0x19,0x00,0x74,0xb7,0x45,0xb9,0xd5,0xff,0x10,0xaa,0xec}, 8333},

-    {{0x20,0x01,0x48,0x01,0x78,0x28,0x01,0x04,0xbe,0x76,0x4e,0xff,0xfe,0x10,0x13,0x25}, 8333},

-    {{0x20,0x01,0x4b,0xa0,0xca,0xfe,0x13,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x20,0x01,0x4b,0xa0,0xca,0xfe,0x04,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x20,0x01,0x05,0x58,0x60,0x45,0x00,0x23,0x18,0x30,0x89,0x6c,0xd9,0x01,0x19,0x0d}, 8333},

-    {{0x20,0x01,0x06,0x7c,0x12,0x20,0x08,0x0c,0x00,0x00,0x00,0x00,0x93,0xe5,0x0d,0xd2}, 8333},

-    {{0x20,0x01,0x06,0x7c,0x21,0x28,0xff,0xff,0x60,0x62,0x36,0xff,0xfe,0x30,0x65,0x32}, 8333},

-    {{0x20,0x01,0x08,0xd8,0x09,0x23,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0x0e,0xbd}, 8333},

-    {{0x20,0x01,0x09,0x81,0x44,0x52,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00}, 8333},

-    {{0x20,0x01,0x09,0x81,0x00,0x46,0x00,0x01,0xba,0x27,0xeb,0xff,0xfe,0x5b,0xed,0xee}, 8333},

-    {{0x20,0x01,0x09,0x81,0xbd,0xbd,0x00,0x01,0xc5,0x06,0x7d,0x38,0x4b,0x47,0xda,0x15}, 8333},

-    {{0x20,0x01,0x09,0x85,0x79,0xaf,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35}, 8333},

-    {{0x20,0x01,0x0b,0xc8,0x22,0x5f,0x01,0x0e,0x05,0x05,0x65,0x73,0x75,0x73,0x0d,0x0a}, 8333},

-    {{0x20,0x01,0x0b,0xc8,0x32,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53}, 8333},

-    {{0x20,0x01,0x0b,0xc8,0x32,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x04}, 8333},

-    {{0x20,0x01,0x0b,0xc8,0x32,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0xfe}, 8333},

-    {{0x20,0x01,0x0b,0xc8,0x36,0x80,0x42,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x20,0x01,0x0b,0xc8,0x39,0x9f,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x20,0x02,0x01,0xe2,0x55,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xe2,0x55,0x87}, 8333},

-    {{0x20,0x02,0x01,0xe2,0x55,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xe2,0x55,0x88}, 8333},

-    {{0x20,0x02,0x2a,0x33,0x21,0xc4,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x33,0x21,0xc4}, 8333},

-    {{0x20,0x02,0x2e,0x04,0x78,0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x04,0x78,0x4b}, 8333},

-    {{0x20,0x02,0x2e,0xbc,0x2c,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16}, 8333},

-    {{0x20,0x02,0x2f,0x5a,0x3c,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x5a,0x3c,0x1c}, 10011},

-    {{0x20,0x02,0x2f,0x5a,0x56,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x5a,0x56,0x2a}, 8333},

-    {{0x20,0x02,0x2f,0x5b,0xa5,0xf9,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x5b,0xa5,0xf9}, 8333},

-    {{0x20,0x02,0x31,0x41,0x02,0x8c,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x41,0x02,0x8c}, 8333},

-    {{0x20,0x02,0x32,0x3f,0xa2,0xf2,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x3f,0xa2,0xf2}, 8333},

-    {{0x20,0x02,0x32,0x3f,0x0f,0xbd,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x3f,0x0f,0xbd}, 8333},

-    {{0x20,0x02,0x33,0xff,0x69,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x20,0x02,0x3e,0x6a,0x10,0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x6a,0x10,0x6f}, 8333},

-    {{0x20,0x02,0x3e,0x70,0x0b,0xbc,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x70,0x0b,0xbc}, 8333},

-    {{0x20,0x02,0x3e,0x7a,0x67,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x7a,0x67,0x27}, 8333},

-    {{0x20,0x02,0x3f,0x62,0xe6,0xbb,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x62,0xe6,0xbb}, 8333},

-    {{0x20,0x02,0x45,0x40,0x4b,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x40,0x4b,0x30}, 8333},

-    {{0x20,0x02,0x4e,0x6b,0xc7,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x20,0x02,0x50,0x52,0x4d,0x8a,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x52,0x4d,0x8a}, 8333},

-    {{0x20,0x02,0x51,0xa9,0x9c,0xc9,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0xa9,0x9c,0xc9}, 8333},

-    {{0x20,0x02,0x54,0xfb,0xcb,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x20,0x02,0x5b,0xc2,0x54,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0xc2,0x54,0x28}, 8333},

-    {{0x20,0x02,0x5b,0xce,0x12,0x53,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0xce,0x12,0x53}, 8333},

-    {{0x20,0x02,0x5b,0xdb,0x19,0xe8,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0xdb,0x19,0xe8}, 8333},

-    {{0x20,0x02,0x5c,0x3f,0x39,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x3f,0x39,0x12}, 8333},

-    {{0x20,0x02,0x5d,0xbd,0x91,0xa9,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0xbd,0x91,0xa9}, 8333},

-    {{0x20,0x02,0x5d,0xbe,0x8c,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x5d,0xbe,0x8c,0xc6}, 8333},

-    {{0x20,0x02,0x5f,0xd3,0x89,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0xd3,0x89,0x44}, 8333},

-    {{0x20,0x02,0x65,0xc8,0xa0,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0xc8,0xa0,0x18}, 8333},

-    {{0x20,0x02,0x67,0x50,0xa8,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0x50,0xa8,0x39}, 8333},

-    {{0x20,0x02,0x67,0xfa,0x04,0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x67,0xfa,0x04,0x4b}, 8333},

-    {{0x20,0x02,0x6a,0x0e,0x3e,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x0e,0x3e,0xa8}, 10011},

-    {{0x20,0x02,0x6a,0x0f,0x24,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x0f,0x24,0x97}, 8333},

-    {{0x20,0x02,0x6d,0xec,0x5a,0xc7,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0xec,0x5a,0xc7}, 8333},

-    {{0x20,0x02,0x70,0x4a,0xd6,0xd4,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x4a,0xd6,0xd4}, 9997},

-    {{0x20,0x02,0x72,0x37,0xfc,0xf6,0x00,0x00,0x00,0x00,0x00,0x00,0x72,0x37,0xfc,0xf6}, 20188},

-    {{0x20,0x02,0x76,0xb2,0x7f,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0xb2,0x7f,0x40}, 8333},

-    {{0x20,0x02,0x78,0x19,0x7e,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x19,0x7e,0x80}, 7743},

-    {{0x20,0x02,0x78,0x1b,0x8d,0xb8,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x1b,0x8d,0xb8}, 8333},

-    {{0x20,0x02,0x7b,0x38,0xcd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0x38,0xcd,0x00}, 8333},

-    {{0x20,0x02,0xac,0x52,0xb8,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x52,0xb8,0x54}, 8333},

-    {{0x20,0x02,0xb6,0x10,0x1c,0xa3,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x10,0x1c,0xa3}, 8333},

-    {{0x20,0x02,0xb9,0x46,0x69,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x46,0x69,0x4a}, 8339},

-    {{0x20,0x02,0xb9,0x94,0x91,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0xb9,0x94,0x91,0x67}, 8333},

-    {{0x20,0x02,0xbc,0x28,0x6b,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x28,0x6b,0x92}, 8333},

-    {{0x20,0x02,0xc2,0x3f,0x8f,0xc5,0x00,0x00,0x00,0x00,0x00,0x00,0xc2,0x3f,0x8f,0xc5}, 8333},

-    {{0x20,0x02,0xc3,0x38,0x3f,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0xc3,0x38,0x3f,0x0a}, 8333},

-    {{0x20,0x02,0xd1,0xb1,0x56,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0xd1,0xb1,0x56,0x15}, 8333},

-    {{0x20,0x02,0xd2,0xd3,0x6d,0xa5,0x00,0x00,0x00,0x00,0x00,0x00,0xd2,0xd3,0x6d,0xa5}, 8333},

-    {{0x20,0x02,0xd9,0x17,0x02,0xb1,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x17,0x02,0xb1}, 8333},

-    {{0x20,0x02,0xdb,0x71,0xf4,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x71,0xf4,0x34}, 8333},

-    {{0x20,0x03,0x00,0x0a,0x03,0x6f,0x4f,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x20,0x03,0x00,0x0a,0x03,0x7f,0xef,0x4f,0xde,0xad,0xba,0xbe,0xb0,0x0b,0xbe,0xef}, 8333},

-    {{0x24,0x00,0x89,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x2c,0x63,0xd8}, 8333},

-    {{0x24,0x00,0x89,0x02,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0xd5,0x9d,0x8d}, 8333},

-    {{0x24,0x01,0x25,0x00,0x02,0x03,0x00,0x10,0x01,0x53,0x01,0x20,0x01,0x56,0x00,0x83}, 8333},

-    {{0x24,0x01,0xa4,0x00,0x32,0x00,0x56,0x00,0x14,0xee,0xf3,0x61,0x4b,0xdc,0x1f,0x7c}, 8333},

-    {{0x24,0x02,0x1f,0x00,0x81,0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},

-    {{0x24,0x03,0x42,0x00,0x04,0x03,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff}, 8333},

-    {{0x24,0x05,0x98,0x00,0xb4,0x40,0x94,0x7f,0x59,0xa5,0xf3,0x79,0x18,0x76,0x85,0x8c}, 8333},

-    {{0x24,0x05,0xaa,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40}, 8333},

-    {{0x24,0x06,0xda,0x14,0x04,0x45,0x52,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0x1a,0x58,0x81,0xfe,0x6e,0xd0,0x11,0x03}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0x22,0xaa,0x25,0x85,0xfe,0x88,0x7d,0x58}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0x26,0x74,0x33,0xbb,0x25,0xd6,0xcb,0xba}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0x2e,0x19,0xa8,0xc7,0xa3,0x6a,0xbd,0xe0}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0x3c,0xc8,0x04,0x3d,0xfb,0xcc,0x50,0x67}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0x52,0x28,0x2b,0x53,0xbb,0x9a,0xed,0xf5}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0x57,0x29,0x01,0x02,0x99,0x8c,0xd4,0x1a}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0x59,0x1b,0x48,0x81,0x39,0x86,0x37,0x03}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0x59,0xb9,0x0b,0x50,0xf4,0x7f,0xb5,0x60}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0x61,0xf2,0xcf,0xb0,0x8c,0x45,0x5f,0xdd}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0x63,0x56,0x68,0xe0,0x73,0xfc,0xac,0x0b}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0x66,0x0e,0xf6,0xbc,0x35,0x63,0xba,0x8e}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0x06,0x91,0x00,0x9e,0xf2,0xdf,0x22,0x7d}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0x72,0x1c,0x83,0xd2,0x67,0x65,0x43,0x00}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0x72,0x37,0x09,0xbe,0x46,0x01,0xbc,0x15}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0x7a,0x3b,0xc2,0x03,0xfd,0x11,0x6c,0x7d}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0x7a,0x74,0xa8,0x0e,0x88,0x9a,0xba,0x42}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0x7e,0xe3,0xa1,0x81,0xf2,0x5c,0xfa,0x79}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0x8a,0x25,0x90,0x84,0x01,0x40,0x45,0x49}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0x8b,0xc0,0xc6,0xfd,0xec,0xfb,0xf0,0x74}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0x91,0xce,0xd0,0xba,0x1b,0x9e,0xc2,0x7b}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0x93,0x36,0x44,0xe7,0x84,0xb4,0x85,0xb9}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0x93,0x6c,0xc3,0xb9,0xa1,0xd0,0x08,0x48}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0x93,0xef,0x1e,0xef,0x65,0xc8,0x76,0x6d}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0x94,0xe0,0x5b,0x27,0x78,0xc2,0x51,0x11}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0x98,0x15,0xa2,0x02,0x18,0xa3,0x2a,0x36}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0x9e,0x1b,0x13,0x5c,0x74,0x72,0x09,0xd9}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0x9f,0x84,0x02,0x78,0x68,0xf5,0xb8,0xea}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0xa0,0x62,0x49,0x3f,0xa6,0xf8,0xca,0x75}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0xa1,0x92,0x0b,0x98,0x30,0x66,0x8f,0x11}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0xa1,0xcb,0x2f,0x19,0x4a,0x54,0x38,0xc9}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0xa4,0xa2,0x04,0xc9,0xc4,0x3a,0x98,0xae}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0xa7,0xe9,0xcd,0x48,0xfa,0x90,0x46,0xd3}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0x0a,0x88,0x00,0x99,0x66,0x71,0xfc,0xe4}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0xab,0xe1,0x2e,0x48,0xeb,0x97,0x2a,0xb5}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0xac,0xf5,0x2b,0x21,0x5d,0x2a,0x6b,0x31}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0xb5,0x1f,0x89,0x66,0x74,0xa5,0x6c,0x53}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0xb8,0xe3,0xf3,0xca,0xe4,0x12,0xda,0xa5}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0xba,0x7c,0x6d,0xa8,0xda,0x59,0xb1,0xb6}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0xbe,0x04,0x6f,0x8e,0x8f,0x93,0xc5,0x55}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0xc8,0x2d,0x2a,0x0b,0x31,0xa5,0xe2,0x8d}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0xc9,0x93,0xeb,0x06,0xbd,0x2c,0x1e,0x65}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0xd4,0xb9,0xbf,0xf8,0xc4,0xd4,0x1e,0x05}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0xd7,0x0d,0xa7,0x3d,0x1d,0xdd,0x43,0x9e}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0xe1,0x03,0xf4,0x56,0xb2,0x96,0x9f,0x29}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0xea,0x3b,0x27,0xec,0x07,0xc2,0xae,0xbc}, 8333},

-    {{0x24,0x06,0xda,0x18,0x0f,0x7c,0x43,0x51,0xf6,0x2c,0x50,0x13,0x37,0x9b,0x36,0x3e}, 8333},

-    {{0x24,0x0b,0x00,0x10,0xca,0x20,0x00,0xf0,0x02,0x24,0xe8,0xff,0xfe,0x1f,0x60,0xd9}, 8333},

-    {{0x24,0x0b,0x02,0x50,0x01,0xe0,0x24,0x00,0xb9,0xef,0x8f,0xe3,0xa6,0x9a,0x73,0x78}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0x13,0xf4,0xce,0xb6,0xa9,0xdb,0x4f,0x47}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0x25,0x50,0x93,0x66,0xa5,0xd9,0x78,0xa5}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0x02,0x7d,0x06,0xed,0x7c,0x8d,0x7b,0xee}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0x2e,0xd6,0x8a,0x19,0x04,0xeb,0x36,0xc1}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0x34,0xc7,0x2e,0x9e,0xe6,0x0e,0xf8,0x23}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0x38,0xde,0x04,0x42,0x72,0xdf,0x63,0x46}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0x3a,0x1e,0x87,0x8f,0x99,0x1a,0x95,0x82}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0x3d,0x88,0x18,0x05,0x54,0xe3,0xf4,0xc8}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0x3f,0x3e,0x58,0xbd,0xec,0x82,0x5d,0xac}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0x44,0x9a,0x95,0x15,0x84,0x36,0xf4,0x07}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0x4f,0x84,0x27,0x7f,0xe6,0x4d,0x1f,0x06}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0x52,0x29,0xde,0x84,0x82,0x26,0x72,0x57}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0x57,0x43,0x42,0xc3,0x95,0x1b,0xe9,0x7a}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0x5a,0x29,0x08,0x5b,0x86,0xb5,0xfa,0x0e}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0x5d,0xe8,0x08,0x1e,0x6d,0x79,0x33,0x0b}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0x5f,0xca,0xad,0x1e,0x5b,0x9c,0x52,0x65}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0x68,0xc4,0xca,0x1b,0x81,0x3e,0x1b,0xce}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0x00,0x06,0xde,0x9e,0x7b,0x5e,0xa5,0x58}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0x6c,0x72,0x1f,0xcd,0x04,0x33,0xdc,0x97}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0x77,0xee,0x62,0x9f,0xbc,0x13,0xfb,0x4f}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0x79,0xd0,0x85,0xd6,0x51,0x6f,0x32,0x93}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0x00,0x81,0x42,0x2f,0x9e,0xf3,0x45,0x79}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0x82,0x2b,0x5f,0x05,0xec,0x8d,0x48,0xc6}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0x08,0x2a,0x76,0xa2,0xfd,0xc9,0x84,0x5e}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0x83,0xca,0xce,0xf6,0xe0,0x4c,0x50,0xc0}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0x8b,0xa2,0xa3,0x6c,0x86,0x87,0xd5,0xaa}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0x8c,0x80,0x5c,0x67,0x3b,0x47,0x90,0xb3}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0x8e,0xb8,0xf4,0x7f,0x6d,0x53,0xe3,0xae}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0x98,0x9c,0xf8,0xf8,0xa9,0x22,0x1b,0x9a}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0x98,0xc9,0x1e,0xb3,0xea,0x12,0xa8,0xf0}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0x9e,0xe5,0xa8,0xf6,0x6b,0x2a,0x86,0x6e}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0xa4,0x6b,0x7b,0xd5,0x62,0x9f,0xf7,0x5c}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0xa6,0x27,0x82,0x99,0x87,0x84,0xd4,0x39}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0xad,0x0b,0x95,0x5e,0xb4,0xe5,0xd9,0x7d}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0xae,0x82,0x71,0x17,0x9d,0x69,0x7c,0x86}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0xcc,0xee,0x36,0x5a,0x43,0xf8,0xb8,0x71}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0xd5,0xee,0xa3,0xe2,0x2f,0x85,0xe5,0x93}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0xd5,0xf0,0x1f,0xe0,0x6b,0xd5,0x18,0xa8}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0xe4,0xa7,0x5a,0xba,0xaf,0x87,0x4c,0xdb}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0xe8,0xe5,0x02,0xd0,0xfb,0x6f,0x02,0xf5}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0xe9,0xef,0x46,0x90,0xa5,0xac,0x92,0xbe}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0xef,0xba,0x22,0x60,0x69,0x97,0xfc,0xf7}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0xf1,0x07,0x2d,0x08,0x0c,0x67,0xe5,0xdd}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0xf1,0xb9,0x88,0xfb,0xf3,0xdb,0xa8,0x6e}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x03,0x4a,0xfe,0x00,0xf7,0x9c,0x17,0xb7,0x6f,0x75,0x95,0xb7}, 8333},

-    {{0x26,0x00,0x1f,0x14,0x06,0xae,0xd9,0x00,0x65,0x50,0x3f,0xc5,0xe0,0x74,0xa7,0x2c}, 8333},

-    {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0x12,0x43,0x38,0xb3,0x0c,0xaa,0xd6,0x2e}, 8333},

-    {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0x16,0x6d,0xa9,0x56,0x10,0x41,0xf9,0x7d}, 8333},

-    {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0x35,0xf2,0x24,0x28,0xfc,0x57,0xd6,0x38}, 8333},

-    {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0x3c,0x75,0x33,0x3e,0x0b,0x7f,0x8c,0xc0}, 8333},

-    {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0x3f,0xbf,0x03,0x1f,0x1b,0x57,0x8b,0x18}, 8333},

-    {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0x56,0x17,0x75,0x75,0x03,0x79,0xa8,0xcc}, 8333},

-    {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0x58,0xfa,0xfc,0xe6,0x00,0x30,0xa5,0xdc}, 8333},

-    {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0x5e,0x74,0x70,0xdc,0xaf,0x78,0x6b,0x77}, 8333},

-    {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0x70,0x36,0xf6,0x51,0x02,0xee,0x39,0xcd}, 8333},

-    {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0x07,0xfc,0x90,0x04,0xe7,0xbe,0xff,0xe2}, 8333},

-    {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0x81,0x4a,0x23,0xf6,0xe9,0x96,0x5e,0x64}, 8333},

-    {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0x82,0x2c,0xa8,0x8b,0x0f,0x9c,0x57,0xe3}, 8333},

-    {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0x83,0x14,0xb9,0x1e,0xa7,0xba,0x07,0x02}, 8333},

-    {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0x88,0xbb,0xee,0x9a,0x10,0xde,0x00,0x12}, 8333},

-    {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0x8c,0x30,0x56,0xf5,0xa2,0x9a,0x91,0xde}, 8333},

-    {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0x8f,0xdf,0x65,0x17,0x77,0x18,0x8c,0x42}, 8333},

-    {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0x91,0xfd,0x78,0xb1,0x62,0xa3,0x01,0x93}, 8333},

-    {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0x93,0x0d,0x93,0xed,0x76,0xa6,0x32,0x85}, 8333},

-    {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0x93,0xc2,0x61,0x5f,0xa7,0x9a,0xc1,0x1f}, 8333},

-    {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0xa7,0x80,0x8b,0xc8,0xa1,0xf6,0xd4,0x17}, 8333},

-    {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0xa9,0x51,0xe6,0x63,0x40,0x46,0x8c,0x3a}, 8333},

-    {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0xab,0x19,0x5f,0xe3,0xf1,0x55,0x13,0x71}, 8333},

-    {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0xae,0xfd,0x9c,0xc7,0x00,0xd3,0x6e,0x86}, 8333},

-    {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0xb0,0x31,0xe8,0x6e,0x86,0x04,0x32,0x4a}, 8333},

-    {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0x0b,0x6e,0x43,0x99,0x9d,0xc2,0x6b,0x45}, 8333},

-    {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0xb7,0xc7,0x58,0xc6,0x21,0xa1,0xfd,0x41}, 8333},

-    {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0xc1,0x69,0x62,0x82,0x17,0x8c,0x27,0xd6}, 8333},

-    {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0xc9,0x4e,0x05,0x8b,0xbd,0x35,0xd8,0x15}, 8333},

-    {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0xca,0xa5,0x73,0x69,0x73,0xa4,0x57,0x11}, 8333},

-    {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0xcd,0x15,0xb9,0xf2,0x6e,0x3e,0x6f,0xd1}, 8333},

-    {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0xd6,0xf3,0x07,0x75,0x66,0xb7,0x3e,0x92}, 8333},

-    {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0xdb,0xec,0xf7,0xd9,0x0e,0x15,0xf8,0xe0}, 8333},

-    {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0xdb,0xf4,0x4d,0x41,0x59,0x4e,0xbc,0x20}, 8333},

-    {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0xe1,0x1b,0x45,0x89,0xa0,0xc3,0x9c,0xc7}, 8333},

-    {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0xed,0x68,0x15,0xb0,0x3a,0x97,0xbe,0x0c}, 8333},

-    {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0xee,0xf3,0xbc,0xe0,0x84,0xee,0xa9,0x8b}, 8333},

-    {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0xef,0x3a,0xf6,0x6e,0xf0,0x59,0xd0,0x3f}, 8333},

-    {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0xf6,0x7c,0xd3,0x98,0x05,0xb6,0xd3,0x4f}, 8333},

-    {{0x26,0x00,0x1f,0x16,0x06,0x25,0x0e,0x00,0xfe,0x35,0x50,0x99,0x3a,0x8e,0xd1,0x23}, 8333},

-    {{0x26,0x00,0x1f,0x18,0x64,0xd9,0x16,0x03,0x6f,0x6f,0xee,0xf9,0xb5,0x95,0x19,0x58}, 8333},

-    {{0x26,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x84,0xd6,0x50}, 8333},

-    {{0x26,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x89,0x74,0x38}, 8333},

-    {{0x26,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x91,0x3e,0x49}, 8333},

-    {{0x26,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0xbb,0x98,0x1e}, 8333},

-    {{0x26,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x69,0x89,0xe9}, 8333},

-    {{0x26,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x91,0x6a,0x29}, 8333},

-    {{0x26,0x00,0x3c,0x03,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x28,0x14,0x45}, 8333},

-    {{0x26,0x00,0x3c,0x03,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0xe0,0x23,0x3e}, 8333},

-    {{0x26,0x00,0x6c,0x55,0x72,0x00,0x02,0x4d,0x0c,0xf4,0x81,0x1c,0x7c,0xb3,0xf7,0xa7}, 8333},

-    {{0x26,0x00,0x88,0x05,0x24,0x00,0x01,0x4e,0x02,0x26,0x4a,0xff,0xfe,0x02,0x2b,0xa4}, 8333},

-    {{0x26,0x01,0x01,0x8d,0x46,0x00,0x3c,0xc2,0x20,0xe7,0xb3,0xff,0xfe,0xcf,0x0a,0x99}, 8333},

-    {{0x26,0x01,0x01,0xc2,0x17,0x02,0x52,0x41,0x04,0x7d,0x40,0x16,0xec,0x42,0x67,0x05}, 8333},

-    {{0x26,0x01,0x04,0x41,0x41,0x01,0x70,0xcd,0x04,0xe3,0x8e,0x81,0x32,0x50,0x1f,0x0b}, 8333},

-    {{0x26,0x01,0x06,0x02,0x99,0x80,0x0f,0x78,0x02,0x11,0x11,0xff,0xfe,0xc5,0x01,0xae}, 8333},

-    {{0x26,0x01,0x06,0x46,0x41,0x03,0x17,0x9f,0x58,0x09,0x1b,0xff,0xfe,0x55,0x66,0x78}, 8333},

-    {{0x26,0x02,0x00,0x4c,0x03,0x23,0xb1,0x01,0x35,0xa3,0x9d,0xe8,0x69,0x84,0xef,0x56}, 8333},

-    {{0x26,0x02,0xff,0x62,0x01,0x04,0x0a,0xc1,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},

-    {{0x26,0x02,0xff,0xc5,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x71,0x1e}, 8333},

-    {{0x26,0x02,0xff,0xc5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x30,0x1c,0x75}, 8333},

-    {{0x26,0x04,0xa8,0x80,0x00,0x02,0x00,0xd0,0x00,0x00,0x00,0x00,0x17,0xe9,0x20,0x01}, 8333},

-    {{0x26,0x04,0xa8,0x80,0x00,0x02,0x00,0xd0,0x00,0x00,0x00,0x00,0x22,0xf8,0xf0,0x01}, 8333},

-    {{0x26,0x04,0xa8,0x80,0x00,0x02,0x00,0xd0,0x00,0x00,0x00,0x00,0x22,0xf9,0x00,0x01}, 8333},

-    {{0x26,0x04,0xa8,0x80,0x00,0x02,0x00,0xd0,0x00,0x00,0x00,0x00,0x22,0xf9,0xc0,0x01}, 8333},

-    {{0x26,0x04,0xa8,0x80,0x00,0x02,0x00,0xd0,0x00,0x00,0x00,0x00,0x22,0xf9,0xd0,0x01}, 8333},

-    {{0x26,0x04,0xa8,0x80,0x00,0x02,0x00,0xd0,0x00,0x00,0x00,0x00,0x22,0xf9,0xe0,0x01}, 8333},

-    {{0x26,0x04,0xa8,0x80,0x00,0x02,0x00,0xd0,0x00,0x00,0x00,0x00,0x22,0xfa,0x20,0x01}, 8333},

-    {{0x26,0x04,0xa8,0x80,0x00,0x02,0x00,0xd0,0x00,0x00,0x00,0x00,0x22,0xfa,0x30,0x01}, 8333},

-    {{0x26,0x04,0xa8,0x80,0x04,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x16,0x84,0x50,0x01}, 8333},

-    {{0x26,0x04,0xa8,0x80,0x04,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x1a,0xc4,0xb0,0x01}, 8333},

-    {{0x26,0x04,0xa8,0x80,0x04,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x20,0x04,0x40,0x01}, 8333},

-    {{0x26,0x04,0xa8,0x80,0x04,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x20,0x04,0x50,0x01}, 8333},

-    {{0x26,0x04,0xa8,0x80,0x04,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x20,0x04,0x60,0x01}, 8333},

-    {{0x26,0x04,0xa8,0x80,0x04,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x20,0x04,0xc0,0x01}, 8333},

-    {{0x26,0x04,0xa8,0x80,0x04,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x20,0x04,0xd0,0x01}, 8333},

-    {{0x26,0x04,0xa8,0x80,0x04,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x20,0x04,0xe0,0x01}, 8333},

-    {{0x26,0x04,0xa8,0x80,0x04,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x20,0x04,0xf0,0x01}, 8333},

-    {{0x26,0x04,0xa8,0x80,0x04,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x20,0x05,0x00,0x01}, 8333},

-    {{0x26,0x04,0xa8,0x80,0x04,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x20,0x05,0x30,0x01}, 8333},

-    {{0x26,0x04,0xa8,0x80,0x04,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x26,0x1f,0x60,0x01}, 8333},

-    {{0x26,0x04,0xa8,0x80,0x04,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x28,0xb8,0x50,0x01}, 8333},

-    {{0x26,0x04,0xa8,0x80,0x04,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x0a,0xd7,0xe0,0x01}, 8333},

-    {{0x26,0x05,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50}, 8333},

-    {{0x26,0x05,0x5d,0x80,0x20,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x45}, 8333},

-    {{0x26,0x05,0x98,0x80,0x00,0x00,0x09,0x53,0x02,0x25,0x90,0xff,0xfe,0xd2,0xc0,0xb4}, 8333},

-    {{0x26,0x06,0xc3,0x80,0x00,0x00,0x00,0x00,0x02,0x15,0x17,0xff,0xfe,0xb3,0x03,0xec}, 8333},

-    {{0x26,0x07,0x1c,0x00,0x00,0x0a,0x00,0x06,0x3c,0x1c,0x1b,0x0d,0x0b,0xa4,0x8e,0xa9}, 8333},

-    {{0x26,0x07,0x1c,0x00,0x00,0x0a,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00}, 8333},

-    {{0x26,0x07,0x44,0x80,0x00,0x02,0x20,0x00,0x02,0x50,0x56,0xff,0xfe,0x86,0x64,0x49}, 8333},

-    {{0x26,0x07,0x53,0x00,0x01,0x20,0x06,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},

-    {{0x26,0x07,0x53,0x00,0x01,0x20,0x09,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},

-    {{0x26,0x07,0x53,0x00,0x02,0x01,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x05,0x56}, 8333},

-    {{0x26,0x07,0x53,0x00,0x02,0x03,0x01,0x18,0x37,0x33,0x00,0x00,0x00,0x00,0x14,0x14}, 8333},

-    {{0x26,0x07,0x53,0x00,0x00,0x60,0x10,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x26,0x07,0x53,0x00,0x00,0x60,0x1e,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},

-    {{0x26,0x07,0x53,0x00,0x00,0x60,0x1e,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00}, 8333},

-    {{0x26,0x07,0x53,0x00,0x00,0x60,0x1e,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00}, 8333},

-    {{0x26,0x07,0x53,0x00,0x00,0x60,0x02,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x26,0x07,0x53,0x00,0x00,0x60,0x3d,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},

-    {{0x26,0x07,0x53,0x00,0x00,0x60,0x3f,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},

-    {{0x26,0x07,0x53,0x00,0x00,0x60,0x54,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},

-    {{0x26,0x07,0x53,0x00,0x00,0x60,0x0a,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x26,0x07,0x53,0x00,0x00,0x61,0x0f,0x4b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x26,0x07,0x90,0x00,0x00,0x00,0x00,0x01,0x50,0x54,0x00,0xff,0xfe,0x5d,0x26,0x4e}, 8333},

-    {{0x26,0x07,0xf1,0xc0,0x08,0x46,0x9a,0x00,0x00,0x00,0x00,0x00,0x00,0x87,0xd0,0x0e}, 8333},

-    {{0x26,0x07,0xf2,0xd8,0x40,0x05,0x00,0x0d,0xa8,0xa2,0xee,0xff,0xfe,0xe0,0xa8,0x59}, 8333},

-    {{0x26,0x07,0xf9,0x48,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x40}, 8333},

-    {{0x26,0x07,0xfa,0x18,0x3a,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50}, 8333},

-    {{0x26,0x07,0xfe,0xa8,0x3c,0xa0,0x09,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x26,0x07,0xfe,0xa8,0x4d,0xa0,0x03,0xb0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x26,0x07,0xff,0x10,0x00,0xc5,0x05,0x02,0x02,0x25,0x90,0xff,0xfe,0x32,0xd4,0x46}, 8333},

-    {{0x26,0x07,0xff,0x28,0x90,0x05,0x00,0x01,0x00,0x00,0x00,0x00,0x25,0x67,0x57,0xe0}, 8333},

-    {{0x26,0x20,0x00,0x71,0x40,0x00,0x00,0x00,0x01,0x92,0x00,0x30,0x01,0x20,0x01,0x10}, 8333},

-    {{0x26,0x20,0x00,0xb8,0x40,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x93,0x00,0x01}, 8333},

-    {{0x28,0x00,0x01,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09}, 8333},

-    {{0x28,0x01,0x00,0x84,0x00,0x00,0x10,0x34,0x76,0xd4,0x35,0xff,0xfe,0x7f,0x50,0x33}, 8333},

-    {{0x2a,0x00,0x16,0xd8,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x6a,0xc2,0x61}, 8333},

-    {{0x2a,0x00,0x17,0x68,0x20,0x01,0x00,0x24,0x00,0x00,0x00,0x00,0x01,0x48,0x02,0x18}, 8333},

-    {{0x2a,0x00,0x19,0xe0,0x00,0x01,0x00,0x01,0x02,0x25,0x90,0xff,0xfe,0xa5,0x0f,0xc0}, 8333},

-    {{0x2a,0x00,0x1a,0x48,0x78,0x10,0x01,0x01,0xbe,0x76,0x4e,0xff,0xfe,0x08,0xc7,0x74}, 8333},

-    {{0x2a,0x00,0x63,0x40,0x20,0x04,0x00,0x00,0x50,0x54,0x00,0xff,0xfe,0x54,0x03,0x8c}, 8333},

-    {{0x2a,0x00,0x7b,0x80,0x04,0x77,0x00,0x21,0x00,0x00,0x00,0x00,0x1c,0x8c,0x83,0xa6}, 8333},

-    {{0x2a,0x00,0x7c,0x80,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08}, 8333},

-    {{0x2a,0x00,0x7c,0x80,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07}, 8333},

-    {{0x2a,0x01,0x02,0x38,0x43,0x63,0x49,0x00,0xd8,0x5e,0xc1,0xd9,0x2b,0x32,0x61,0xd0}, 8333},

-    {{0x2a,0x01,0x04,0x88,0x00,0x66,0x10,0x00,0x53,0xa9,0x02,0x2b,0x00,0x00,0x00,0x01}, 8333},

-    {{0x2a,0x01,0x04,0x88,0x00,0x67,0x10,0x00,0x5b,0xfa,0x55,0x26,0x00,0x00,0x00,0x01}, 8333},

-    {{0x2a,0x01,0x04,0x88,0x00,0x67,0x10,0x00,0xb0,0x1c,0x33,0x79,0x00,0x00,0x00,0x01}, 8333},

-    {{0x2a,0x01,0x4d,0x60,0x00,0x03,0x00,0x01,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x0a,0x1d,0x8f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x0a,0x1e,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x0a,0x22,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8833},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x0a,0x23,0x9c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 9002},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x0a,0x29,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x0a,0x31,0xd3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x0a,0x3f,0xe6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x0a,0x0b,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x0b,0x12,0xd7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x0b,0x0d,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x0b,0x0e,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x0b,0x0e,0xe1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x10,0x51,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x10,0x52,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x10,0x53,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x20,0x43,0xe4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x30,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x30,0x43,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x30,0x61,0x8e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x30,0x71,0xd2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x30,0x74,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x31,0x33,0xad,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x31,0x33,0xad,0xfe,0xa1,0x00,0x00,0x00,0x00,0x06,0x66}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x31,0x34,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x40,0x13,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x40,0x52,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x40,0x60,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x40,0x74,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x40,0x93,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x41,0x22,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x41,0x22,0xae,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x50,0x11,0xd4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x50,0x70,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x50,0x72,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x50,0x72,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x50,0x90,0xca,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x51,0x30,0xc9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x51,0x33,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x51,0x71,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x60,0x41,0xf0,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x33}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x60,0x63,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x61,0x70,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x62,0x21,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x62,0x31,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x62,0x42,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x71,0x1c,0x1b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x71,0x01,0xc3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x71,0x22,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x71,0x27,0xd6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},


 -    {{0x2a,0x01,0x04,0xf8,0x01,0x71,0x2f,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x71,0x0d,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x72,0x10,0xda,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x72,0x05,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x73,0x16,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x73,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x90,0x24,0xeb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x90,0x52,0x8d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x90,0x61,0xf3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x91,0x41,0x8f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 3333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x91,0x63,0xb4,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x91,0x81,0xb7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x91,0x83,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x92,0x04,0xa5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x01,0x92,0x52,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x02,0x00,0x10,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x02,0x00,0x32,0xa6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x02,0x00,0x41,0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x02,0x00,0x41,0x6a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x02,0x00,0x90,0xc3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x02,0x01,0x14,0x8d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x02,0x01,0x02,0xcc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x02,0x01,0x03,0xe3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x02,0x01,0x53,0xcc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x02,0x01,0x60,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x02,0x02,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x02,0x02,0x31,0xe3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x02,0x02,0x32,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x02,0x02,0x60,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x02,0x10,0x54,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x02,0x11,0x1e,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x02,0x11,0x1e,0xc5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x02,0x12,0x18,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x02,0x21,0x0f,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x10,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x10,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x10,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x10,0x5f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x10,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x10,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x10,0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x10,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x11,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x11,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x11,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x11,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x11,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x11,0x5c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x11,0x5e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x11,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x11,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x11,0x7b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x11,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x11,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x11,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x11,0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x11,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x11,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x11,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x11,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x01,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x01,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x15,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x1d,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x1f,0xf7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x22,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x07,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x07,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x07,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x07,0xa9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x07,0xe9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x08,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x08,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x08,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x08,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x08,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x08,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x08,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x08,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x08,0xc9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x08,0xd1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x08,0xd2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x08,0xd9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x08,0xda,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x08,0xdc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x08,0xf1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x09,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x09,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x09,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x09,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x09,0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x09,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x09,0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x09,0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x09,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x09,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x0b,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x0b,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x0b,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x0c,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x0c,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x0c,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x0c,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x0c,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x0c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x0c,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x0c,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x0c,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x0c,0x5e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x0c,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x0c,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x0c,0x79,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x0c,0xb1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x0c,0xf5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x0c,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x0d,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x0d,0x1b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x0d,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x0d,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x0d,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x0e,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x0e,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x0e,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x0e,0x5b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x0e,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x0f,0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x0f,0x76,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x0f,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x0f,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x0f,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x0f,0x8a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x0f,0xd6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x0c,0x0f,0xea,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x17,0x24,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x17,0x2c,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x17,0x33,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x17,0x34,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x17,0x39,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x17,0x3b,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x17,0x3d,0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x17,0x42,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x17,0x5d,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x17,0x63,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x17,0x67,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x17,0x71,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x04,0xf8,0x0c,0x17,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x06,0x80,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x2a,0x01,0x06,0xf0,0xff,0xff,0x01,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0xcb}, 8333},

-    {{0x2a,0x01,0x07,0x9d,0xb7,0xdd,0xff,0xb4,0x5d,0x86,0x70,0xb8,0xfc,0x7f,0xf2,0x53}, 8333},

-    {{0x2a,0x01,0x07,0xa0,0x00,0x02,0x13,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04}, 8333},

-    {{0x2a,0x01,0x07,0xa0,0x00,0x02,0x13,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05}, 8333},

-    {{0x2a,0x01,0x07,0xa0,0x00,0x02,0x13,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03}, 8333},

-    {{0x2a,0x01,0x07,0xc8,0xaa,0xaa,0x03,0x73,0x50,0x54,0x00,0xff,0xfe,0xb3,0x29,0x47}, 8333},

-    {{0x2a,0x01,0x07,0xc8,0xaa,0xaa,0x03,0xa0,0x50,0x54,0x00,0xff,0xfe,0x8c,0x97,0x4c}, 8333},

-    {{0x2a,0x01,0x07,0xc8,0xaa,0xb0,0x04,0xb7,0x91,0x0d,0x62,0x5e,0xa1,0x3e,0xc3,0x42}, 8333},

-    {{0x2a,0x01,0x07,0xc8,0xaa,0xb5,0x03,0xe6,0x50,0x54,0x00,0xff,0xfe,0xd7,0x4e,0x54}, 8333},

-    {{0x2a,0x01,0x07,0xc8,0xaa,0xb5,0x04,0x1e,0x50,0x54,0x00,0xff,0xfe,0x38,0xf4,0xfb}, 8333},

-    {{0x2a,0x01,0x07,0xc8,0xaa,0xba,0x03,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x33}, 8333},

-    {{0x2a,0x01,0x07,0xc8,0xaa,0xbc,0x01,0x8c,0x50,0x54,0x00,0xff,0xfe,0xfd,0x3b,0x49}, 8333},

-    {{0x2a,0x01,0x07,0xc8,0xaa,0xbd,0x03,0xd5,0x50,0x54,0x00,0xff,0xfe,0x95,0xf5,0x86}, 8333},

-    {{0x2a,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x50,0x94,0xb8}, 8333},

-    {{0x2a,0x01,0x8e,0x01,0xb9,0x43,0x3a,0x63,0xd2,0x50,0x99,0xff,0xfe,0x1f,0x4f,0xb2}, 8333},

-    {{0x2a,0x01,0xb2,0xe0,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40}, 8333},

-    {{0x2a,0x01,0x00,0xd0,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x45}, 8333},

-    {{0x2a,0x01,0x00,0xd0,0x8f,0xc3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x01,0x0e,0x34,0xec,0x29,0xe8,0xd0,0x25,0xc7,0xc1,0xce,0xb7,0xa3,0xd2,0x38}, 8333},

-    {{0x2a,0x01,0x0e,0x34,0xec,0x4a,0xc2,0xd0,0x1c,0xf3,0x40,0xd2,0xa7,0x9f,0x39,0x01}, 8333},

-    {{0x2a,0x01,0x0e,0x34,0xee,0xd7,0x66,0x70,0xec,0x1b,0xbf,0x7c,0xb0,0x12,0x60,0x69}, 8333},

-    {{0x2a,0x01,0x0e,0x35,0x24,0x33,0xe3,0x20,0x9c,0x8e,0x6f,0xf0,0x99,0x0f,0xf0,0x6e}, 8333},

-    {{0x2a,0x01,0x0e,0x35,0x2e,0xe5,0x06,0x10,0x02,0x1f,0xd0,0xff,0xfe,0x4e,0x74,0x60}, 8333},

-    {{0x2a,0x02,0x12,0x05,0x50,0x51,0xa6,0x40,0xd6,0xae,0x52,0xff,0xfe,0xa3,0x00,0xac}, 8333},

-    {{0x2a,0x02,0x12,0x0b,0x2c,0x2a,0x5e,0xc0,0x10,0xdd,0x31,0xff,0xfe,0x42,0x50,0x79}, 8333},

-    {{0x2a,0x02,0x01,0x68,0x62,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x14}, 8333},

-    {{0x2a,0x02,0x01,0x80,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18}, 8333},

-    {{0x2a,0x02,0x01,0x80,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xed}, 8333},

-    {{0x2a,0x02,0x18,0x11,0xb7,0x07,0x01,0x16,0x8c,0x1f,0xc5,0xbe,0xbf,0x3a,0x54,0xdf}, 8333},

-    {{0x2a,0x02,0x20,0xc8,0x14,0x22,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa3}, 8333},

-    {{0x2a,0x02,0x21,0x68,0x0d,0x05,0x2c,0x00,0x02,0x16,0x3e,0xff,0xfe,0xf7,0xa0,0x99}, 8333},

-    {{0x2a,0x02,0x27,0xf8,0x20,0x12,0x00,0x00,0xe9,0xf7,0x26,0x8f,0xc4,0x41,0x61,0x29}, 8333},

-    {{0x2a,0x02,0x28,0x08,0x54,0x01,0x00,0x00,0x02,0x25,0x90,0xff,0xfe,0x4e,0xee,0x42}, 8333},

-    {{0x2a,0x02,0x03,0x90,0x90,0x00,0x00,0x00,0x02,0x18,0x7d,0xff,0xfe,0x10,0xbe,0x33}, 8333},

-    {{0x2a,0x02,0x7a,0xa0,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0x4e,0x12,0x19}, 8333},

-    {{0x2a,0x02,0x7a,0xa0,0x16,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x90,0xeb,0xa2}, 8333},

-    {{0x2a,0x02,0x7a,0xa0,0x16,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0xa7,0xa2,0x7e,0x86}, 8333},

-    {{0x2a,0x02,0xc2,0x00,0x00,0x01,0x00,0x10,0x00,0x02,0x00,0x05,0x08,0x00,0x00,0x01}, 8333},

-    {{0x2a,0x02,0xc2,0x05,0x20,0x02,0x25,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17}, 8333},

-    {{0x2a,0x02,0xc2,0x05,0x20,0x08,0x02,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x2a,0x02,0xc2,0x05,0x20,0x10,0x54,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x2a,0x02,0xc2,0x05,0x30,0x01,0x67,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x2a,0x02,0xc2,0x05,0x30,0x01,0x77,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},

-    {{0x2a,0x02,0xc2,0x05,0x30,0x02,0x08,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x2a,0x02,0xc2,0x07,0x20,0x02,0x90,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x2a,0x02,0xc2,0x07,0x20,0x08,0x33,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x2a,0x02,0xc2,0x07,0x20,0x08,0x83,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x2a,0x02,0xc2,0x07,0x20,0x09,0x02,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x2a,0x02,0xc2,0x07,0x20,0x10,0x77,0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x2a,0x02,0xc2,0x07,0x20,0x10,0x79,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x2a,0x02,0xc2,0x07,0x20,0x11,0x78,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x2a,0x02,0xc2,0x07,0x20,0x11,0x82,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x2a,0x02,0xc2,0x07,0x20,0x12,0x21,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x2a,0x02,0xc2,0x07,0x20,0x12,0x02,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x2a,0x02,0xc2,0x07,0x20,0x12,0x26,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x2a,0x02,0xc2,0x07,0x20,0x12,0x36,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x2a,0x02,0xc2,0x07,0x20,0x12,0x48,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x2a,0x02,0xc2,0x07,0x20,0x12,0x56,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x2a,0x02,0xc2,0x07,0x30,0x01,0x58,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x2a,0x02,0xc2,0x07,0x30,0x01,0x77,0x76,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x2a,0x02,0xc2,0x07,0x30,0x02,0x06,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x2a,0x02,0xce,0x80,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x2a,0x03,0x22,0x60,0x01,0x1e,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08}, 8333},

-    {{0x2a,0x03,0x22,0x60,0x01,0x1e,0x03,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03}, 8333},

-    {{0x2a,0x03,0x40,0x00,0x00,0x02,0x04,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08}, 8333},

-    {{0x2a,0x03,0x40,0x00,0x00,0x06,0x12,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},

-    {{0x2a,0x03,0x40,0x00,0x00,0x06,0x41,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x12,0x19,0x60,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x1b,0x99,0xc0,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x1b,0x99,0xe0,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x1b,0x9a,0x30,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x23,0xf7,0x10,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x23,0xf7,0x20,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x23,0xf7,0x40,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x23,0xf7,0x50,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x23,0xf7,0x70,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x23,0xf7,0x90,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x23,0xfb,0x10,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x23,0xfb,0x20,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x23,0xfb,0x30,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x23,0xfb,0x50,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x23,0xfb,0x60,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x23,0xfb,0x80,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x23,0xff,0xb0,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x24,0x00,0x00,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x24,0x00,0x30,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x24,0x00,0x40,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x24,0x00,0xe0,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x24,0x00,0xf0,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x24,0x01,0xe0,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x24,0x02,0x20,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x24,0x02,0x80,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x24,0x02,0x90,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x24,0x02,0xb0,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x24,0x02,0xd0,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x24,0x02,0xe0,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x24,0x03,0x10,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x24,0x03,0x20,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x24,0x03,0x30,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x24,0x03,0x40,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x24,0x03,0x60,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x24,0x03,0xa0,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x24,0x03,0xb0,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x24,0x03,0xe0,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x24,0x03,0xf0,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x24,0x04,0x00,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x24,0x04,0x30,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x24,0x04,0x40,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x24,0x04,0x60,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x24,0x04,0x80,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x24,0x04,0x90,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x24,0x04,0xb0,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x24,0x05,0x20,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x24,0x05,0x30,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x24,0x05,0x80,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x24,0x05,0x90,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x24,0x05,0xa0,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x44,0xb8,0x90,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x44,0xb8,0xe0,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x44,0xb8,0xf0,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x44,0xb9,0x00,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x44,0xb9,0x10,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x44,0xb9,0x20,0x01}, 8333},

-    {{0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x44,0xb9,0x40,0x01}, 8333},

-    {{0x2a,0x04,0x21,0x80,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94}, 8333},

-    {{0x2a,0x04,0x35,0x42,0x10,0x00,0x09,0x10,0x84,0x92,0xb8,0xff,0xfe,0x91,0x71,0x1d}, 8333},

-    {{0x2a,0x04,0x52,0xc0,0x01,0x01,0x01,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x8e}, 8333},

-    {{0x2a,0x05,0x35,0x80,0xd4,0x00,0x14,0x0d,0xda,0x6e,0x82,0x6e,0xe7,0x71,0x41,0x00}, 8333},

-    {{0x2a,0x06,0x9f,0xc0,0x2a,0x06,0x9f,0xc0,0x2a,0x06,0x9f,0xc1,0x06,0x7c,0xe7,0x06}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xd6,0xbc,0x4a,0x3c,0x6d,0x03,0xa9,0x4e,0x1f,0x55}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xd1,0x62,0x6b,0xbc,0x9d,0x61,0xc8,0x63,0xe1,0xcc}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xda,0x0e,0x96,0xca,0xb6,0x16,0xef,0xe1,0xbf,0x4e}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xdd,0xbf,0xf3,0xc5,0x0b,0x37,0xa1,0xee,0x39,0xeb}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xe2,0xe5,0xc7,0x79,0x12,0xc8,0x87,0xf6,0x28,0xb6}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xe3,0xf6,0x00,0xa6,0xf0,0x7b,0xf3,0x74,0x7e,0x08}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xef,0x3c,0x49,0x0b,0xc1,0x74,0xc2,0x92,0x86,0xe1}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xeb,0x24,0x59,0xe2,0x79,0x5c,0xa4,0xa8,0xf2,0x93}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xec,0xf1,0xe8,0xdd,0xe6,0x8a,0x98,0x36,0xab,0x80}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x02,0x99,0x0c,0x51,0x03,0x89,0x7b,0xe4,0x3f,0x5e}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x02,0xce,0xb2,0x1a,0x69,0x50,0xd8,0x18,0x4a,0xb3}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x08,0x0a,0xae,0xa1,0xc0,0x9a,0xcd,0x3f,0x8c,0xcb}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x0d,0x1f,0xd6,0xf4,0x9b,0x55,0x23,0x54,0xe4,0xbb}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x12,0x70,0x61,0xfd,0xf4,0xea,0xe0,0xa5,0x63,0xa9}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x16,0x2a,0xf3,0x4f,0x5d,0xd7,0xf8,0x8e,0x87,0xe2}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x19,0x14,0x9e,0x58,0x02,0xc5,0x9f,0x09,0x00,0x7b}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x1c,0x1f,0x7b,0x2d,0xed,0xae,0xf3,0xb3,0xe5,0xab}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x1c,0x41,0x1c,0xbf,0x02,0x0c,0xef,0x60,0x89,0x63}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x1c,0x5f,0xc7,0xd4,0x89,0xc0,0x6f,0xa2,0x24,0x71}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x1d,0xd4,0xc9,0xb2,0xc8,0x87,0xc6,0x39,0x9a,0x8b}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x27,0x93,0xdf,0xe5,0x58,0x40,0x69,0xa9,0x30,0x03}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x22,0x45,0x02,0x56,0x89,0x14,0x17,0x38,0x37,0xe3}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x24,0x0c,0x19,0xe8,0xc7,0x2d,0x65,0x23,0x86,0xae}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x29,0x91,0x93,0x28,0x6d,0x68,0xd0,0xb7,0x79,0x40}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x2c,0x2f,0x47,0xf1,0xc4,0xae,0xf6,0x42,0x20,0x66}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x30,0x7b,0x87,0xc2,0x7e,0xd8,0xe9,0xbb,0x14,0xed}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x31,0x87,0x8d,0x3c,0x3a,0x05,0x56,0x19,0xa6,0xd0}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x38,0x0e,0x75,0xb8,0x99,0xc1,0x60,0x7d,0x9c,0x48}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x41,0xc7,0x5f,0x07,0x39,0xd1,0xaf,0xfd,0x16,0x5f}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x43,0x7f,0x1e,0xa0,0x8e,0xfb,0x8c,0xab,0x85,0xa4}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x55,0x47,0xce,0x4a,0xdf,0x92,0x83,0xd2,0xb9,0x76}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x63,0x7f,0xce,0x1c,0x28,0x70,0x30,0xdd,0xb9,0x32}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x64,0xb8,0xd9,0xc6,0x28,0x91,0x6f,0x97,0xd5,0x98}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x6f,0x57,0x0b,0x3d,0x20,0x0c,0x0d,0xed,0x20,0xf7}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x77,0x24,0xbe,0xb4,0x1e,0x49,0x20,0x64,0x6d,0x7e}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x73,0x13,0x5d,0x71,0xa1,0x12,0xb8,0xae,0xd0,0x7e}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x7b,0xb6,0x9d,0x1c,0xaa,0x61,0x7f,0x23,0xef,0xce}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x7c,0x84,0xef,0x06,0xe9,0x25,0x96,0x98,0x8b,0x37}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x82,0x3b,0x88,0xf9,0x75,0x58,0x95,0x92,0x95,0xd1}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x82,0xeb,0xe7,0xe3,0xc7,0x1c,0xf2,0x87,0xb6,0x6d}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x86,0x1a,0xc7,0x98,0x61,0x7e,0xb7,0x7c,0x15,0xa9}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x89,0xe6,0x0b,0x0a,0x5f,0xb8,0x15,0xc3,0x23,0x73}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x8a,0x40,0x2b,0x4b,0xfd,0xf8,0x11,0xef,0x2e,0x24}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x8a,0x56,0xd7,0xec,0xf6,0xac,0x64,0xc0,0x3f,0xc4}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x8a,0x87,0x58,0x0a,0x33,0x2d,0x7d,0x89,0xf1,0xd8}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x8a,0xc0,0x54,0x31,0x42,0x9d,0x73,0xed,0xad,0x66}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x8a,0xd3,0xc7,0xbd,0xca,0xe0,0xdb,0x21,0xd3,0xad}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x91,0x1d,0x25,0x50,0x79,0x57,0xaa,0xdf,0x32,0x19}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x98,0x31,0x04,0x77,0xf3,0x2a,0x31,0xfb,0xee,0xaa}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x98,0x8e,0xe7,0xfb,0xfe,0x4f,0xb0,0xf7,0xda,0xcc}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x9c,0x63,0x3c,0x3f,0x72,0x44,0x59,0x69,0xcf,0x14}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x9d,0xf9,0x91,0xfc,0x7d,0x25,0xdc,0xd6,0x85,0x67}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xa7,0x08,0x20,0xfe,0x77,0xba,0x3c,0xbd,0x99,0x17}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xa3,0x05,0x71,0x30,0xb8,0x15,0x48,0x9b,0x6b,0xdc}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xaf,0xef,0x01,0xf3,0x4e,0x11,0x18,0x05,0xd2,0x23}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xa8,0x75,0xef,0xb2,0x7b,0x5b,0x6c,0x51,0xb0,0x61}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xa9,0x2b,0xb6,0xf4,0xb7,0x2c,0x67,0x04,0xf8,0x9d}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xaa,0x24,0x4a,0xc5,0x19,0xce,0xe1,0x4c,0x00,0xc9}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xab,0xcd,0xe7,0xf4,0x9d,0x5b,0x77,0xb1,0xc2,0x6f}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xac,0x75,0x1a,0x02,0x48,0x68,0x0a,0xec,0x6c,0xab}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xbf,0x9f,0x33,0xd4,0x7d,0xbf,0x80,0x1c,0x15,0xdf}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xb8,0x6c,0x1c,0xc6,0x4f,0xa8,0x2b,0xfa,0x75,0x04}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xb9,0x44,0x4a,0xb6,0x0b,0xd0,0x8e,0xd0,0x59,0x4e}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xc0,0x91,0x56,0xb9,0x9c,0xe0,0xd9,0x7b,0xf1,0xc1}, 8333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xc6,0x47,0x55,0xd7,0xa3,0x02,0x26,0x02,0x91,0x4d}, 8333}

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x27,0x40,0x07}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x2d,0x45,0x0d}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x64,0xf9,0xc5}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xe4,0x07,0x92}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xff,0x5a,0xea}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0x1c,0x80,0x41}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0x5e,0x1c,0xb6}, 9335},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0xec,0x64,0x0b}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xd6,0x36,0xb3}, 10333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xdc,0x9e,0x97}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1b,0x60,0x33,0x0f}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0x83,0x14,0x55}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0xa5,0x32,0x9c}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x22,0xc1,0x44,0x0a}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x18,0x7c,0xb1}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x3d,0xd1,0x90}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x8f,0x08,0x66}, 28333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x9d,0xb7,0x10}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0xdd,0xc6,0x39}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2a,0x33,0x0c,0xdc}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2a,0x33,0x99,0x50}, 8332},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x37,0xb0,0x1a}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x3f,0x5d,0x4b}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x4c,0xac,0xd3}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x17,0x55,0x19}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x20,0x32,0x62}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xa6,0x81,0xba}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x36,0xcf,0x5b}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x37,0x5f,0xe3}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x58,0x98,0x8d}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5a,0x78,0x9d}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x84,0x03}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0xbb,0x10,0xaf}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x33,0x07,0x4d,0xb9}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x33,0x0f,0x40,0xa6}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x07,0x87,0x45}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x3f,0x0c,0x6d}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x95,0xce,0x16}, 18891},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0x6a,0x10,0x6f}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0x6a,0x1b,0xdb}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0x70,0x0b,0xbc}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0x98,0x36,0x2c}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0xe8,0x88,0xf3}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3f,0xe0,0x37,0x4a}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3f,0xe7,0xef,0xd4}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x41,0x46,0x13,0x31}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0xac,0x68,0x50}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0xc4,0x05,0x21}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x44,0x3f,0x08,0x24}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0xaf,0x31,0xe2}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x47,0x78,0xbc,0x52}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0x87,0xeb,0xf6}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0xb4,0x6b,0xc1}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4a,0x4d,0x50,0x2c}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0x0c,0xf7,0x2d}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0x5c,0x88,0x4b}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0xa9,0x39,0x5c}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0x4d,0x2e,0xfa}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x1f,0x42,0xaa}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x3a,0x9a,0x16}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x9e,0x84,0x0e}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0xed,0xeb,0x65}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0xed,0xf0,0x66}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x04,0x67,0x30}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x1b,0x60,0x25}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xc0,0x40,0x88}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xd0,0x63,0x0d}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x4e,0xe6,0x1e}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x53,0x00,0x64}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xa2,0xc4,0xc0}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xd4,0x61,0x22}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x32,0xf2,0x88}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0xd7,0x50,0x2b}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0xea,0x34,0xbe}, 37700},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0x15,0x90,0xa3}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0x15,0x90,0xe2}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0x19,0x4a,0x94}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0x19,0x8a,0x47}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0x69,0xc4,0xd1}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0x8f,0x89,0xce}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0xc2,0xee,0x82}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0xea,0x96,0xc7}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x56,0x0e,0x8f,0xb0}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0x4f,0x5e,0xdd}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0xec,0x1b,0x9b}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x54,0x18,0xce}, 10333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x57,0x4e,0x7e}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0xc4,0x88,0x1f}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0xca,0xca,0xdd}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0xd0,0x03,0x52}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0x16,0x68,0x30}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0x16,0x97,0xd3}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0x62,0x8c,0x58}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0xd4,0x4b,0x06}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0xfc,0x1c,0x1a}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5a,0xb1,0x30,0x68}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x6d,0x70,0x5a}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x6d,0x70,0x5e}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x98,0x79,0x44}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xcd,0xd9,0x8e}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xe2,0x0a,0x5a}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xe4,0x9b,0x3f}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xf0,0x8d,0xaf}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0x64,0x33,0x30}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0xbe,0x8c,0xc6}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0x1f,0xaa,0x31}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0xae,0x65,0x0e}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0xd3,0x8a,0x58}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0xd5,0x8f,0x0d}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0xd5,0xd2,0x8d}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x60,0x2a,0xf8,0x95}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x60,0x7f,0xaf,0xc2}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x61,0x51,0x98,0x82}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x61,0x6b,0xbc,0xb1}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x64,0xae,0x8a}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x67,0x03,0xbc,0xbd}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x67,0x07,0x20,0x28}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x67,0x50,0xa8,0x39}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x67,0x52,0x38,0x19}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x67,0xfa,0x04,0x4a}, 41888},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0x23,0x60,0xff}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0x96,0x2d,0xd2}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0x9b,0x85,0xe6}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0xb6,0xeb,0x35}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0xc5,0xd8,0xe4}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6c,0x3b,0x07,0xd6}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6c,0x3b,0x09,0x0e}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0x3d,0x66,0x05}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0x6f,0xb2,0xbb}, 10333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xa9,0x47,0x11}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xc9,0xb7,0x7d}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x09,0x74,0x44}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x1c,0x3d,0xc9}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0x1c,0x46,0x90}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x79,0x0e,0x9a,0x31}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x79,0x2a,0xb8,0x08}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7b,0x01,0xaa,0x2e}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7c,0xbe,0x0c,0x56}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x82,0xf0,0x16,0xca}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x86,0x77,0xb3,0xea}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0x3b,0xb4,0x0f}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0xa2,0x39,0x15}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8c,0xba,0x2a,0x2c}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8e,0x04,0xd0,0x20}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8f,0x59,0x6f,0x6f}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x90,0x4c,0x28,0x90}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x90,0xac,0x47,0x8a}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x94,0xfb,0x2c,0x86}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9b,0x04,0x0f,0x34}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9b,0xcf,0x3c,0x30}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9e,0x81,0xd4,0xfb}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xd5,0xfc,0x2e}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xdd,0x0c,0x74}, 10333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa6,0x46,0x5e,0x6a}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa9,0x2c,0x22,0x58}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xab,0x19,0xdd,0x28}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0x33,0xb1,0x02}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0x4f,0xc4,0xa0}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0x50,0xbe,0x56}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xd1,0x2c,0x22}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xff,0xcc,0x7c}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xae,0x31,0xf8,0xbc}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x0f,0x9e,0xed}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x14,0x37,0xea}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x9b,0x33,0x36}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0xee,0xe1,0xa8}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb7,0x6f,0x0a,0x43}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb8,0xa4,0x93,0x52}, 21333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x08,0xa5,0x96}, 10333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x15,0xdf,0xe7}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x32,0xd5,0x7c}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x67,0xf3,0x85}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x6a,0x7a,0xc0}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x8d,0x18,0x7f}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0xa3,0x7d,0x43}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0xc2,0x8c,0x9b}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0xb6,0x6d,0xd8}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0xd6,0x1e,0x8a}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbe,0x70,0xf2,0xb2}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbf,0x65,0xec,0xde}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0x03,0xa5,0x1e}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0xbb,0x74,0xf2}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x21,0xaa,0x7f}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x2e,0x50,0x65}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x3a,0xc4,0xd4}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x92,0x29,0x2e}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0x18,0xb6,0x1b}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0x3f,0x8f,0xc5}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0x4f,0x08,0x24}, 10333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0x4f,0x08,0x25}, 10333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0x87,0x58,0x8e}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0x03,0xfe,0x30}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0x84,0x3d,0x52}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0xa6,0x9d,0x61}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0xa9,0x8a,0x02}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0xe1,0xe6,0x1c}, 10333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0x30,0xd8,0x31}, 9933},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0x62,0x30,0xc0}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc7,0xcc,0xb9,0xda}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcc,0x6f,0xf1,0xc3}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0x29,0xba,0x4e}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0x49,0x8e,0xe2}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0x7e,0x6b,0xa6}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd2,0x38,0x3c,0x1a}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd3,0x16,0x1d,0x22}, 19262},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd3,0x95,0xa1,0x68}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd3,0x95,0xe0,0xea}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x01,0x65,0x44}, 10333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x2f,0xfc,0x0d}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x5d,0xe2,0x5a}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0xa0,0xed,0x2c}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x88,0x47,0x8f}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0xa4,0x8a,0x0d}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x14,0x82,0x48}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x70,0xfb,0x15}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xda,0xa1,0x2f,0x3d}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xdb,0x71,0xf4,0x34}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xdb,0x75,0xf8,0x37}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xdd,0x8d,0x03,0x0c}, 9333},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xdd,0x8d,0x03,0x1a}, 9333}

 };

 

 static SeedSpec6 pnSeed6_test[] = {

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x99,0xcb,0x26,0x31,0xba,0x48,0x51,0x31,0x39,0x0d}, 18333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x44,0xf4,0xf4,0xf0,0xbf,0xf7,0x7e,0x6d,0xc4,0xe8}, 18333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x6a,0x8b,0xd2,0x78,0x3f,0x7a,0xf8,0x92,0x8f,0x80}, 18333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xe6,0x4e,0xa4,0x47,0x4e,0x2a,0xfe,0xe8,0x95,0xcc}, 18333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x9f,0xae,0x9f,0x59,0x0b,0x3f,0x31,0x3a,0x8a,0x5f}, 18333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x47,0xb1,0xe4,0x55,0xd1,0xb0,0x14,0x3f,0xb6,0xdb}, 18333},

-    {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xa0,0x60,0x9e,0x46,0x54,0xdb,0x61,0x3b,0xb2,0x6f}, 18333}

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x21,0x6b,0x5c}, 19335},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x4c,0x5c,0x54}, 19335},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x5d,0x51,0x54}, 19335},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0xb2,0xb6,0x23}, 19335},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x2f,0x22,0xe4}, 19335},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0xb0,0xed,0xa7}, 19335},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0xea,0x41,0x70}, 19335},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0x83,0xa1,0xab}, 19335},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xec,0xd3,0xce}, 19335},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xf3,0x26,0x22}, 19335},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6c,0x3d,0xc3,0x97}, 19335},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8a,0xc5,0xdc,0xd9}, 19335},

+    {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xd1,0x2c,0x22}, 19335}

 };

 #endif // BITCOIN_CHAINPARAMSSEEDS_H

--- a/src/clientversion.cpp

+++ b/src/clientversion.cpp

@@ -13,7 +13,7 @@

  * for both bitcoind and bitcoin-core, to make it harder for attackers to

  * target servers or GUI users specifically.

  */

-const std::string CLIENT_NAME("Satoshi");

+const std::string CLIENT_NAME("LitecoinCore");

 

 /**

  * Client version number

--- /dev/null

+++ b/src/crypto/scrypt-sse2.cpp

@@ -0,0 +1,140 @@

+/*

+ * Copyright 2009 Colin Percival, 2011 ArtForz, 2012-2013 pooler

+ * All rights reserved.

+ *

+ * Redistribution and use in source and binary forms, with or without

+ * modification, are permitted provided that the following conditions

+ * are met:

+ * 1. Redistributions of source code must retain the above copyright

+ *    notice, this list of conditions and the following disclaimer.

+ * 2. Redistributions in binary form must reproduce the above copyright

+ *    notice, this list of conditions and the following disclaimer in the

+ *    documentation and/or other materials provided with the distribution.

+ *

+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND

+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE

+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE

+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL

+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS

+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)

+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT

+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY

+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF

+ * SUCH DAMAGE.

+ *

+ * This file was originally written by Colin Percival as part of the Tarsnap

+ * online backup system.

+ */

+

+#if defined(USE_SSE2)

+

+#include "crypto/scrypt.h"

+#include <stdlib.h>

+#include <stdint.h>

+#include <string.h>

+#include <openssl/sha.h>

+

+#include <emmintrin.h>

+

+static inline void xor_salsa8_sse2(__m128i B[4], const __m128i Bx[4])

+{

+ __m128i X0, X1, X2, X3;

+ __m128i T;

+ int i;

+

+ X0 = B[0] = _mm_xor_si128(B[0], Bx[0]);

+ X1 = B[1] = _mm_xor_si128(B[1], Bx[1]);

+ X2 = B[2] = _mm_xor_si128(B[2], Bx[2]);

+ X3 = B[3] = _mm_xor_si128(B[3], Bx[3]);

+

+ for (i = 0; i < 8; i += 2) {

+ /* Operate on "columns". */

+ T = _mm_add_epi32(X0, X3);

+ X1 = _mm_xor_si128(X1, _mm_slli_epi32(T, 7));

+ X1 = _mm_xor_si128(X1, _mm_srli_epi32(T, 25));

+ T = _mm_add_epi32(X1, X0);

+ X2 = _mm_xor_si128(X2, _mm_slli_epi32(T, 9));

+ X2 = _mm_xor_si128(X2, _mm_srli_epi32(T, 23));

+ T = _mm_add_epi32(X2, X1);

+ X3 = _mm_xor_si128(X3, _mm_slli_epi32(T, 13));

+ X3 = _mm_xor_si128(X3, _mm_srli_epi32(T, 19));

+ T = _mm_add_epi32(X3, X2);

+ X0 = _mm_xor_si128(X0, _mm_slli_epi32(T, 18));

+ X0 = _mm_xor_si128(X0, _mm_srli_epi32(T, 14));

+

+ /* Rearrange data. */

+ X1 = _mm_shuffle_epi32(X1, 0x93);

+ X2 = _mm_shuffle_epi32(X2, 0x4E);

+ X3 = _mm_shuffle_epi32(X3, 0x39);

+

+ /* Operate on "rows". */

+ T = _mm_add_epi32(X0, X1);

+ X3 = _mm_xor_si128(X3, _mm_slli_epi32(T, 7));

+ X3 = _mm_xor_si128(X3, _mm_srli_epi32(T, 25));

+ T = _mm_add_epi32(X3, X0);

+ X2 = _mm_xor_si128(X2, _mm_slli_epi32(T, 9));

+ X2 = _mm_xor_si128(X2, _mm_srli_epi32(T, 23));

+ T = _mm_add_epi32(X2, X3);

+ X1 = _mm_xor_si128(X1, _mm_slli_epi32(T, 13));

+ X1 = _mm_xor_si128(X1, _mm_srli_epi32(T, 19));

+ T = _mm_add_epi32(X1, X2);

+ X0 = _mm_xor_si128(X0, _mm_slli_epi32(T, 18));

+ X0 = _mm_xor_si128(X0, _mm_srli_epi32(T, 14));

+

+ /* Rearrange data. */

+ X1 = _mm_shuffle_epi32(X1, 0x39);

+ X2 = _mm_shuffle_epi32(X2, 0x4E);

+ X3 = _mm_shuffle_epi32(X3, 0x93);

+ }

+

+ B[0] = _mm_add_epi32(B[0], X0);

+ B[1] = _mm_add_epi32(B[1], X1);

+ B[2] = _mm_add_epi32(B[2], X2);

+ B[3] = _mm_add_epi32(B[3], X3);

+}

+

+void scrypt_1024_1_1_256_sp_sse2(const char *input, char *output, char *scratchpad)

+{

+ uint8_t B[128];

+ union {

+ __m128i i128[8];

+ uint32_t u32[32];

+ } X;

+ __m128i *V;

+ uint32_t i, j, k;

+

+ V = (__m128i *)(((uintptr_t)(scratchpad) + 63) & ~ (uintptr_t)(63));

+

+ PBKDF2_SHA256((const uint8_t *)input, 80, (const uint8_t *)input, 80, 1, B, 128);

+

+ for (k = 0; k < 2; k++) {

+ for (i = 0; i < 16; i++) {

+ X.u32[k * 16 + i] = le32dec(&B[(k * 16 + (i * 5 % 16)) * 4]);

+ }

+ }

+

+ for (i = 0; i < 1024; i++) {

+ for (k = 0; k < 8; k++)

+ V[i * 8 + k] = X.i128[k];

+ xor_salsa8_sse2(&X.i128[0], &X.i128[4]);

+ xor_salsa8_sse2(&X.i128[4], &X.i128[0]);

+ }

+ for (i = 0; i < 1024; i++) {

+ j = 8 * (X.u32[16] & 1023);

+ for (k = 0; k < 8; k++)

+ X.i128[k] = _mm_xor_si128(X.i128[k], V[j + k]);

+ xor_salsa8_sse2(&X.i128[0], &X.i128[4]);

+ xor_salsa8_sse2(&X.i128[4], &X.i128[0]);

+ }

+

+ for (k = 0; k < 2; k++) {

+ for (i = 0; i < 16; i++) {

+ le32enc(&B[(k * 16 + (i * 5 % 16)) * 4], X.u32[k * 16 + i]);

+ }

+ }

+

+ PBKDF2_SHA256((const uint8_t *)input, 80, B, 128, 1, (uint8_t *)output, 32);

+}

+

+#endif // USE_SSE2

--- /dev/null

+++ b/src/crypto/scrypt.cpp

@@ -0,0 +1,331 @@

+/*

+ * Copyright 2009 Colin Percival, 2011 ArtForz, 2012-2013 pooler

+ * All rights reserved.

+ *

+ * Redistribution and use in source and binary forms, with or without

+ * modification, are permitted provided that the following conditions

+ * are met:

+ * 1. Redistributions of source code must retain the above copyright

+ *    notice, this list of conditions and the following disclaimer.

+ * 2. Redistributions in binary form must reproduce the above copyright

+ *    notice, this list of conditions and the following disclaimer in the

+ *    documentation and/or other materials provided with the distribution.

+ *

+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND

+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE

+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE

+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL

+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS

+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)

+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT

+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY

+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF

+ * SUCH DAMAGE.

+ *

+ * This file was originally written by Colin Percival as part of the Tarsnap

+ * online backup system.

+ */

+

+#include "crypto/scrypt.h"

+//#include "util.h"

+#include <stdlib.h>

+#include <stdint.h>

+#include <string.h>

+#include <openssl/sha.h>

+

+#if defined(USE_SSE2) && !defined(USE_SSE2_ALWAYS)

+#ifdef _MSC_VER

+// MSVC 64bit is unable to use inline asm

+#include <intrin.h>

+#else

+// GCC Linux or i686-w64-mingw32

+#include <cpuid.h>

+#endif

+#endif

+

+static inline uint32_t be32dec(const void *pp)

+{

+ const uint8_t *p = (uint8_t const *)pp;

+ return ((uint32_t)(p[3]) + ((uint32_t)(p[2]) << 8) +

+     ((uint32_t)(p[1]) << 16) + ((uint32_t)(p[0]) << 24));

+}

+

+static inline void be32enc(void *pp, uint32_t x)

+{

+ uint8_t *p = (uint8_t *)pp;

+ p[3] = x & 0xff;

+ p[2] = (x >> 8) & 0xff;

+ p[1] = (x >> 16) & 0xff;

+ p[0] = (x >> 24) & 0xff;

+}

+

+typedef struct HMAC_SHA256Context {

+ SHA256_CTX ictx;

+ SHA256_CTX octx;

+} HMAC_SHA256_CTX;

+

+/* Initialize an HMAC-SHA256 operation with the given key. */

+static void

+HMAC_SHA256_Init(HMAC_SHA256_CTX *ctx, const void *_K, size_t Klen)

+{

+ unsigned char pad[64];

+ unsigned char khash[32];

+ const unsigned char *K = (const unsigned char *)_K;

+ size_t i;

+

+ /* If Klen > 64, the key is really SHA256(K). */

+ if (Klen > 64) {

+ SHA256_Init(&ctx->ictx);

+ SHA256_Update(&ctx->ictx, K, Klen);

+ SHA256_Final(khash, &ctx->ictx);

+ K = khash;

+ Klen = 32;

+ }

+

+ /* Inner SHA256 operation is SHA256(K xor [block of 0x36] || data). */

+ SHA256_Init(&ctx->ictx);

+ memset(pad, 0x36, 64);

+ for (i = 0; i < Klen; i++)

+ pad[i] ^= K[i];

+ SHA256_Update(&ctx->ictx, pad, 64);

+

+ /* Outer SHA256 operation is SHA256(K xor [block of 0x5c] || hash). */

+ SHA256_Init(&ctx->octx);

+ memset(pad, 0x5c, 64);

+ for (i = 0; i < Klen; i++)

+ pad[i] ^= K[i];

+ SHA256_Update(&ctx->octx, pad, 64);

+

+ /* Clean the stack. */

+ memset(khash, 0, 32);

+}

+

+/* Add bytes to the HMAC-SHA256 operation. */

+static void

+HMAC_SHA256_Update(HMAC_SHA256_CTX *ctx, const void *in, size_t len)

+{

+ /* Feed data to the inner SHA256 operation. */

+ SHA256_Update(&ctx->ictx, in, len);

+}

+

+/* Finish an HMAC-SHA256 operation. */

+static void

+HMAC_SHA256_Final(unsigned char digest[32], HMAC_SHA256_CTX *ctx)

+{

+ unsigned char ihash[32];

+

+ /* Finish the inner SHA256 operation. */

+ SHA256_Final(ihash, &ctx->ictx);

+

+ /* Feed the inner hash to the outer SHA256 operation. */

+ SHA256_Update(&ctx->octx, ihash, 32);

+

+ /* Finish the outer SHA256 operation. */

+ SHA256_Final(digest, &ctx->octx);

+

+ /* Clean the stack. */

+ memset(ihash, 0, 32);

+}

+

+/**

+ * PBKDF2_SHA256(passwd, passwdlen, salt, saltlen, c, buf, dkLen):

+ * Compute PBKDF2(passwd, salt, c, dkLen) using HMAC-SHA256 as the PRF, and

+ * write the output to buf.  The value dkLen must be at most 32 * (2^32 - 1).

+ */

+void

+PBKDF2_SHA256(const uint8_t *passwd, size_t passwdlen, const uint8_t *salt,

+    size_t saltlen, uint64_t c, uint8_t *buf, size_t dkLen)

+{

+ HMAC_SHA256_CTX PShctx, hctx;

+ size_t i;

+ uint8_t ivec[4];

+ uint8_t U[32];

+ uint8_t T[32];

+ uint64_t j;

+ int k;

+ size_t clen;

+

+ /* Compute HMAC state after processing P and S. */

+ HMAC_SHA256_Init(&PShctx, passwd, passwdlen);

+ HMAC_SHA256_Update(&PShctx, salt, saltlen);

+

+ /* Iterate through the blocks. */

+ for (i = 0; i * 32 < dkLen; i++) {

+ /* Generate INT(i + 1). */

+ be32enc(ivec, (uint32_t)(i + 1));

+

+ /* Compute U_1 = PRF(P, S || INT(i)). */

+ memcpy(&hctx, &PShctx, sizeof(HMAC_SHA256_CTX));

+ HMAC_SHA256_Update(&hctx, ivec, 4);

+ HMAC_SHA256_Final(U, &hctx);

+

+ /* T_i = U_1 ... */

+ memcpy(T, U, 32);

+

+ for (j = 2; j <= c; j++) {

+ /* Compute U_j. */

+ HMAC_SHA256_Init(&hctx, passwd, passwdlen);

+ HMAC_SHA256_Update(&hctx, U, 32);

+ HMAC_SHA256_Final(U, &hctx);

+

+ /* ... xor U_j ... */

+ for (k = 0; k < 32; k++)

+ T[k] ^= U[k];

+ }

+

+ /* Copy as many bytes as necessary into buf. */

+ clen = dkLen - i * 32;

+ if (clen > 32)

+ clen = 32;

+ memcpy(&buf[i * 32], T, clen);

+ }

+

+ /* Clean PShctx, since we never called _Final on it. */

+ memset(&PShctx, 0, sizeof(HMAC_SHA256_CTX));

+}

+

+#define ROTL(a, b) (((a) << (b)) | ((a) >> (32 - (b))))

+

+static inline void xor_salsa8(uint32_t B[16], const uint32_t Bx[16])

+{

+ uint32_t x00,x01,x02,x03,x04,x05,x06,x07,x08,x09,x10,x11,x12,x13,x14,x15;

+ int i;

+

+ x00 = (B[ 0] ^= Bx[ 0]);

+ x01 = (B[ 1] ^= Bx[ 1]);

+ x02 = (B[ 2] ^= Bx[ 2]);

+ x03 = (B[ 3] ^= Bx[ 3]);

+ x04 = (B[ 4] ^= Bx[ 4]);

+ x05 = (B[ 5] ^= Bx[ 5]);

+ x06 = (B[ 6] ^= Bx[ 6]);

+ x07 = (B[ 7] ^= Bx[ 7]);

+ x08 = (B[ 8] ^= Bx[ 8]);

+ x09 = (B[ 9] ^= Bx[ 9]);

+ x10 = (B[10] ^= Bx[10]);

+ x11 = (B[11] ^= Bx[11]);

+ x12 = (B[12] ^= Bx[12]);

+ x13 = (B[13] ^= Bx[13]);

+ x14 = (B[14] ^= Bx[14]);

+ x15 = (B[15] ^= Bx[15]);

+ for (i = 0; i < 8; i += 2) {

+ /* Operate on columns. */

+ x04 ^= ROTL(x00 + x12,  7);  x09 ^= ROTL(x05 + x01,  7);

+ x14 ^= ROTL(x10 + x06,  7);  x03 ^= ROTL(x15 + x11,  7);

+

+ x08 ^= ROTL(x04 + x00,  9);  x13 ^= ROTL(x09 + x05,  9);

+ x02 ^= ROTL(x14 + x10,  9);  x07 ^= ROTL(x03 + x15,  9);

+

+ x12 ^= ROTL(x08 + x04, 13);  x01 ^= ROTL(x13 + x09, 13);

+ x06 ^= ROTL(x02 + x14, 13);  x11 ^= ROTL(x07 + x03, 13);

+

+ x00 ^= ROTL(x12 + x08, 18);  x05 ^= ROTL(x01 + x13, 18);

+ x10 ^= ROTL(x06 + x02, 18);  x15 ^= ROTL(x11 + x07, 18);

+

+ /* Operate on rows. */

+ x01 ^= ROTL(x00 + x03,  7);  x06 ^= ROTL(x05 + x04,  7);

+ x11 ^= ROTL(x10 + x09,  7);  x12 ^= ROTL(x15 + x14,  7);

+

+ x02 ^= ROTL(x01 + x00,  9);  x07 ^= ROTL(x06 + x05,  9);

+ x08 ^= ROTL(x11 + x10,  9);  x13 ^= ROTL(x12 + x15,  9);

+

+ x03 ^= ROTL(x02 + x01, 13);  x04 ^= ROTL(x07 + x06, 13);

+ x09 ^= ROTL(x08 + x11, 13);  x14 ^= ROTL(x13 + x12, 13);

+

+ x00 ^= ROTL(x03 + x02, 18);  x05 ^= ROTL(x04 + x07, 18);

+ x10 ^= ROTL(x09 + x08, 18);  x15 ^= ROTL(x14 + x13, 18);

+ }

+ B[ 0] += x00;

+ B[ 1] += x01;

+ B[ 2] += x02;

+ B[ 3] += x03;

+ B[ 4] += x04;

+ B[ 5] += x05;

+ B[ 6] += x06;

+ B[ 7] += x07;

+ B[ 8] += x08;

+ B[ 9] += x09;

+ B[10] += x10;

+ B[11] += x11;

+ B[12] += x12;

+ B[13] += x13;

+ B[14] += x14;

+ B[15] += x15;

+}

+

+void scrypt_1024_1_1_256_sp_generic(const char *input, char *output, char *scratchpad)


 +{

+ uint8_t B[128];

+ uint32_t X[32];

+ uint32_t *V;

+ uint32_t i, j, k;

+

+ V = (uint32_t *)(((uintptr_t)(scratchpad) + 63) & ~ (uintptr_t)(63));

+

+ PBKDF2_SHA256((const uint8_t *)input, 80, (const uint8_t *)input, 80, 1, B, 128);

+

+ for (k = 0; k < 32; k++)

+ X[k] = le32dec(&B[4 * k]);

+

+ for (i = 0; i < 1024; i++) {

+ memcpy(&V[i * 32], X, 128);

+ xor_salsa8(&X[0], &X[16]);

+ xor_salsa8(&X[16], &X[0]);

+ }

+ for (i = 0; i < 1024; i++) {

+ j = 32 * (X[16] & 1023);

+ for (k = 0; k < 32; k++)

+ X[k] ^= V[j + k];

+ xor_salsa8(&X[0], &X[16]);

+ xor_salsa8(&X[16], &X[0]);

+ }

+

+ for (k = 0; k < 32; k++)

+ le32enc(&B[4 * k], X[k]);

+

+ PBKDF2_SHA256((const uint8_t *)input, 80, B, 128, 1, (uint8_t *)output, 32);

+}

+

+#if defined(USE_SSE2)

+// By default, set to generic scrypt function. This will prevent crash in case when scrypt_detect_sse2() wasn't called

+void (*scrypt_1024_1_1_256_sp_detected)(const char *input, char *output, char *scratchpad) = &scrypt_1024_1_1_256_sp_generic;

+

+std::string scrypt_detect_sse2()

+{

+    std::string ret;

+#if defined(USE_SSE2_ALWAYS)

+    ret = "scrypt: using scrypt-sse2 as built.";

+#else // USE_SSE2_ALWAYS

+    // 32bit x86 Linux or Windows, detect cpuid features

+    unsigned int cpuid_edx=0;

+#if defined(_MSC_VER)

+    // MSVC

+    int x86cpuid[4];

+    __cpuid(x86cpuid, 1);

+    cpuid_edx = (unsigned int)buffer[3];

+#else // _MSC_VER

+    // Linux or i686-w64-mingw32 (gcc-4.6.3)

+    unsigned int eax, ebx, ecx;

+    __get_cpuid(1, &eax, &ebx, &ecx, &cpuid_edx);

+#endif // _MSC_VER

+

+    if (cpuid_edx & 1<<26)

+    {

+        scrypt_1024_1_1_256_sp_detected = &scrypt_1024_1_1_256_sp_sse2;

+        ret = "scrypt: using scrypt-sse2 as detected");

+    }

+    else

+    {

+        scrypt_1024_1_1_256_sp_detected = &scrypt_1024_1_1_256_sp_generic;

+        ret = "scrypt: using scrypt-generic, SSE2 unavailable";

+    }

+#endif // USE_SSE2_ALWAYS

+    return ret;

+}

+#endif

+

+void scrypt_1024_1_1_256(const char *input, char *output)

+{

+ char scratchpad[SCRYPT_SCRATCHPAD_SIZE];

+    scrypt_1024_1_1_256_sp(input, output, scratchpad);

+}

--- /dev/null

+++ b/src/crypto/scrypt.h

@@ -0,0 +1,46 @@

+#ifndef SCRYPT_H

+#define SCRYPT_H

+#include <stdlib.h>

+#include <stdint.h>

+

+static const int SCRYPT_SCRATCHPAD_SIZE = 131072 + 63;

+

+void scrypt_1024_1_1_256(const char *input, char *output);

+void scrypt_1024_1_1_256_sp_generic(const char *input, char *output, char *scratchpad);

+

+#if defined(USE_SSE2)

+#include <string>

+#if defined(_M_X64) || defined(__x86_64__) || defined(_M_AMD64) || (defined(MAC_OSX) && defined(__i386__))

+#define USE_SSE2_ALWAYS 1

+#define scrypt_1024_1_1_256_sp(input, output, scratchpad) scrypt_1024_1_1_256_sp_sse2((input), (output), (scratchpad))

+#else

+#define scrypt_1024_1_1_256_sp(input, output, scratchpad) scrypt_1024_1_1_256_sp_detected((input), (output), (scratchpad))

+#endif

+

+std::string scrypt_detect_sse2();

+void scrypt_1024_1_1_256_sp_sse2(const char *input, char *output, char *scratchpad);

+extern void (*scrypt_1024_1_1_256_sp_detected)(const char *input, char *output, char *scratchpad);

+#else

+#define scrypt_1024_1_1_256_sp(input, output, scratchpad) scrypt_1024_1_1_256_sp_generic((input), (output), (scratchpad))

+#endif

+

+void

+PBKDF2_SHA256(const uint8_t *passwd, size_t passwdlen, const uint8_t *salt,

+    size_t saltlen, uint64_t c, uint8_t *buf, size_t dkLen);

+

+static inline uint32_t le32dec(const void *pp)

+{

+        const uint8_t *p = (uint8_t const *)pp;

+        return ((uint32_t)(p[0]) + ((uint32_t)(p[1]) << 8) +

+            ((uint32_t)(p[2]) << 16) + ((uint32_t)(p[3]) << 24));

+}

+

+static inline void le32enc(void *pp, uint32_t x)

+{

+        uint8_t *p = (uint8_t *)pp;

+        p[0] = x & 0xff;

+        p[1] = (x >> 8) & 0xff;

+        p[2] = (x >> 16) & 0xff;

+        p[3] = (x >> 24) & 0xff;

+}

+#endif

--- a/src/httprpc.cpp

+++ b/src/httprpc.cpp

@@ -192,7 +192,7 @@ static bool HTTPReq_JSONRPC(HTTPRequest* req, const std::string &)

 

         // array of requests

         } else if (valRequest.isArray())

-            strReply = JSONRPCExecBatch(jreq, valRequest.get_array());

+            strReply = JSONRPCExecBatch(valRequest.get_array());

         else

             throw JSONRPCError(RPC_PARSE_ERROR, "Top-level object parse error");

 

--- a/src/httpserver.cpp

+++ b/src/httpserver.cpp

@@ -24,7 +24,6 @@

 

 #include <event2/thread.h>

 #include <event2/buffer.h>

-#include <event2/bufferevent.h>

 #include <event2/util.h>

 #include <event2/keyvalq_struct.h>

 

@@ -240,16 +239,6 @@ static std::string RequestMethodString(HTTPRequest::RequestMethod m)

 /** HTTP request callback */

 static void http_request_cb(struct evhttp_request* req, void* arg)

 {

-    // Disable reading to work around a libevent bug, fixed in 2.2.0.

-    if (event_get_version_number() >= 0x02010600 && event_get_version_number() < 0x02020001) {

-        evhttp_connection* conn = evhttp_request_get_connection(req);

-        if (conn) {

-            bufferevent* bev = evhttp_connection_get_bufferevent(conn);

-            if (bev) {

-                bufferevent_disable(bev, EV_READ);

-            }

-        }

-    }

     std::unique_ptr<HTTPRequest> hreq(new HTTPRequest(req));

 

     LogPrint(BCLog::HTTP, "Received a %s request for %s from %s\n",

@@ -610,24 +599,11 @@ void HTTPRequest::WriteReply(int nStatus, const std::string& strReply)

     struct evbuffer* evb = evhttp_request_get_output_buffer(req);

     assert(evb);

     evbuffer_add(evb, strReply.data(), strReply.size());

-    auto req_copy = req;

-    HTTPEvent* ev = new HTTPEvent(eventBase, true, [req_copy, nStatus]{

-        evhttp_send_reply(req_copy, nStatus, nullptr, nullptr);

-        // Re-enable reading from the socket. This is the second part of the libevent

-        // workaround above.

-        if (event_get_version_number() >= 0x02010600 && event_get_version_number() < 0x02020001) {

-            evhttp_connection* conn = evhttp_request_get_connection(req_copy);

-            if (conn) {

-                bufferevent* bev = evhttp_connection_get_bufferevent(conn);

-                if (bev) {

-                    bufferevent_enable(bev, EV_READ | EV_WRITE);

-                }

-            }

-        }

-    });

-    ev->trigger(nullptr);

+    HTTPEvent* ev = new HTTPEvent(eventBase, true,

+        std::bind(evhttp_send_reply, req, nStatus, (const char*)nullptr, (struct evbuffer *)nullptr));

+    ev->trigger(0);

     replySent = true;

-    req = nullptr; // transferred back to main thread

+    req = 0; // transferred back to main thread

 }

 

 CService HTTPRequest::GetPeer()

--- a/src/init.cpp

+++ b/src/init.cpp

@@ -66,6 +66,10 @@

 #include "zmq/zmqnotificationinterface.h"

 #endif

 

+#ifdef USE_SSE2

+#include "crypto/scrypt.h"

+#endif

+

 bool fFeeEstimatesInitialized = false;

 static const bool DEFAULT_PROXYRANDOMIZE = true;

 static const bool DEFAULT_REST_ENABLE = false;

@@ -193,15 +197,12 @@ void Shutdown()

     }

 #endif

     MapPort(false);

-

-    // Because these depend on each-other, we make sure that neither can be

-    // using the other before destroying them.

     UnregisterValidationInterface(peerLogic.get());

-    if(g_connman) g_connman->Stop();

     peerLogic.reset();

     g_connman.reset();

 

     StopTorControl();

+    UnregisterNodeSignals(GetNodeSignals());

     if (fDumpMempoolLater && gArgs.GetArg("-persistmempool", DEFAULT_PERSIST_MEMPOOL)) {

         DumpMempool();

     }

@@ -365,9 +366,6 @@ std::string HelpMessage(HelpMessageMode mode)

     strUsage += HelpMessageOpt("-maxorphantx=<n>", strprintf(_("Keep at most <n> unconnectable transactions in memory (default: %u)"), DEFAULT_MAX_ORPHAN_TRANSACTIONS));

     strUsage += HelpMessageOpt("-maxmempool=<n>", strprintf(_("Keep the transaction memory pool below <n> megabytes (default: %u)"), DEFAULT_MAX_MEMPOOL_SIZE));

     strUsage += HelpMessageOpt("-mempoolexpiry=<n>", strprintf(_("Do not keep transactions in the mempool longer than <n> hours (default: %u)"), DEFAULT_MEMPOOL_EXPIRY));

-    if (showDebug) {

-        strUsage += HelpMessageOpt("-minimumchainwork=<hex>", strprintf("Minimum work assumed to exist on a valid chain in hex (default: %s, testnet: %s)", defaultChainParams->GetConsensus().nMinimumChainWork.GetHex(), testnetChainParams->GetConsensus().nMinimumChainWork.GetHex()));

-    }

     strUsage += HelpMessageOpt("-persistmempool", strprintf(_("Whether to save the mempool on shutdown and load on restart (default: %u)"), DEFAULT_PERSIST_MEMPOOL));

     strUsage += HelpMessageOpt("-blockreconstructionextratxn=<n>", strprintf(_("Extra transactions to keep in memory for compact block reconstructions (default: %u)"), DEFAULT_BLOCK_RECONSTRUCTION_EXTRA_TXN));

     strUsage += HelpMessageOpt("-par=<n>", strprintf(_("Set the number of script verification threads (%u to %d, 0 = auto, <0 = leave that many cores free, default: %d)"),

@@ -500,7 +498,7 @@ std::string HelpMessage(HelpMessageMode mode)

 

     strUsage += HelpMessageGroup(_("Block creation options:"));

     strUsage += HelpMessageOpt("-blockmaxweight=<n>", strprintf(_("Set maximum BIP141 block weight (default: %d)"), DEFAULT_BLOCK_MAX_WEIGHT));

-    strUsage += HelpMessageOpt("-blockmaxsize=<n>", _("Set maximum BIP141 block weight to this * 4. Deprecated, use blockmaxweight"));

+    strUsage += HelpMessageOpt("-blockmaxsize=<n>", strprintf(_("Set maximum block size in bytes (default: %d)"), DEFAULT_BLOCK_MAX_SIZE));

     strUsage += HelpMessageOpt("-blockmintxfee=<amt>", strprintf(_("Set lowest fee rate (in %s/kB) for transactions to be included in block creation. (default: %s)"), CURRENCY_UNIT, FormatMoney(DEFAULT_BLOCK_MIN_TX_FEE)));

     if (showDebug)

         strUsage += HelpMessageOpt("-blockversion=<n>", "Override block version to test forking scenarios");

@@ -527,10 +525,10 @@ std::string HelpMessage(HelpMessageMode mode)

 

 std::string LicenseInfo()

 {

-    const std::string URL_SOURCE_CODE = "<https://github.com/bitcoin/bitcoin>";

-    const std::string URL_WEBSITE = "<https://bitcoincore.org>";

+    const std::string URL_SOURCE_CODE = "<https://github.com/litecoin-project/litecoin>";

+    const std::string URL_WEBSITE = "<https://litecoin.org>";

 

-    return CopyrightHolders(strprintf(_("Copyright (C) %i-%i"), 2009, COPYRIGHT_YEAR) + " ") + "\n" +

+    return CopyrightHolders(strprintf(_("Copyright (C) %i-%i"), 2011, COPYRIGHT_YEAR) + " ") + "\n" +

            "\n" +

            strprintf(_("Please contribute if you find %s useful. "

                        "Visit %s for further information about the software."),

@@ -802,15 +800,6 @@ void InitParameterInteraction()

         if (gArgs.SoftSetBoolArg("-whitelistrelay", true))

             LogPrintf("%s: parameter interaction: -whitelistforcerelay=1 -> setting -whitelistrelay=1\n", __func__);

     }

-

-    if (gArgs.IsArgSet("-blockmaxsize")) {

-        unsigned int max_size = gArgs.GetArg("-blockmaxsize", 0);

-        if (gArgs.SoftSetArg("blockmaxweight", strprintf("%d", max_size * WITNESS_SCALE_FACTOR))) {

-            LogPrintf("%s: parameter interaction: -blockmaxsize=%d -> setting -blockmaxweight=%d (-blockmaxsize is deprecated!)\n", __func__, max_size, max_size * WITNESS_SCALE_FACTOR);

-        } else {

-            LogPrintf("%s: Ignoring blockmaxsize setting which is overridden by blockmaxweight", __func__);

-        }

-    }

 }

 

 static std::string ResolveErrMsg(const char * const optname, const std::string& strBind)

@@ -826,7 +815,7 @@ void InitLogging()

     fLogIPs = gArgs.GetBoolArg("-logips", DEFAULT_LOGIPS);

 

     LogPrintf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");

-    LogPrintf("Bitcoin version %s\n", FormatFullVersion());

+    LogPrintf("Litecoin version %s\n", FormatFullVersion());

 }

 

 namespace { // Variables internal to initialization process only

@@ -994,20 +983,6 @@ bool AppInitParameterInteraction()

     else

         LogPrintf("Validating signatures for all blocks.\n");

 

-    if (gArgs.IsArgSet("-minimumchainwork")) {

-        const std::string minChainWorkStr = gArgs.GetArg("-minimumchainwork", "");

-        if (!IsHexNumber(minChainWorkStr)) {

-            return InitError(strprintf("Invalid non-hex (%s) minimum chain work value specified", minChainWorkStr));

-        }

-        nMinimumChainWork = UintToArith256(uint256S(minChainWorkStr));

-    } else {

-        nMinimumChainWork = UintToArith256(chainparams.GetConsensus().nMinimumChainWork);

-    }

-    LogPrintf("Setting nMinimumChainWork=%s\n", nMinimumChainWork.GetHex());

-    if (nMinimumChainWork < UintToArith256(chainparams.GetConsensus().nMinimumChainWork)) {

-        LogPrintf("Warning: nMinimumChainWork set below default value of %s\n", chainparams.GetConsensus().nMinimumChainWork.GetHex());

-    }

-

     // mempool limits

     int64_t nMempoolSizeMax = gArgs.GetArg("-maxmempool", DEFAULT_MAX_MEMPOOL_SIZE) * 1000000;

     int64_t nMempoolSizeMin = gArgs.GetArg("-limitdescendantsize", DEFAULT_DESCENDANT_SIZE_LIMIT) * 1000 * 40;

@@ -1272,6 +1247,11 @@ bool AppInitMain(boost::thread_group& threadGroup, CScheduler& scheduler)

 

     int64_t nStart;

 

+#if defined(USE_SSE2)

+    std::string sse2detect = scrypt_detect_sse2();

+    LogPrintf("%s\n", sse2detect);

+#endif

+

     // ********************************************************* Step 5: verify wallet database integrity

 #ifdef ENABLE_WALLET

     if (!CWallet::Verify())

@@ -1287,8 +1267,9 @@ bool AppInitMain(boost::thread_group& threadGroup, CScheduler& scheduler)

     g_connman = std::unique_ptr<CConnman>(new CConnman(GetRand(std::numeric_limits<uint64_t>::max()), GetRand(std::numeric_limits<uint64_t>::max())));

     CConnman& connman = *g_connman;

 

-    peerLogic.reset(new PeerLogicValidation(&connman, scheduler));

+    peerLogic.reset(new PeerLogicValidation(&connman));

     RegisterValidationInterface(peerLogic.get());

+    RegisterNodeSignals(GetNodeSignals());

 

     // sanitize comments per BIP-0014, format user agent and check total size

     std::vector<std::string> uacomments;

@@ -1679,7 +1660,6 @@ bool AppInitMain(boost::thread_group& threadGroup, CScheduler& scheduler)

     connOptions.nMaxFeeler = 1;

     connOptions.nBestHeight = chainActive.Height();

     connOptions.uiInterface = &uiInterface;

-    connOptions.m_msgproc = peerLogic.get();

     connOptions.nSendBufferMaxSize = 1000*gArgs.GetArg("-maxsendbuffer", DEFAULT_MAXSENDBUFFER);

     connOptions.nReceiveFloodSize = 1000*gArgs.GetArg("-maxreceivebuffer", DEFAULT_MAXRECEIVEBUFFER);

 

--- a/src/miner.cpp

+++ b/src/miner.cpp

@@ -14,6 +14,7 @@

 #include "consensus/merkle.h"

 #include "consensus/validation.h"

 #include "hash.h"

+#include "crypto/scrypt.h"

 #include "validation.h"

 #include "net.h"

 #include "policy/feerate.h"

@@ -43,6 +44,7 @@

 // its ancestors.

 

 uint64_t nLastBlockTx = 0;

+uint64_t nLastBlockSize = 0;

 uint64_t nLastBlockWeight = 0;

 

 int64_t UpdateTime(CBlockHeader* pblock, const Consensus::Params& consensusParams, const CBlockIndex* pindexPrev)

@@ -63,6 +65,7 @@ int64_t UpdateTime(CBlockHeader* pblock, const Consensus::Params& consensusParam

 BlockAssembler::Options::Options() {

     blockMinFeeRate = CFeeRate(DEFAULT_BLOCK_MIN_TX_FEE);

     nBlockMaxWeight = DEFAULT_BLOCK_MAX_WEIGHT;

+    nBlockMaxSize = DEFAULT_BLOCK_MAX_SIZE;

 }

 

 BlockAssembler::BlockAssembler(const CChainParams& params, const Options& options) : chainparams(params)

@@ -70,6 +73,10 @@ BlockAssembler::BlockAssembler(const CChainParams& params, const Options& option

     blockMinFeeRate = options.blockMinFeeRate;

     // Limit weight to between 4K and MAX_BLOCK_WEIGHT-4K for sanity:

     nBlockMaxWeight = std::max<size_t>(4000, std::min<size_t>(MAX_BLOCK_WEIGHT - 4000, options.nBlockMaxWeight));

+    // Limit size to between 1K and MAX_BLOCK_SERIALIZED_SIZE-1K for sanity:

+    nBlockMaxSize = std::max<size_t>(1000, std::min<size_t>(MAX_BLOCK_SERIALIZED_SIZE - 1000, options.nBlockMaxSize));

+    // Whether we need to account for byte usage (in addition to weight usage)

+    fNeedSizeAccounting = (nBlockMaxSize < MAX_BLOCK_SERIALIZED_SIZE - 1000);

 }

 

 static BlockAssembler::Options DefaultOptions(const CChainParams& params)

@@ -79,7 +86,20 @@ static BlockAssembler::Options DefaultOptions(const CChainParams& params)

     // If only one is given, only restrict the specified resource.

     // If both are given, restrict both.

     BlockAssembler::Options options;

-    options.nBlockMaxWeight = gArgs.GetArg("-blockmaxweight", DEFAULT_BLOCK_MAX_WEIGHT);

+    options.nBlockMaxWeight = DEFAULT_BLOCK_MAX_WEIGHT;

+    options.nBlockMaxSize = DEFAULT_BLOCK_MAX_SIZE;

+    bool fWeightSet = false;

+    if (gArgs.IsArgSet("-blockmaxweight")) {

+        options.nBlockMaxWeight = gArgs.GetArg("-blockmaxweight", DEFAULT_BLOCK_MAX_WEIGHT);

+        options.nBlockMaxSize = MAX_BLOCK_SERIALIZED_SIZE;

+        fWeightSet = true;

+    }

+    if (gArgs.IsArgSet("-blockmaxsize")) {

+        options.nBlockMaxSize = gArgs.GetArg("-blockmaxsize", DEFAULT_BLOCK_MAX_SIZE);

+        if (!fWeightSet) {

+            options.nBlockMaxWeight = options.nBlockMaxSize * WITNESS_SCALE_FACTOR;

+        }

+    }

     if (gArgs.IsArgSet("-blockmintxfee")) {

         CAmount n = 0;

         ParseMoney(gArgs.GetArg("-blockmintxfee", ""), n);

@@ -97,6 +117,7 @@ void BlockAssembler::resetBlock()

     inBlock.clear();

 

     // Reserve space for coinbase tx

+    nBlockSize = 1000;

     nBlockWeight = 4000;

     nBlockSigOpsCost = 400;

     fIncludeWitness = false;

@@ -155,6 +176,7 @@ std::unique_ptr<CBlockTemplate> BlockAssembler::CreateNewBlock(const CScript& sc

     int64_t nTime1 = GetTimeMicros();

 

     nLastBlockTx = nBlockTx;

+    nLastBlockSize = nBlockSize;

     nLastBlockWeight = nBlockWeight;

 

     // Create coinbase transaction.

@@ -169,7 +191,8 @@ std::unique_ptr<CBlockTemplate> BlockAssembler::CreateNewBlock(const CScript& sc

     pblocktemplate->vchCoinbaseCommitment = GenerateCoinbaseCommitment(*pblock, pindexPrev, chainparams.GetConsensus());

     pblocktemplate->vTxFees[0] = -nFees;

 

-    LogPrintf("CreateNewBlock(): block weight: %u txs: %u fees: %ld sigops %d\n", GetBlockWeight(*pblock), nBlockTx, nFees, nBlockSigOpsCost);

+    uint64_t nSerializeSize = GetSerializeSize(*pblock, SER_NETWORK, PROTOCOL_VERSION);

+    LogPrintf("CreateNewBlock(): total size: %u block weight: %u txs: %u fees: %ld sigops %d\n", nSerializeSize, GetBlockWeight(*pblock), nBlockTx, nFees, nBlockSigOpsCost);

 

     // Fill in header

     pblock->hashPrevBlock  = pindexPrev->GetBlockHash();

@@ -216,13 +239,22 @@ bool BlockAssembler::TestPackage(uint64_t packageSize, int64_t packageSigOpsCost

 // - transaction finality (locktime)

 // - premature witness (in case segwit transactions are added to mempool before

 //   segwit activation)

+// - serialized size (in case -blockmaxsize is in use)

 bool BlockAssembler::TestPackageTransactions(const CTxMemPool::setEntries& package)

 {

+    uint64_t nPotentialBlockSize = nBlockSize; // only used with fNeedSizeAccounting

     for (const CTxMemPool::txiter it : package) {

         if (!IsFinalTx(it->GetTx(), nHeight, nLockTimeCutoff))

             return false;

         if (!fIncludeWitness && it->GetTx().HasWitness())

             return false;

+        if (fNeedSizeAccounting) {

+            uint64_t nTxSize = ::GetSerializeSize(it->GetTx(), SER_NETWORK, PROTOCOL_VERSION);

+            if (nPotentialBlockSize + nTxSize >= nBlockMaxSize) {

+                return false;

+            }

+            nPotentialBlockSize += nTxSize;

+        }

     }

     return true;

 }

@@ -232,6 +264,9 @@ void BlockAssembler::AddToBlock(CTxMemPool::txiter iter)

     pblock->vtx.emplace_back(iter->GetSharedTx());

     pblocktemplate->vTxFees.push_back(iter->GetFee());

     pblocktemplate->vTxSigOpsCost.push_back(iter->GetSigOpCost());

+    if (fNeedSizeAccounting) {

+        nBlockSize += ::GetSerializeSize(iter->GetTx(), SER_NETWORK, PROTOCOL_VERSION);

+    }

     nBlockWeight += iter->GetTxWeight();

     ++nBlockTx;

     nBlockSigOpsCost += iter->GetSigOpCost();

--- a/src/miner.h

+++ b/src/miner.h

@@ -71,7 +71,7 @@ struct modifiedentry_iter {

 // except operating on CTxMemPoolModifiedEntry.

 // TODO: refactor to avoid duplication of this logic.

 struct CompareModifiedEntry {

-    bool operator()(const CTxMemPoolModifiedEntry &a, const CTxMemPoolModifiedEntry &b) const

+    bool operator()(const CTxMemPoolModifiedEntry &a, const CTxMemPoolModifiedEntry &b)

     {

         double f1 = (double)a.nModFeesWithAncestors * b.nSizeWithAncestors;

         double f2 = (double)b.nModFeesWithAncestors * a.nSizeWithAncestors;

@@ -86,7 +86,7 @@ struct CompareModifiedEntry {

 // This is sufficient to sort an ancestor package in an order that is valid

 // to appear in a block.

 struct CompareTxIterByAncestorCount {

-    bool operator()(const CTxMemPool::txiter &a, const CTxMemPool::txiter &b) const

+    bool operator()(const CTxMemPool::txiter &a, const CTxMemPool::txiter &b)

     {

         if (a->GetCountWithAncestors() != b->GetCountWithAncestors())

             return a->GetCountWithAncestors() < b->GetCountWithAncestors();

@@ -139,11 +139,13 @@ private:

 

     // Configuration parameters for the block size

     bool fIncludeWitness;

-    unsigned int nBlockMaxWeight;

+    unsigned int nBlockMaxWeight, nBlockMaxSize;

+    bool fNeedSizeAccounting;

     CFeeRate blockMinFeeRate;

 

     // Information on the current status of the block

     uint64_t nBlockWeight;

+    uint64_t nBlockSize;

     uint64_t nBlockTx;

     uint64_t nBlockSigOpsCost;

     CAmount nFees;

--- a/src/net.cpp

+++ b/src/net.cpp

@@ -89,6 +89,10 @@ std::string strSubVersion;

 

 limitedmap<uint256, int64_t> mapAlreadyAskedFor(MAX_INV_SZ);

 

+// Signals for message handling

+static CNodeSignals g_signals;

+CNodeSignals& GetNodeSignals() { return g_signals; }

+

 void CConnman::AddOneShot(const std::string& strDest)

 {

     LOCK(cs_vOneShots);

@@ -661,7 +665,7 @@ void CNode::copyStats(CNodeStats &stats)

         X(cleanSubVer);

     }

     X(fInbound);

-    X(m_manual_connection);

+    X(fAddnode);

     X(nStartingHeight);

     {

         LOCK(cs_vSend);

@@ -1110,7 +1114,7 @@ void CConnman::AcceptConnection(const ListenSocket& hListenSocket) {

     CNode* pnode = new CNode(id, nLocalServices, GetBestHeight(), hSocket, addr, CalculateKeyedNetGroup(addr), nonce, addr_bind, "", true);

     pnode->AddRef();

     pnode->fWhitelisted = whitelisted;

-    m_msgproc->InitializeNode(pnode);

+    GetNodeSignals().InitializeNode(pnode, *this);

 

     LogPrint(BCLog::NET, "connection from %s accepted\n", addr.ToString());

 

@@ -1479,7 +1483,7 @@ void ThreadMapPort()

             }

         }

 

-        std::string strDesc = "Bitcoin " + FormatFullVersion();

+        std::string strDesc = "Litecoin " + FormatFullVersion();

 

         try {

             while (true) {

@@ -1670,37 +1674,6 @@ void CConnman::ProcessOneShot()

     }

 }

 

-bool CConnman::GetTryNewOutboundPeer()

-{

-    return m_try_another_outbound_peer;

-}

-

-void CConnman::SetTryNewOutboundPeer(bool flag)

-{

-    m_try_another_outbound_peer = flag;

-    LogPrint(BCLog::NET, "net: setting try another outbound peer=%s\n", flag ? "true" : "false");

-}

-

-// Return the number of peers we have over our outbound connection limit

-// Exclude peers that are marked for disconnect, or are going to be

-// disconnected soon (eg one-shots and feelers)

-// Also exclude peers that haven't finished initial connection handshake yet

-// (so that we don't decide we're over our desired connection limit, and then

-// evict some peer that has finished the handshake)

-int CConnman::GetExtraOutboundCount()

-{

-    int nOutbound = 0;

-    {

-        LOCK(cs_vNodes);

-        for (CNode* pnode : vNodes) {

-            if (!pnode->fInbound && !pnode->m_manual_connection && !pnode->fFeeler && !pnode->fDisconnect && !pnode->fOneShot && pnode->fSuccessfullyConnected) {

-                ++nOutbound;

-            }

-        }

-    }

-    return std::max(nOutbound - nMaxOutbound, 0);

-}

-

 void CConnman::ThreadOpenConnections()

 {

     // Connect to specific addresses

@@ -1765,7 +1738,7 @@ void CConnman::ThreadOpenConnections()

         {

             LOCK(cs_vNodes);

             for (CNode* pnode : vNodes) {

-                if (!pnode->fInbound && !pnode->m_manual_connection) {

+                if (!pnode->fInbound && !pnode->fAddnode) {

 

                     // Count the peers that have all relevant services

                     if (pnode->fSuccessfullyConnected && !pnode->fFeeler && ((pnode->nServices & nRelevantServices) == nRelevantServices)) {

@@ -1795,8 +1768,7 @@ void CConnman::ThreadOpenConnections()

         //  * Only make a feeler connection once every few minutes.

         //

         bool fFeeler = false;

-

-        if (nOutbound >= nMaxOutbound && !GetTryNewOutboundPeer()) {

+        if (nOutbound >= nMaxOutbound) {

             int64_t nTime = GetTimeMicros(); // The current time right now (in microseconds).

             if (nTime > nNextFeeler) {

                 nNextFeeler = PoissonNextSend(nTime, FEELER_INTERVAL);

@@ -1962,7 +1934,7 @@ void CConnman::ThreadOpenAddedConnections()

 }

 

 // if successful, this moves the passed grant to the constructed node

-bool CConnman::OpenNetworkConnection(const CAddress& addrConnect, bool fCountFailure, CSemaphoreGrant *grantOutbound, const char *pszDest, bool fOneShot, bool fFeeler, bool manual_connection)

+bool CConnman::OpenNetworkConnection(const CAddress& addrConnect, bool fCountFailure, CSemaphoreGrant *grantOutbound, const char *pszDest, bool fOneShot, bool fFeeler, bool fAddnode)

 {

     //

     // Initiate outbound network connection

@@ -1991,10 +1963,10 @@ bool CConnman::OpenNetworkConnection(const CAddress& addrConnect, bool fCountFai

         pnode->fOneShot = true;

     if (fFeeler)

         pnode->fFeeler = true;

-    if (manual_connection)

-        pnode->m_manual_connection = true;

+    if (fAddnode)

+        pnode->fAddnode = true;

 

-    m_msgproc->InitializeNode(pnode);

+    GetNodeSignals().InitializeNode(pnode, *this);

     {

         LOCK(cs_vNodes);

         vNodes.push_back(pnode);

@@ -2024,16 +1996,16 @@ void CConnman::ThreadMessageHandler()

                 continue;

 

             // Receive messages

-            bool fMoreNodeWork = m_msgproc->ProcessMessages(pnode, flagInterruptMsgProc);

+            bool fMoreNodeWork = GetNodeSignals().ProcessMessages(pnode, *this, flagInterruptMsgProc);

             fMoreWork |= (fMoreNodeWork && !pnode->fPauseSend);

             if (flagInterruptMsgProc)

                 return;

+

             // Send messages

             {

                 LOCK(pnode->cs_sendProcessing);

-                m_msgproc->SendMessages(pnode, flagInterruptMsgProc);

+                GetNodeSignals().SendMessages(pnode, *this, flagInterruptMsgProc);

             }

-

             if (flagInterruptMsgProc)

                 return;

         }

@@ -2239,7 +2211,6 @@ CConnman::CConnman(uint64_t nSeed0In, uint64_t nSeed1In) : nSeed0(nSeed0In), nSe

     semOutbound = nullptr;

     semAddnode = nullptr;

     flagInterruptMsgProc = false;

-    SetTryNewOutboundPeer(false);

 

     Options connOptions;

     Init(connOptions);

@@ -2353,7 +2324,6 @@ bool CConnman::Start(CScheduler& scheduler, const Options& connOptions)

     //

     // Start threads

     //

-    assert(m_msgproc);

     InterruptSocks5(false);

     interruptNet.reset();

     flagInterruptMsgProc = false;

@@ -2473,10 +2443,9 @@ void CConnman::DeleteNode(CNode* pnode)

 {

     assert(pnode);

     bool fUpdateConnectionTime = false;

-    m_msgproc->FinalizeNode(pnode->GetId(), fUpdateConnectionTime);

-    if(fUpdateConnectionTime) {

+    GetNodeSignals().FinalizeNode(pnode->GetId(), fUpdateConnectionTime);

+    if(fUpdateConnectionTime)

         addrman.Connected(pnode->addr);

-    }

     delete pnode;

 }

 

@@ -2735,7 +2704,7 @@ CNode::CNode(NodeId idIn, ServiceFlags nLocalServicesIn, int nMyStartingHeightIn

     strSubVer = "";

     fWhitelisted = false;

     fOneShot = false;

-    m_manual_connection = false;

+    fAddnode = false;

     fClient = false; // set by version message

     fFeeler = false;

     fSuccessfullyConnected = false;

--- a/src/net.h

+++ b/src/net.h

@@ -33,6 +33,7 @@

 #include <arpa/inet.h>

 #endif

 

+#include <boost/signals2/signal.hpp>

 

 class CScheduler;

 class CNode;

@@ -115,7 +116,7 @@ struct CSerializedNetMsg

     std::string command;

 };

 

-class NetEventsInterface;

+

 class CConnman

 {

 public:

@@ -137,7 +138,6 @@ public:

         int nMaxFeeler = 0;

         int nBestHeight = 0;

         CClientUIInterface* uiInterface = nullptr;

-        NetEventsInterface* m_msgproc = nullptr;

         unsigned int nSendBufferMaxSize = 0;

         unsigned int nReceiveFloodSize = 0;

         uint64_t nMaxOutboundTimeframe = 0;

@@ -156,7 +156,6 @@ public:

         nMaxFeeler = connOptions.nMaxFeeler;

         nBestHeight = connOptions.nBestHeight;

         clientInterface = connOptions.uiInterface;

-        m_msgproc = connOptions.m_msgproc;

         nSendBufferMaxSize = connOptions.nSendBufferMaxSize;

         nReceiveFloodSize = connOptions.nReceiveFloodSize;

         nMaxOutboundTimeframe = connOptions.nMaxOutboundTimeframe;

@@ -171,7 +170,7 @@ public:

     void Interrupt();

     bool GetNetworkActive() const { return fNetworkActive; };

     void SetNetworkActive(bool active);

-    bool OpenNetworkConnection(const CAddress& addrConnect, bool fCountFailure, CSemaphoreGrant *grantOutbound = nullptr, const char *strDest = nullptr, bool fOneShot = false, bool fFeeler = false, bool manual_connection = false);

+    bool OpenNetworkConnection(const CAddress& addrConnect, bool fCountFailure, CSemaphoreGrant *grantOutbound = nullptr, const char *strDest = nullptr, bool fOneShot = false, bool fFeeler = false, bool fAddnode = false);

     bool CheckIncomingNonce(uint64_t nonce);

 

     bool ForNode(NodeId id, std::function<bool(CNode* pnode)> func);

@@ -251,19 +250,6 @@ public:

     void GetBanned(banmap_t &banmap);

     void SetBanned(const banmap_t &banmap);

 

-    // This allows temporarily exceeding nMaxOutbound, with the goal of finding

-    // a peer that is better than all our current peers.

-    void SetTryNewOutboundPeer(bool flag);

-    bool GetTryNewOutboundPeer();

-

-    // Return the number of outbound peers we have in excess of our target (eg,

-    // if we previously called SetTryNewOutboundPeer(true), and have since set

-    // to false, we may have extra peers that we wish to disconnect). This may

-    // return a value less than (num_outbound_connections - num_outbound_slots)

-    // in cases where some outbound connections are not yet fully connected, or

-    // not yet fully disconnected.

-    int GetExtraOutboundCount();

-

     bool AddNode(const std::string& node);

     bool RemoveAddedNode(const std::string& node);

     std::vector<AddedNodeInfo> GetAddedNodeInfo();

@@ -410,7 +396,6 @@ private:

     int nMaxFeeler;

     std::atomic<int> nBestHeight;

     CClientUIInterface* clientInterface;

-    NetEventsInterface* m_msgproc;

 

     /** SipHasher seeds for deterministic randomness */

     const uint64_t nSeed0, nSeed1;

@@ -429,13 +414,6 @@ private:

     std::thread threadOpenAddedConnections;

     std::thread threadOpenConnections;

     std::thread threadMessageHandler;

-

-    /** flag for deciding to connect to an extra outbound peer,

-     *  in excess of nMaxOutbound

-     *  This takes the place of a feeler connection */

-    std::atomic_bool m_try_another_outbound_peer;

-

-    friend struct CConnmanTest;

 };

 extern std::unique_ptr<CConnman> g_connman;

 void Discover(boost::thread_group& threadGroup);

@@ -458,18 +436,19 @@ struct CombinerAll

     }

 };

 

-/**

- * Interface for message handling

- */

-class NetEventsInterface

+// Signals for message handling

+struct CNodeSignals

 {

-public:

-    virtual bool ProcessMessages(CNode* pnode, std::atomic<bool>& interrupt) = 0;

-    virtual bool SendMessages(CNode* pnode, std::atomic<bool>& interrupt) = 0;

-    virtual void InitializeNode(CNode* pnode) = 0;

-    virtual void FinalizeNode(NodeId id, bool& update_connection_time) = 0;

+    boost::signals2::signal<bool (CNode*, CConnman&, std::atomic<bool>&), CombinerAll> ProcessMessages;

+    boost::signals2::signal<bool (CNode*, CConnman&, std::atomic<bool>&), CombinerAll> SendMessages;

+    boost::signals2::signal<void (CNode*, CConnman&)> InitializeNode;

+    boost::signals2::signal<void (NodeId, bool&)> FinalizeNode;

 };

 

+

+CNodeSignals& GetNodeSignals();

+

+

 enum

 {

     LOCAL_NONE,   // unknown

@@ -529,7 +508,7 @@ public:

     int nVersion;

     std::string cleanSubVer;

     bool fInbound;

-    bool m_manual_connection;

+    bool fAddnode;

     int nStartingHeight;

     uint64_t nSendBytes;

     mapMsgCmdSize mapSendBytesPerMsgCmd;

@@ -639,7 +618,7 @@ public:

     bool fWhitelisted; // This peer can bypass DoS banning.

     bool fFeeler; // If true this node is being used as a short lived feeler.

     bool fOneShot;

-    bool m_manual_connection;

+    bool fAddnode;

     bool fClient;

     const bool fInbound;

     std::atomic_bool fSuccessfullyConnected;

--- a/src/net_processing.cpp

+++ b/src/net_processing.cpp

@@ -23,7 +23,6 @@

 #include "primitives/transaction.h"

 #include "random.h"

 #include "reverse_iterator.h"

-#include "scheduler.h"

 #include "tinyformat.h"

 #include "txmempool.h"

 #include "ui_interface.h"

@@ -33,7 +32,7 @@

 #include "validationinterface.h"

 

 #if defined(NDEBUG)

-# error "Bitcoin cannot be compiled without assertions."

+# error "Litecoin cannot be compiled without assertions."

 #endif

 

 std::atomic<int64_t> nTimeBestReceived(0); // Used only to inform the wallet of when we last received a block

@@ -117,12 +116,6 @@ namespace {

     /** Number of peers from which we're downloading blocks. */

     int nPeersWithValidatedDownloads = 0;

 

-    /** Number of outbound peers with m_chain_sync.m_protect. */

-    int g_outbound_peers_with_protect_from_disconnect = 0;

-

-    /** When our tip was last updated. */

-    int64_t g_last_tip_update = 0;

-

     /** Relay map, protected by cs_main. */

     typedef std::map<uint256, CTransactionRef> MapRelay;

     MapRelay mapRelay;

@@ -130,6 +123,11 @@ namespace {

     std::deque<std::pair<int64_t, MapRelay::iterator>> vRelayExpiration;

 } // namespace

 

+//////////////////////////////////////////////////////////////////////////////

+//

+// Registration of network node signals.

+//

+

 namespace {

 

 struct CBlockReject {

@@ -200,36 +198,6 @@ struct CNodeState {

      */

     bool fSupportsDesiredCmpctVersion;

 

-    /** State used to enforce CHAIN_SYNC_TIMEOUT

-      * Only in effect for outbound, non-manual connections, with

-      * m_protect == false

-      * Algorithm: if a peer's best known block has less work than our tip,

-      * set a timeout CHAIN_SYNC_TIMEOUT seconds in the future:

-      *   - If at timeout their best known block now has more work than our tip

-      *     when the timeout was set, then either reset the timeout or clear it

-      *     (after comparing against our current tip's work)

-      *   - If at timeout their best known block still has less work than our

-      *     tip did when the timeout was set, then send a getheaders message,

-      *     and set a shorter timeout, HEADERS_RESPONSE_TIME seconds in future.

-      *     If their best known block is still behind when that new timeout is

-      *     reached, disconnect.

-      */

-    struct ChainSyncTimeoutState {

-        //! A timeout used for checking whether our peer has sufficiently synced

-        int64_t m_timeout;

-        //! A header with the work we require on our peer's chain

-        const CBlockIndex * m_work_header;

-        //! After timeout is reached, set to true after sending getheaders

-        bool m_sent_getheaders;

-        //! Whether this peer is protected from disconnection due to a bad/slow chain

-        bool m_protect;

-    };

-

-    ChainSyncTimeoutState m_chain_sync;

-

-    //! Time of last new block announcement

-    int64_t m_last_block_announcement;

-

     CNodeState(CAddress addrIn, std::string addrNameIn) : address(addrIn), name(addrNameIn) {

         fCurrentlyConnected = false;

         nMisbehavior = 0;

@@ -252,8 +220,6 @@ struct CNodeState {

         fHaveWitness = false;

         fWantsCmpctWitness = false;

         fSupportsDesiredCmpctVersion = false;

-        m_chain_sync = { 0, nullptr, false, false };

-        m_last_block_announcement = 0;

     }

 };

 

@@ -278,7 +244,7 @@ void UpdatePreferredDownload(CNode* node, CNodeState* state)

     nPreferredDownload += state->fPreferredDownload;

 }

 

-void PushNodeVersion(CNode *pnode, CConnman* connman, int64_t nTime)

+void PushNodeVersion(CNode *pnode, CConnman& connman, int64_t nTime)

 {

     ServiceFlags nLocalNodeServices = pnode->GetLocalServices();

     uint64_t nonce = pnode->GetLocalNonce();

@@ -289,7 +255,7 @@ void PushNodeVersion(CNode *pnode, CConnman* connman, int64_t nTime)

     CAddress addrYou = (addr.IsRoutable() && !IsProxy(addr) ? addr : CAddress(CService(), addr.nServices));

     CAddress addrMe = CAddress(CService(), nLocalNodeServices);

 

-    connman->PushMessage(pnode, CNetMsgMaker(INIT_PROTO_VERSION).Make(NetMsgType::VERSION, PROTOCOL_VERSION, (uint64_t)nLocalNodeServices, nTime, addrYou, addrMe,

+    connman.PushMessage(pnode, CNetMsgMaker(INIT_PROTO_VERSION).Make(NetMsgType::VERSION, PROTOCOL_VERSION, (uint64_t)nLocalNodeServices, nTime, addrYou, addrMe,

             nonce, strSubVersion, nNodeStartingHeight, ::fRelayTxes));

 

     if (fLogIPs) {

@@ -299,6 +265,49 @@ void PushNodeVersion(CNode *pnode, CConnman* connman, int64_t nTime)

     }

 }

 

+void InitializeNode(CNode *pnode, CConnman& connman) {

+    CAddress addr = pnode->addr;

+    std::string addrName = pnode->GetAddrName();

+    NodeId nodeid = pnode->GetId();

+    {

+        LOCK(cs_main);

+        mapNodeState.emplace_hint(mapNodeState.end(), std::piecewise_construct, std::forward_as_tuple(nodeid), std::forward_as_tuple(addr, std::move(addrName)));

+    }

+    if(!pnode->fInbound)

+        PushNodeVersion(pnode, connman, GetTime());

+}

+

+void FinalizeNode(NodeId nodeid, bool& fUpdateConnectionTime) {

+    fUpdateConnectionTime = false;

+    LOCK(cs_main);

+    CNodeState *state = State(nodeid);

+

+    if (state->fSyncStarted)

+        nSyncStarted--;

+

+    if (state->nMisbehavior == 0 && state->fCurrentlyConnected) {

+        fUpdateConnectionTime = true;

+    }

+

+    for (const QueuedBlock& entry : state->vBlocksInFlight) {

+        mapBlocksInFlight.erase(entry.hash);

+    }

+    EraseOrphansFor(nodeid);

+    nPreferredDownload -= state->fPreferredDownload;

+    nPeersWithValidatedDownloads -= (state->nBlocksInFlightValidHeaders != 0);

+    assert(nPeersWithValidatedDownloads >= 0);

+

+    mapNodeState.erase(nodeid);

+

+    if (mapNodeState.empty()) {

+        // Do a consistency check after the last peer is removed.

+        assert(mapBlocksInFlight.empty());

+        assert(nPreferredDownload == 0);

+        assert(nPeersWithValidatedDownloads == 0);

+    }

+    LogPrint(BCLog::NET, "Cleared nodestate for peer=%d\n", nodeid);

+}

+

 // Requires cs_main.

 // Returns a bool indicating whether we requested this block.

 // Also used if a block was /not/ received and timed out or started with another peer

@@ -393,7 +402,7 @@ void UpdateBlockAvailability(NodeId nodeid, const uint256 &hash) {

     }

 }

 

-void MaybeSetPeerAsAnnouncingHeaderAndIDs(NodeId nodeid, CConnman* connman) {

+void MaybeSetPeerAsAnnouncingHeaderAndIDs(NodeId nodeid, CConnman& connman) {

     AssertLockHeld(cs_main);

     CNodeState* nodestate = State(nodeid);

     if (!nodestate || !nodestate->fSupportsDesiredCmpctVersion) {

@@ -408,35 +417,26 @@ void MaybeSetPeerAsAnnouncingHeaderAndIDs(NodeId nodeid, CConnman* connman) {

                 return;

             }

         }

-        connman->ForNode(nodeid, [connman](CNode* pfrom){

+        connman.ForNode(nodeid, [&connman](CNode* pfrom){

             bool fAnnounceUsingCMPCTBLOCK = false;

             uint64_t nCMPCTBLOCKVersion = (pfrom->GetLocalServices() & NODE_WITNESS) ? 2 : 1;

             if (lNodesAnnouncingHeaderAndIDs.size() >= 3) {

                 // As per BIP152, we only get 3 of our peers to announce

                 // blocks using compact encodings.

-                connman->ForNode(lNodesAnnouncingHeaderAndIDs.front(), [connman, fAnnounceUsingCMPCTBLOCK, nCMPCTBLOCKVersion](CNode* pnodeStop){

-                    connman->PushMessage(pnodeStop, CNetMsgMaker(pnodeStop->GetSendVersion()).Make(NetMsgType::SENDCMPCT, fAnnounceUsingCMPCTBLOCK, nCMPCTBLOCKVersion));

+                connman.ForNode(lNodesAnnouncingHeaderAndIDs.front(), [&connman, fAnnounceUsingCMPCTBLOCK, nCMPCTBLOCKVersion](CNode* pnodeStop){

+                    connman.PushMessage(pnodeStop, CNetMsgMaker(pnodeStop->GetSendVersion()).Make(NetMsgType::SENDCMPCT, fAnnounceUsingCMPCTBLOCK, nCMPCTBLOCKVersion));

                     return true;

                 });

                 lNodesAnnouncingHeaderAndIDs.pop_front();

             }

             fAnnounceUsingCMPCTBLOCK = true;

-            connman->PushMessage(pfrom, CNetMsgMaker(pfrom->GetSendVersion()).Make(NetMsgType::SENDCMPCT, fAnnounceUsingCMPCTBLOCK, nCMPCTBLOCKVersion));

+            connman.PushMessage(pfrom, CNetMsgMaker(pfrom->GetSendVersion()).Make(NetMsgType::SENDCMPCT, fAnnounceUsingCMPCTBLOCK, nCMPCTBLOCKVersion));

             lNodesAnnouncingHeaderAndIDs.push_back(pfrom->GetId());

             return true;

         });

     }

 }

 

-bool TipMayBeStale(const Consensus::Params &consensusParams)

-{

-    AssertLockHeld(cs_main);

-    if (g_last_tip_update == 0) {

-        g_last_tip_update = GetTime();

-    }

-    return g_last_tip_update < GetTime() - consensusParams.nPowTargetSpacing * 3 && mapBlocksInFlight.empty();

-}

-

 // Requires cs_main

 

 bool CanDirectFetch(const Consensus::Params &consensusParams)

 {

@@ -466,7 +466,7 @@ void FindNextBlocksToDownload(NodeId nodeid, unsigned int count, std::vector<con

     // Make sure pindexBestKnownBlock is up to date, we'll need it.

     ProcessBlockAvailability(nodeid);

 

-    if (state->pindexBestKnownBlock == nullptr || state->pindexBestKnownBlock->nChainWork < chainActive.Tip()->nChainWork || state->pindexBestKnownBlock->nChainWork < nMinimumChainWork) {

+    if (state->pindexBestKnownBlock == nullptr || state->pindexBestKnownBlock->nChainWork < chainActive.Tip()->nChainWork || state->pindexBestKnownBlock->nChainWork < UintToArith256(consensusParams.nMinimumChainWork)) {

         // This peer has nothing interesting.

         return;

     }

@@ -543,69 +543,6 @@ void FindNextBlocksToDownload(NodeId nodeid, unsigned int count, std::vector<con

 

 } // namespace

 

-// This function is used for testing the stale tip eviction logic, see

-// DoS_tests.cpp

-void UpdateLastBlockAnnounceTime(NodeId node, int64_t time_in_seconds)

-{

-    LOCK(cs_main);

-    CNodeState *state = State(node);

-    if (state) state->m_last_block_announcement = time_in_seconds;

-}

-

-// Returns true for outbound peers, excluding manual connections, feelers, and

-// one-shots

-bool IsOutboundDisconnectionCandidate(const CNode *node)

-{

-    return !(node->fInbound || node->m_manual_connection || node->fFeeler || node->fOneShot);

-}

-

-void PeerLogicValidation::InitializeNode(CNode *pnode) {

-    CAddress addr = pnode->addr;

-    std::string addrName = pnode->GetAddrName();

-    NodeId nodeid = pnode->GetId();

-    {

-        LOCK(cs_main);

-        mapNodeState.emplace_hint(mapNodeState.end(), std::piecewise_construct, std::forward_as_tuple(nodeid), std::forward_as_tuple(addr, std::move(addrName)));

-    }

-    if(!pnode->fInbound)

-        PushNodeVersion(pnode, connman, GetTime());

-}

-

-void PeerLogicValidation::FinalizeNode(NodeId nodeid, bool& fUpdateConnectionTime) {

-    fUpdateConnectionTime = false;

-    LOCK(cs_main);

-    CNodeState *state = State(nodeid);

-    assert(state != nullptr);

-

-    if (state->fSyncStarted)

-        nSyncStarted--;

-

-    if (state->nMisbehavior == 0 && state->fCurrentlyConnected) {

-        fUpdateConnectionTime = true;

-    }

-

-    for (const QueuedBlock& entry : state->vBlocksInFlight) {

-        mapBlocksInFlight.erase(entry.hash);

-    }

-    EraseOrphansFor(nodeid);

-    nPreferredDownload -= state->fPreferredDownload;

-    nPeersWithValidatedDownloads -= (state->nBlocksInFlightValidHeaders != 0);

-    assert(nPeersWithValidatedDownloads >= 0);

-    g_outbound_peers_with_protect_from_disconnect -= state->m_chain_sync.m_protect;

-    assert(g_outbound_peers_with_protect_from_disconnect >= 0);

-

-    mapNodeState.erase(nodeid);

-

-    if (mapNodeState.empty()) {

-        // Do a consistency check after the last peer is removed.

-        assert(mapBlocksInFlight.empty());

-        assert(nPreferredDownload == 0);

-        assert(nPeersWithValidatedDownloads == 0);

-        assert(g_outbound_peers_with_protect_from_disconnect == 0);

-    }

-    LogPrint(BCLog::NET, "Cleared nodestate for peer=%d\n", nodeid);

-}

-

 bool GetNodeStateStats(NodeId nodeid, CNodeStateStats &stats) {

     LOCK(cs_main);

     CNodeState *state = State(nodeid);

@@ -621,6 +558,22 @@ bool GetNodeStateStats(NodeId nodeid, CNodeStateStats &stats) {

     return true;

 }

 

+void RegisterNodeSignals(CNodeSignals& nodeSignals)

+{

+    nodeSignals.ProcessMessages.connect(&ProcessMessages);

+    nodeSignals.SendMessages.connect(&SendMessages);

+    nodeSignals.InitializeNode.connect(&InitializeNode);

+    nodeSignals.FinalizeNode.connect(&FinalizeNode);

+}

+

+void UnregisterNodeSignals(CNodeSignals& nodeSignals)

+{

+    nodeSignals.ProcessMessages.disconnect(&ProcessMessages);

+    nodeSignals.SendMessages.disconnect(&SendMessages);

+    nodeSignals.InitializeNode.disconnect(&InitializeNode);

+    nodeSignals.FinalizeNode.disconnect(&FinalizeNode);

+}

+

 //////////////////////////////////////////////////////////////////////////////

 //

 // mapOrphanTransactions

@@ -772,17 +725,9 @@ void Misbehaving(NodeId pnode, int howmuch)

 // blockchain -> download logic notification

 //

 

-PeerLogicValidation::PeerLogicValidation(CConnman* connmanIn, CScheduler &scheduler) : connman(connmanIn), m_stale_tip_check_time(0) {

+PeerLogicValidation::PeerLogicValidation(CConnman* connmanIn) : connman(connmanIn) {

     // Initialize global variables that cannot be constructed at startup.

     recentRejects.reset(new CRollingBloomFilter(120000, 0.000001));

-

-    const Consensus::Params& consensusParams = Params().GetConsensus();

-    // Stale tip checking and peer eviction are on two different timers, but we

-    // don't want them to get out of sync due to drift in the scheduler, so we

-    // combine them in one function and schedule at the quicker (peer-eviction)

-    // timer.

-    static_assert(EXTRA_PEER_CHECK_INTERVAL < STALE_CHECK_INTERVAL, "peer eviction timer should be less than stale tip check timer");

-    scheduler.scheduleEvery(std::bind(&PeerLogicValidation::CheckForStaleTipAndEvictPeers, this, consensusParams), EXTRA_PEER_CHECK_INTERVAL * 1000);

 }

 

 void PeerLogicValidation::BlockConnected(const std::shared_ptr<const CBlock>& pblock, const CBlockIndex* pindex, const std::vector<CTransactionRef>& vtxConflicted) {

@@ -813,8 +758,6 @@ void PeerLogicValidation::BlockConnected(const std::shared_ptr<const CBlock>& pb

         }

         LogPrint(BCLog::MEMPOOL, "Erased %d orphan tx included or conflicted by block\n", nErased);

     }

-

-    g_last_tip_update = GetTime();

 }

 

 // All of the following cache a recent block, and are protected by cs_most_recent_block

@@ -922,7 +865,7 @@ void PeerLogicValidation::BlockChecked(const CBlock& block, const CValidationSta

              !IsInitialBlockDownload() &&

              mapBlocksInFlight.count(hash) == mapBlocksInFlight.size()) {

         if (it != mapBlockSource.end()) {

-            MaybeSetPeerAsAnnouncingHeaderAndIDs(it->second.first, connman);

+            MaybeSetPeerAsAnnouncingHeaderAndIDs(it->second.first, *connman);

         }

     }

     if (it != mapBlockSource.end())

@@ -967,16 +910,16 @@ bool static AlreadyHave(const CInv& inv) EXCLUSIVE_LOCKS_REQUIRED(cs_main)

     return true;

 }

 

-static void RelayTransaction(const CTransaction& tx, CConnman* connman)

+static void RelayTransaction(const CTransaction& tx, CConnman& connman)

 {

     CInv inv(MSG_TX, tx.GetHash());

-    connman->ForEachNode([&inv](CNode* pnode)

+    connman.ForEachNode([&inv](CNode* pnode)

     {

         pnode->PushInventory(inv);

     });

 }

 

-static void RelayAddress(const CAddress& addr, bool fReachable, CConnman* connman)

+static void RelayAddress(const CAddress& addr, bool fReachable, CConnman& connman)

 {

     unsigned int nRelayNodes = fReachable ? 2 : 1; // limited relaying of addresses outside our network(s)

 

@@ -984,7 +927,7 @@ static void RelayAddress(const CAddress& addr, bool fReachable, CConnman* connma

     // Use deterministic randomness to send to the same nodes for 24 hours

     // at a time so the addrKnowns of the chosen nodes prevent repeats

     uint64_t hashAddr = addr.GetHash();

-    const CSipHasher hasher = connman->GetDeterministicRandomizer(RANDOMIZER_ID_ADDRESS_RELAY).Write(hashAddr << 32).Write((GetTime() + hashAddr) / (24*60*60));

+    const CSipHasher hasher = connman.GetDeterministicRandomizer(RANDOMIZER_ID_ADDRESS_RELAY).Write(hashAddr << 32).Write((GetTime() + hashAddr) / (24*60*60));

     FastRandomContext insecure_rand;

 

     std::array<std::pair<uint64_t, CNode*>,2> best{{{0, nullptr}, {0, nullptr}}};

@@ -1009,10 +952,10 @@ static void RelayAddress(const CAddress& addr, bool fReachable, CConnman* connma

         }

     };

 

-    connman->ForEachNodeThen(std::move(sortfunc), std::move(pushfunc));

+    connman.ForEachNodeThen(std::move(sortfunc), std::move(pushfunc));

 }

 

-void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParams, CConnman* connman, const std::atomic<bool>& interruptMsgProc)

+void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParams, CConnman& connman, const std::atomic<bool>& interruptMsgProc)

 {

     std::deque<CInv>::iterator it = pfrom->vRecvGetData.begin();

     std::vector<CInv> vNotFound;

@@ -1074,7 +1017,7 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam

                 // disconnect node in case we have reached the outbound limit for serving historical blocks

                 // never disconnect whitelisted nodes

                 static const int nOneWeek = 7 * 24 * 60 * 60; // assume > 1 week = historical

-                if (send && connman->OutboundTargetReached(true) && ( ((pindexBestHeader != nullptr) && (pindexBestHeader->GetBlockTime() - mi->second->GetBlockTime() > nOneWeek)) || inv.type == MSG_FILTERED_BLOCK) && !pfrom->fWhitelisted)

+                if (send && connman.OutboundTargetReached(true) && ( ((pindexBestHeader != nullptr) && (pindexBestHeader->GetBlockTime() - mi->second->GetBlockTime() > nOneWeek)) || inv.type == MSG_FILTERED_BLOCK) && !pfrom->fWhitelisted)

                 {

                     LogPrint(BCLog::NET, "historical block serving limit reached, disconnect peer=%d\n", pfrom->GetId());

 

@@ -1097,9 +1040,9 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam

                         pblock = pblockRead;

                     }

                     if (inv.type == MSG_BLOCK)

-                        connman->PushMessage(pfrom, msgMaker.Make(SERIALIZE_TRANSACTION_NO_WITNESS, NetMsgType::BLOCK, *pblock));

+                        connman.PushMessage(pfrom, msgMaker.Make(SERIALIZE_TRANSACTION_NO_WITNESS, NetMsgType::BLOCK, *pblock));

                     else if (inv.type == MSG_WITNESS_BLOCK)

-                        connman->PushMessage(pfrom, msgMaker.Make(NetMsgType::BLOCK, *pblock));

+                        connman.PushMessage(pfrom, msgMaker.Make(NetMsgType::BLOCK, *pblock));

                     else if (inv.type == MSG_FILTERED_BLOCK)

                     {

                         bool sendMerkleBlock = false;

@@ -1112,7 +1055,7 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam

                             }

                         }

                         if (sendMerkleBlock) {

-                            connman->PushMessage(pfrom, msgMaker.Make(NetMsgType::MERKLEBLOCK, merkleBlock));

+                            connman.PushMessage(pfrom, msgMaker.Make(NetMsgType::MERKLEBLOCK, merkleBlock));

                             // CMerkleBlock just contains hashes, so also push any transactions in the block the client did not see

                             // This avoids hurting performance by pointlessly requiring a round-trip

                             // Note that there is currently no way for a node to request any single transactions we didn't send here -

@@ -1121,7 +1064,7 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam

                             // however we MUST always provide at least what the remote peer needs

                             typedef std::pair<unsigned int, uint256> PairType;

                             for (PairType& pair : merkleBlock.vMatchedTxn)

-                                connman->PushMessage(pfrom, msgMaker.Make(SERIALIZE_TRANSACTION_NO_WITNESS, NetMsgType::TX, *pblock->vtx[pair.first]));

+                                connman.PushMessage(pfrom, msgMaker.Make(SERIALIZE_TRANSACTION_NO_WITNESS, NetMsgType::TX, *pblock->vtx[pair.first]));

                         }

                         // else

                             // no response

@@ -1136,13 +1079,13 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam

                         int nSendFlags = fPeerWantsWitness ? 0 : SERIALIZE_TRANSACTION_NO_WITNESS;

                         if (CanDirectFetch(consensusParams) && mi->second->nHeight >= chainActive.Height() - MAX_CMPCTBLOCK_DEPTH) {

                             if ((fPeerWantsWitness || !fWitnessesPresentInARecentCompactBlock) && a_recent_compact_block && a_recent_compact_block->header.GetHash() == mi->second->GetBlockHash()) {

-                                connman->PushMessage(pfrom, msgMaker.Make(nSendFlags, NetMsgType::CMPCTBLOCK, *a_recent_compact_block));

+                                connman.PushMessage(pfrom, msgMaker.Make(nSendFlags, NetMsgType::CMPCTBLOCK, *a_recent_compact_block));

                             } else {

                                 CBlockHeaderAndShortTxIDs cmpctblock(*pblock, fPeerWantsWitness);

-                                connman->PushMessage(pfrom, msgMaker.Make(nSendFlags, NetMsgType::CMPCTBLOCK, cmpctblock));

+                                connman.PushMessage(pfrom, msgMaker.Make(nSendFlags, NetMsgType::CMPCTBLOCK, cmpctblock));

                             }

                         } else {

-                            connman->PushMessage(pfrom, msgMaker.Make(nSendFlags, NetMsgType::BLOCK, *pblock));

+                            connman.PushMessage(pfrom, msgMaker.Make(nSendFlags, NetMsgType::BLOCK, *pblock));

                         }

                     }

 

@@ -1154,7 +1097,7 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam

                         // wait for other stuff first.

                         std::vector<CInv> vInv;

                         vInv.push_back(CInv(MSG_BLOCK, chainActive.Tip()->GetBlockHash()));

-                        connman->PushMessage(pfrom, msgMaker.Make(NetMsgType::INV, vInv));

+                        connman.PushMessage(pfrom, msgMaker.Make(NetMsgType::INV, vInv));

                         pfrom->hashContinue.SetNull();

                     }

                 }

@@ -1166,14 +1109,14 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam

                 auto mi = mapRelay.find(inv.hash);

                 int nSendFlags = (inv.type == MSG_TX ? SERIALIZE_TRANSACTION_NO_WITNESS : 0);

                 if (mi != mapRelay.end()) {

-                    connman->PushMessage(pfrom, msgMaker.Make(nSendFlags, NetMsgType::TX, *mi->second));

+                    connman.PushMessage(pfrom, msgMaker.Make(nSendFlags, NetMsgType::TX, *mi->second));

                     push = true;

                 } else if (pfrom->timeLastMempoolReq) {

                     auto txinfo = mempool.info(inv.hash);

                     // To protect privacy, do not answer getdata using the mempool when

                     // that TX couldn't have been INVed in reply to a MEMPOOL request.

                     if (txinfo.tx && txinfo.nTime <= pfrom->timeLastMempoolReq) {

-                        connman->PushMessage(pfrom, msgMaker.Make(nSendFlags, NetMsgType::TX, *txinfo.tx));

+                        connman.PushMessage(pfrom, msgMaker.Make(nSendFlags, NetMsgType::TX, *txinfo.tx));

                         push = true;

                     }

                 }

@@ -1200,7 +1143,7 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam

         // do that because they want to know about (and store and rebroadcast and

         // risk analyze) the dependencies of transactions relevant to them, without

         // having to download the entire memory pool.

-        connman->PushMessage(pfrom, msgMaker.Make(NetMsgType::NOTFOUND, vNotFound));

+        connman.PushMessage(pfrom, msgMaker.Make(NetMsgType::NOTFOUND, vNotFound));

     }

 }

 

@@ -1212,7 +1155,7 @@ uint32_t GetFetchFlags(CNode* pfrom) {

     return nFetchFlags;

 }

 

-inline void static SendBlockTransactions(const CBlock& block, const BlockTransactionsRequest& req, CNode* pfrom, CConnman* connman) {

+inline void static SendBlockTransactions(const CBlock& block, const BlockTransactionsRequest& req, CNode* pfrom, CConnman& connman) {

     BlockTransactions resp(req);

     for (size_t i = 0; i < req.indexes.size(); i++) {

         if (req.indexes[i] >= block.vtx.size()) {

@@ -1226,229 +1169,10 @@ inline void static SendBlockTransactions(const CBlock& block, const BlockTransac

     LOCK(cs_main);

     const CNetMsgMaker msgMaker(pfrom->GetSendVersion());

     int nSendFlags = State(pfrom->GetId())->fWantsCmpctWitness ? 0 : SERIALIZE_TRANSACTION_NO_WITNESS;

-    connman->PushMessage(pfrom, msgMaker.Make(nSendFlags, NetMsgType::BLOCKTXN, resp));

+    connman.PushMessage(pfrom, msgMaker.Make(nSendFlags, NetMsgType::BLOCKTXN, resp));

 }

 

-bool static ProcessHeadersMessage(CNode *pfrom, CConnman *connman, const std::vector<CBlockHeader>& headers, const CChainParams& chainparams, bool punish_duplicate_invalid)

-{

-    const CNetMsgMaker msgMaker(pfrom->GetSendVersion());

-    size_t nCount = headers.size();

-

-    if (nCount == 0) {

-        // Nothing interesting. Stop asking this peers for more headers.

-        return true;

-    }

-

-    bool received_new_header = false;

-    const CBlockIndex *pindexLast = nullptr;

-    {

-        LOCK(cs_main);

-        CNodeState *nodestate = State(pfrom->GetId());

-

-        // If this looks like it could be a block announcement (nCount <

-        // MAX_BLOCKS_TO_ANNOUNCE), use special logic for handling headers that

-        // don't connect:

-        // - Send a getheaders message in response to try to connect the chain.

-        // - The peer can send up to MAX_UNCONNECTING_HEADERS in a row that

-        //   don't connect before giving DoS points

-        // - Once a headers message is received that is valid and does connect,

-        //   nUnconnectingHeaders gets reset back to 0.

-        if (mapBlockIndex.find(headers[0].hashPrevBlock) == mapBlockIndex.end() && nCount < MAX_BLOCKS_TO_ANNOUNCE) {

-            nodestate->nUnconnectingHeaders++;

-            connman->PushMessage(pfrom, msgMaker.Make(NetMsgType::GETHEADERS, chainActive.GetLocator(pindexBestHeader), uint256()));

-            LogPrint(BCLog::NET, "received header %s: missing prev block %s, sending getheaders (%d) to end (peer=%d, nUnconnectingHeaders=%d)\n",

-                    headers[0].GetHash().ToString(),

-                    headers[0].hashPrevBlock.ToString(),

-                    pindexBestHeader->nHeight,

-                    pfrom->GetId(), nodestate->nUnconnectingHeaders);

-            // Set hashLastUnknownBlock for this peer, so that if we

-            // eventually get the headers - even from a different peer -

-            // we can use this peer to download.

-            UpdateBlockAvailability(pfrom->GetId(), headers.back().GetHash());

-

-            if (nodestate->nUnconnectingHeaders % MAX_UNCONNECTING_HEADERS == 0) {

-                Misbehaving(pfrom->GetId(), 20);

-            }

-            return true;

-        }

-

-        uint256 hashLastBlock;

-        for (const CBlockHeader& header : headers) {

-            if (!hashLastBlock.IsNull() && header.hashPrevBlock != hashLastBlock) {

-                Misbehaving(pfrom->GetId(), 20);

-                return error("non-continuous headers sequence");

-            }

-            hashLastBlock = header.GetHash();

-        }

-

-        // If we don't have the last header, then they'll have given us

-        // something new (if these headers are valid).

-        if (mapBlockIndex.find(hashLastBlock) == mapBlockIndex.end()) {

-            received_new_header = true;

-        }

-    }

-

-    CValidationState state;

-    CBlockHeader first_invalid_header;

-    if (!ProcessNewBlockHeaders(headers, state, chainparams, &pindexLast, &first_invalid_header)) {

-        int nDoS;

-        if (state.IsInvalid(nDoS)) {

-            LOCK(cs_main);

-            if (nDoS > 0) {

-                Misbehaving(pfrom->GetId(), nDoS);

-            }

-            if (punish_duplicate_invalid && mapBlockIndex.find(first_invalid_header.GetHash()) != mapBlockIndex.end()) {

-                // Goal: don't allow outbound peers to use up our outbound

-                // connection slots if they are on incompatible chains.

-                //

-                // We ask the caller to set punish_invalid appropriately based

-                // on the peer and the method of header delivery (compact

-                // blocks are allowed to be invalid in some circumstances,

-                // under BIP 152).

-                // Here, we try to detect the narrow situation that we have a

-                // valid block header (ie it was valid at the time the header

-                // was received, and hence stored in mapBlockIndex) but know the

-                // block is invalid, and that a peer has announced that same

-                // block as being on its active chain.

-                // Disconnect the peer in such a situation.

-                //

-                // Note: if the header that is invalid was not accepted to our

-                // mapBlockIndex at all, that may also be grounds for

-                // disconnecting the peer, as the chain they are on is likely

-                // to be incompatible. However, there is a circumstance where

-                // that does not hold: if the header's timestamp is more than

-                // 2 hours ahead of our current time. In that case, the header

-                // may become valid in the future, and we don't want to

-                // disconnect a peer merely for serving us one too-far-ahead

-                // block header, to prevent an attacker from splitting the

-                // network by mining a block right at the 2 hour boundary.

-                //

-                // TODO: update the DoS logic (or, rather, rewrite the

-                // DoS-interface between validation and net_processing) so that

-                // the interface is cleaner, and so that we disconnect on all the

-                // reasons that a peer's headers chain is incompatible

-                // with ours (eg block->nVersion softforks, MTP violations,

-                // etc), and not just the duplicate-invalid case.

-                pfrom->fDisconnect = true;

-            }

-            return error("invalid header received");

-        }

-    }

-

-    {

-        LOCK(cs_main);

-        CNodeState *nodestate = State(pfrom->GetId());

-        if (nodestate->nUnconnectingHeaders > 0) {

-            LogPrint(BCLog::NET, "peer=%d: resetting nUnconnectingHeaders (%d -> 0)\n", pfrom->GetId(), nodestate->nUnconnectingHeaders);

-        }

-        nodestate->nUnconnectingHeaders = 0;

-

-        assert(pindexLast);

-        UpdateBlockAvailability(pfrom->GetId(), pindexLast->GetBlockHash());

-

-        // From here, pindexBestKnownBlock should be guaranteed to be non-null,

-        // because it is set in UpdateBlockAvailability. Some nullptr checks

-        // are still present, however, as belt-and-suspenders.

-

-        if (received_new_header && pindexLast->nChainWork > chainActive.Tip()->nChainWork) {

-            nodestate->m_last_block_announcement = GetTime();

-        }

-

-        if (nCount == MAX_HEADERS_RESULTS) {

-            // Headers message had its maximum size; the peer may have more headers.

-            // TODO: optimize: if pindexLast is an ancestor of chainActive.Tip or pindexBestHeader, continue

-            // from there instead.

-            LogPrint(BCLog::NET, "more getheaders (%d) to end to peer=%d (startheight:%d)\n", pindexLast->nHeight, pfrom->GetId(), pfrom->nStartingHeight);

-            connman->PushMessage(pfrom, msgMaker.Make(NetMsgType::GETHEADERS, chainActive.GetLocator(pindexLast), uint256()));

-        }

-

-        bool fCanDirectFetch = CanDirectFetch(chainparams.GetConsensus());

-        // If this set of headers is valid and ends in a block with at least as

-        // much work as our tip, download as much as possible.

-        if (fCanDirectFetch && pindexLast->IsValid(BLOCK_VALID_TREE) && chainActive.Tip()->nChainWork <= pindexLast->nChainWork) {

-            std::vector<const CBlockIndex*> vToFetch;

-            const CBlockIndex *pindexWalk = pindexLast;

-            // Calculate all the blocks we'd need to switch to pindexLast, up to a limit.

-            while (pindexWalk && !chainActive.Contains(pindexWalk) && vToFetch.size() <= MAX_BLOCKS_IN_TRANSIT_PER_PEER) {

-                if (!(pindexWalk->nStatus & BLOCK_HAVE_DATA) &&

-                        !mapBlocksInFlight.count(pindexWalk->GetBlockHash()) &&

-                        (!IsWitnessEnabled(pindexWalk->pprev, chainparams.GetConsensus()) || State(pfrom->GetId())->fHaveWitness)) {

-                    // We don't have this block, and it's not yet in flight.

-                    vToFetch.push_back(pindexWalk);

-                }

-                pindexWalk = pindexWalk->pprev;

-            }

-            // If pindexWalk still isn't on our main chain, we're looking at a

-            // very large reorg at a time we think we're close to caught up to

-            // the main chain -- this shouldn't really happen.  Bail out on the

-            // direct fetch and rely on parallel download instead.

-            if (!chainActive.Contains(pindexWalk)) {

-                LogPrint(BCLog::NET, "Large reorg, won't direct fetch to %s (%d)\n",

-                        pindexLast->GetBlockHash().ToString(),

-                        pindexLast->nHeight);

-            } else {

-                std::vector<CInv> vGetData;

-                // Download as much as possible, from earliest to latest.

-                for (const CBlockIndex *pindex : reverse_iterate(vToFetch)) {

-                    if (nodestate->nBlocksInFlight >= MAX_BLOCKS_IN_TRANSIT_PER_PEER) {

-                        // Can't download any more from this peer

-                        break;

-                    }

-                    uint32_t nFetchFlags = GetFetchFlags(pfrom);

-                    vGetData.push_back(CInv(MSG_BLOCK | nFetchFlags, pindex->GetBlockHash()));

-                    MarkBlockAsInFlight(pfrom->GetId(), pindex->GetBlockHash(), pindex);

-                    LogPrint(BCLog::NET, "Requesting block %s from  peer=%d\n",

-                            pindex->GetBlockHash().ToString(), pfrom->GetId());

-                }

-                if (vGetData.size() > 1) {

-                    LogPrint(BCLog::NET, "Downloading blocks toward %s (%d) via headers direct fetch\n",

-                            pindexLast->GetBlockHash().ToString(), pindexLast->nHeight);

-                }

-                if (vGetData.size() > 0) {

-                    if (nodestate->fSupportsDesiredCmpctVersion && vGetData.size() == 1 && mapBlocksInFlight.size() == 1 && pindexLast->pprev->IsValid(BLOCK_VALID_CHAIN)) {

-                        // In any case, we want to download using a compact block, not a regular one

-                        vGetData[0] = CInv(MSG_CMPCT_BLOCK, vGetData[0].hash);

-                    }

-                    connman->PushMessage(pfrom, msgMaker.Make(NetMsgType::GETDATA, vGetData));

-                }

-            }

-        }

-        // If we're in IBD, we want outbound peers that will serve us a useful

-        // chain. Disconnect peers that are on chains with insufficient work.

-        if (IsInitialBlockDownload() && nCount != MAX_HEADERS_RESULTS) {

-            // When nCount < MAX_HEADERS_RESULTS, we know we have no more

-            // headers to fetch from this peer.

-            if (nodestate->pindexBestKnownBlock && nodestate->pindexBestKnownBlock->nChainWork < nMinimumChainWork) {

-                // This peer has too little work on their headers chain to help

-                // us sync -- disconnect if using an outbound slot (unless

-                // whitelisted or addnode).

-                // Note: We compare their tip to nMinimumChainWork (rather than

-                // chainActive.Tip()) because we won't start block download

-                // until we have a headers chain that has at least

-                // nMinimumChainWork, even if a peer has a chain past our tip,

-                // as an anti-DoS measure.

-                if (IsOutboundDisconnectionCandidate(pfrom)) {

-                    LogPrintf("Disconnecting outbound peer %d -- headers chain has insufficient work\n", pfrom->GetId());

-                    pfrom->fDisconnect = true;

-                }

-            }

-        }

-

-        if (!pfrom->fDisconnect && IsOutboundDisconnectionCandidate(pfrom) && nodestate->pindexBestKnownBlock != nullptr) {

-            // If this is an outbound peer, check to see if we should protect

-            // it from the bad/lagging chain logic.

-            if (g_outbound_peers_with_protect_from_disconnect < MAX_OUTBOUND_PEERS_TO_PROTECT_FROM_DISCONNECT && nodestate->pindexBestKnownBlock->nChainWork >= chainActive.Tip()->nChainWork && !nodestate->m_chain_sync.m_protect) {

-                LogPrint(BCLog::NET, "Protecting outbound peer=%d from eviction\n", pfrom->GetId());

-                nodestate->m_chain_sync.m_protect = true;

-                ++g_outbound_peers_with_protect_from_disconnect;

-            }

-        }

-    }

-

-    return true;

-}

-

-bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStream& vRecv, int64_t nTimeReceived, const CChainParams& chainparams, CConnman* connman, const std::atomic<bool>& interruptMsgProc)

+bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStream& vRecv, int64_t nTimeReceived, const CChainParams& chainparams, CConnman& connman, const std::atomic<bool>& interruptMsgProc)

 {

     LogPrint(BCLog::NET, "received: %s (%u bytes) peer=%d\n", SanitizeString(strCommand), vRecv.size(), pfrom->GetId());

     if (gArgs.IsArgSet("-dropmessagestest") && GetRand(gArgs.GetArg("-dropmessagestest", 0)) == 0)

@@ -1501,7 +1225,7 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr

         // Each connection can only send one version message

         if (pfrom->nVersion != 0)

         {

-            connman->PushMessage(pfrom, CNetMsgMaker(INIT_PROTO_VERSION).Make(NetMsgType::REJECT, strCommand, REJECT_DUPLICATE, std::string("Duplicate version message")));

+            connman.PushMessage(pfrom, CNetMsgMaker(INIT_PROTO_VERSION).Make(NetMsgType::REJECT, strCommand, REJECT_DUPLICATE, std::string("Duplicate version message")));

             LOCK(cs_main);

             Misbehaving(pfrom->GetId(), 1);

             return false;

@@ -1525,12 +1249,12 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr

         nServices = ServiceFlags(nServiceInt);

         if (!pfrom->fInbound)

         {

-            connman->SetServices(pfrom->addr, nServices);

+            connman.SetServices(pfrom->addr, nServices);

         }

         if (pfrom->nServicesExpected & ~nServices)

         {

             LogPrint(BCLog::NET, "peer=%d does not offer the expected services (%08x offered, %08x expected); disconnecting\n", pfrom->GetId(), nServices, pfrom->nServicesExpected);

-            connman->PushMessage(pfrom, CNetMsgMaker(INIT_PROTO_VERSION).Make(NetMsgType::REJECT, strCommand, REJECT_NONSTANDARD,

+            connman.PushMessage(pfrom, CNetMsgMaker(INIT_PROTO_VERSION).Make(NetMsgType::REJECT, strCommand, REJECT_NONSTANDARD,

                                strprintf("Expected to offer services %08x", pfrom->nServicesExpected)));

             pfrom->fDisconnect = true;

             return false;

@@ -1551,7 +1275,7 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr

         {

             // disconnect from peers older than this proto version

             LogPrintf("peer=%d using obsolete version %i; disconnecting\n", pfrom->GetId(), nVersion);

-            connman->PushMessage(pfrom, CNetMsgMaker(INIT_PROTO_VERSION).Make(NetMsgType::REJECT, strCommand, REJECT_OBSOLETE,

+            connman.PushMessage(pfrom, CNetMsgMaker(INIT_PROTO_VERSION).Make(NetMsgType::REJECT, strCommand, REJECT_OBSOLETE,

                                strprintf("Version must be %d or greater", MIN_PEER_PROTO_VERSION)));

             pfrom->fDisconnect = true;

             return false;

@@ -1571,7 +1295,7 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr

         if (!vRecv.empty())

             vRecv >> fRelay;

         // Disconnect if we connected to ourself

-        if (pfrom->fInbound && !connman->CheckIncomingNonce(nNonce))

+        if (pfrom->fInbound && !connman.CheckIncomingNonce(nNonce))

         {

             LogPrintf("connected to self at %s, disconnecting\n", pfrom->addr.ToString());

             pfrom->fDisconnect = true;

@@ -1587,7 +1311,7 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr

         if (pfrom->fInbound)

             PushNodeVersion(pfrom, connman, GetAdjustedTime());

 

-        connman->PushMessage(pfrom, CNetMsgMaker(INIT_PROTO_VERSION).Make(NetMsgType::VERACK));

+        connman.PushMessage(pfrom, CNetMsgMaker(INIT_PROTO_VERSION).Make(NetMsgType::VERACK));

 

         pfrom->nServices = nServices;

         pfrom->SetAddrLocal(addrMe);

@@ -1638,12 +1362,12 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr

             }

 

             // Get recent addresses

-            if (pfrom->fOneShot || pfrom->nVersion >= CADDR_TIME_VERSION || connman->GetAddressCount() < 1000)

+            if (pfrom->fOneShot || pfrom->nVersion >= CADDR_TIME_VERSION || connman.GetAddressCount() < 1000)

             {

-                connman->PushMessage(pfrom, CNetMsgMaker(nSendVersion).Make(NetMsgType::GETADDR));

+                connman.PushMessage(pfrom, CNetMsgMaker(nSendVersion).Make(NetMsgType::GETADDR));

                 pfrom->fGetAddr = true;

             }

-            connman->MarkAddressGood(pfrom->addr);

+            connman.MarkAddressGood(pfrom->addr);

         }

 

         std::string remoteAddr;

@@ -1661,8 +1385,8 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr

 

         // If the peer is old enough to have the old alert system, send it the final alert.

         if (pfrom->nVersion <= 70012) {

-            CDataStream finalAlert(ParseHex("60010000000000000000000000ffffff7f00000000ffffff7ffeffff7f01ffffff7f00000000ffffff7f00ffffff7f002f555247454e543a20416c657274206b657920636f6d70726f6d697365642c2075706772616465207265717569726564004630440220653febd6410f470f6bae11cad19c48413becb1ac2c17f908fd0fd53bdc3abd5202206d0e9c96fe88d4a0f01ed9dedae2b6f9e00da94cad0fecaae66ecf689bf71b50"), SER_NETWORK, PROTOCOL_VERSION);

-            connman->PushMessage(pfrom, CNetMsgMaker(nSendVersion).Make("alert", finalAlert));

+            CDataStream finalAlert(ParseHex("5c0100000015f7675900000000ffffff7f00000000ffffff7ffeffff7f0000000000ffffff7f00ffffff7f002f555247454e543a20416c657274206b657920636f6d70726f6d697365642c2075706772616465207265717569726564004630440220405f7e7572b176f3316d4e12deab75ad4ff978844f7a7bcd5ed06f6aa094eb6602207880fcc07d0a78e0f46f188d115e04ed4ad48980ea3572cb0e0cb97921048095"), SER_NETWORK, PROTOCOL_VERSION);

+            connman.PushMessage(pfrom, CNetMsgMaker(nSendVersion).Make("alert", finalAlert));

         }

 

         // Feeler connections exist only to verify if address is online.

@@ -1700,7 +1424,7 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr

             // We send this to non-NODE NETWORK peers as well, because even

             // non-NODE NETWORK peers can announce blocks (such as pruning

             // nodes)

-            connman->PushMessage(pfrom, msgMaker.Make(NetMsgType::SENDHEADERS));

+            connman.PushMessage(pfrom, msgMaker.Make(NetMsgType::SENDHEADERS));

         }

         if (pfrom->nVersion >= SHORT_IDS_BLOCKS_VERSION) {

             // Tell our peer we are willing to provide version 1 or 2 cmpctblocks

@@ -1711,9 +1435,9 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr

             bool fAnnounceUsingCMPCTBLOCK = false;

             uint64_t nCMPCTBLOCKVersion = 2;

             if (pfrom->GetLocalServices() & NODE_WITNESS)

-                connman->PushMessage(pfrom, msgMaker.Make(NetMsgType::SENDCMPCT, fAnnounceUsingCMPCTBLOCK, nCMPCTBLOCKVersion));

+                connman.PushMessage(pfrom, msgMaker.Make(NetMsgType::SENDCMPCT, fAnnounceUsingCMPCTBLOCK, nCMPCTBLOCKVersion));

             nCMPCTBLOCKVersion = 1;

-            connman->PushMessage(pfrom, msgMaker.Make(NetMsgType::SENDCMPCT, fAnnounceUsingCMPCTBLOCK, nCMPCTBLOCKVersion));

+            connman.PushMessage(pfrom, msgMaker.Make(NetMsgType::SENDCMPCT, fAnnounceUsingCMPCTBLOCK, nCMPCTBLOCKVersion));

         }

         pfrom->fSuccessfullyConnected = true;

     }

@@ -1732,7 +1456,7 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr

         vRecv >> vAddr;

 

         // Don't want addr from older versions unless seeding

-        if (pfrom->nVersion < CADDR_TIME_VERSION && connman->GetAddressCount() > 1000)

+        if (pfrom->nVersion < CADDR_TIME_VERSION && connman.GetAddressCount() > 1000)

             return true;

         if (vAddr.size() > 1000)

         {

@@ -1766,7 +1490,7 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr

             if (fReachable)

                 vAddrOk.push_back(addr);

         }

-        connman->AddNewAddresses(vAddrOk, pfrom->addr, 2 * 60 * 60);

+        connman.AddNewAddresses(vAddrOk, pfrom->addr, 2 * 60 * 60);

         if (vAddr.size() < 1000)

             pfrom->fGetAddr = false;

         if (pfrom->fOneShot)

@@ -1844,7 +1568,7 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr

                     // fell back to inv we probably have a reorg which we should get the headers for first,

                     // we now only provide a getheaders response here. When we receive the headers, we will

                     // then ask for the blocks we need.

-                    connman->PushMessage(pfrom, msgMaker.Make(NetMsgType::GETHEADERS, chainActive.GetLocator(pindexBestHeader), inv.hash));

+                    connman.PushMessage(pfrom, msgMaker.Make(NetMsgType::GETHEADERS, chainActive.GetLocator(pindexBestHeader), inv.hash));

                     LogPrint(BCLog::NET, "getheaders (%d) %s to peer=%d\n", pindexBestHeader->nHeight, inv.hash.ToString(), pfrom->GetId());

                 }

             }

@@ -2050,7 +1774,7 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr

         // will re-announce the new block via headers (or compact blocks again)

         // in the SendMessages logic.

         nodestate->pindexBestHeaderSent = pindex ? pindex : chainActive.Tip();

-        connman->PushMessage(pfrom, msgMaker.Make(NetMsgType::HEADERS, vHeaders));

+        connman.PushMessage(pfrom, msgMaker.Make(NetMsgType::HEADERS, vHeaders));

     }

 

 

@@ -2231,7 +1955,7 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr

                 pfrom->GetId(),

                 FormatStateMessage(state));

             if (state.GetRejectCode() > 0 && state.GetRejectCode() < REJECT_INTERNAL) // Never send AcceptToMemoryPool's internal codes over P2P

-                connman->PushMessage(pfrom, msgMaker.Make(NetMsgType::REJECT, strCommand, (unsigned char)state.GetRejectCode(),

+                connman.PushMessage(pfrom, msgMaker.Make(NetMsgType::REJECT, strCommand, (unsigned char)state.GetRejectCode(),

                                    state.GetRejectReason().substr(0, MAX_REJECT_MESSAGE_LENGTH), inv.hash));

             if (nDoS > 0) {

                 Misbehaving(pfrom->GetId(), nDoS);

@@ -2245,21 +1969,15 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr

         CBlockHeaderAndShortTxIDs cmpctblock;

         vRecv >> cmpctblock;

 

-        bool received_new_header = false;

-

         {

         LOCK(cs_main);

 

         if (mapBlockIndex.find(cmpctblock.header.hashPrevBlock) == mapBlockIndex.end()) {

             // Doesn't connect (or is genesis), instead of DoSing in AcceptBlockHeader, request deeper headers

             if (!IsInitialBlockDownload())

-                connman->PushMessage(pfrom, msgMaker.Make(NetMsgType::GETHEADERS, chainActive.GetLocator(pindexBestHeader), uint256()));

+                connman.PushMessage(pfrom, msgMaker.Make(NetMsgType::GETHEADERS, chainActive.GetLocator(pindexBestHeader), uint256()));

             return true;

         }

-

-        if (mapBlockIndex.find(cmpctblock.header.GetHash()) == mapBlockIndex.end()) {

-            received_new_header = true;

-        }

         }

 

         const CBlockIndex *pindex = nullptr;

@@ -2286,6 +2004,7 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr

         // If we end up treating this as a plain headers message, call that as well

         // without cs_main.

         bool fRevertToHeaderProcessing = false;

+        CDataStream vHeadersMsg(SER_NETWORK, PROTOCOL_VERSION);

 

         // Keep a CBlock for "optimistic" compactblock reconstructions (see

         // below)

@@ -2298,14 +2017,6 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr

         assert(pindex);

         UpdateBlockAvailability(pfrom->GetId(), pindex->GetBlockHash());

 

-        CNodeState *nodestate = State(pfrom->GetId());

-

-        // If this was a new header with more work than our tip, update the

-        // peer's last block announcement time

-        if (received_new_header && pindex->nChainWork > chainActive.Tip()->nChainWork) {

-            nodestate->m_last_block_announcement = GetTime();

-        }

-

         std::map<uint256, std::pair<NodeId, std::list<QueuedBlock>::iterator> >::iterator blockInFlightIt = mapBlocksInFlight.find(pindex->GetBlockHash());

         bool fAlreadyInFlight = blockInFlightIt != mapBlocksInFlight.end();

 

@@ -2319,7 +2030,7 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr

                 // so we just grab the block via normal getdata

                 std::vector<CInv> vInv(1);

                 vInv[0] = CInv(MSG_BLOCK | GetFetchFlags(pfrom), cmpctblock.header.GetHash());

-                connman->PushMessage(pfrom, msgMaker.Make(NetMsgType::GETDATA, vInv));

+                connman.PushMessage(pfrom, msgMaker.Make(NetMsgType::GETDATA, vInv));

             }

             return true;

         }

@@ -2328,6 +2039,8 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr

         if (!fAlreadyInFlight && !CanDirectFetch(chainparams.GetConsensus()))

             return true;

 

+        CNodeState *nodestate = State(pfrom->GetId());

+

         if (IsWitnessEnabled(pindex->pprev, chainparams.GetConsensus()) && !nodestate->fSupportsDesiredCmpctVersion) {

             // Don't bother trying to process compact blocks from v1 peers

             // after segwit activates.

@@ -2361,7 +2074,7 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr

                     // Duplicate txindexes, the block is now in-flight, so just request it

                     std::vector<CInv> vInv(1);

                     vInv[0] = CInv(MSG_BLOCK | GetFetchFlags(pfrom), cmpctblock.header.GetHash());

-                    connman->PushMessage(pfrom, msgMaker.Make(NetMsgType::GETDATA, vInv));

+                    connman.PushMessage(pfrom, msgMaker.Make(NetMsgType::GETDATA, vInv));

                     return true;

                 }

 

@@ -2378,7 +2091,7 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr

                     fProcessBLOCKTXN = true;

                 } else {

                     req.blockhash = pindex->GetBlockHash();

-                    connman->PushMessage(pfrom, msgMaker.Make(NetMsgType::GETBLOCKTXN, req));

+                    connman.PushMessage(pfrom, msgMaker.Make(NetMsgType::GETBLOCKTXN, req));

                 }

             } else {

                 // This block is either already in flight from a different

@@ -2404,10 +2117,14 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr

                 // mempool will probably be useless - request the block normally

                 std::vector<CInv> vInv(1);

                 vInv[0] = CInv(MSG_BLOCK | GetFetchFlags(pfrom), cmpctblock.header.GetHash());

-                connman->PushMessage(pfrom, msgMaker.Make(NetMsgType::GETDATA, vInv));

+                connman.PushMessage(pfrom, msgMaker.Make(NetMsgType::GETDATA, vInv));

                 return true;

             } else {

                 // If this was an announce-cmpctblock, we want the same treatment as a header message

+                // Dirty hack to process as if it were just a headers message (TODO: move message handling into their own functions)

+                std::vector<CBlock> headers;

+                headers.push_back(cmpctblock.header);

+                vHeadersMsg << headers;

                 fRevertToHeaderProcessing = true;

             }

         }

@@ -2416,14 +2133,8 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr

         if (fProcessBLOCKTXN)

             return ProcessMessage(pfrom, NetMsgType::BLOCKTXN, blockTxnMsg, nTimeReceived, chainparams, connman, interruptMsgProc);

 

-        if (fRevertToHeaderProcessing) {

-            // Headers received from HB compact block peers are permitted to be

-            // relayed before full validation (see BIP 152), so we don't want to disconnect

-            // the peer if the header turns out to be for an invalid block.

-            // Note that if a peer tries to build on an invalid chain, that

-            // will be detected and the peer will be banned.

-            return ProcessHeadersMessage(pfrom, connman, {cmpctblock.header}, chainparams, /*punish_duplicate_invalid=*/false);

-        }

+        if (fRevertToHeaderProcessing)

+            return ProcessMessage(pfrom, NetMsgType::HEADERS, vHeadersMsg, nTimeReceived, chainparams, connman, interruptMsgProc);

 

         if (fBlockReconstructed) {

             // If we got here, we were able to optimistically reconstruct a

@@ -2433,16 +2144,7 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr

                 mapBlockSource.emplace(pblock->GetHash(), std::make_pair(pfrom->GetId(), false));

             }

             bool fNewBlock = false;

-            // Setting fForceProcessing to true means that we bypass some of

-            // our anti-DoS protections in AcceptBlock, which filters

-            // unrequested blocks that might be trying to waste our resources

-            // (eg disk space). Because we only try to reconstruct blocks when

-            // we're close to caught up (via the CanDirectFetch() requirement

-            // above, combined with the behavior of not requesting blocks until

-            // we have a chain with at least nMinimumChainWork), and we ignore

-            // compact blocks with less work than our tip, it is safe to treat

-            // reconstructed compact blocks as having been requested.

-            ProcessNewBlock(chainparams, pblock, /*fForceProcessing=*/true, &fNewBlock);

+            ProcessNewBlock(chainparams, pblock, true, &fNewBlock);

             if (fNewBlock) {

                 pfrom->nLastBlockTime = GetTime();

             } else {

@@ -2489,7 +2191,7 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr

                 // Might have collided, fall back to getdata now :(

                 std::vector<CInv> invs;

                 invs.push_back(CInv(MSG_BLOCK | GetFetchFlags(pfrom), resp.blockhash));

-                connman->PushMessage(pfrom, msgMaker.Make(NetMsgType::GETDATA, invs));

+                connman.PushMessage(pfrom, msgMaker.Make(NetMsgType::GETDATA, invs));

             } else {

                 // Block is either okay, or possibly we received

                 // READ_STATUS_CHECKBLOCK_FAILED.

@@ -2522,11 +2224,7 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr

             bool fNewBlock = false;

             // Since we requested this block (it was in mapBlocksInFlight), force it to be processed,

             // even if it would not be a candidate for new tip (missing previous block, chain not long enough, etc)

-            // This bypasses some anti-DoS logic in AcceptBlock (eg to prevent

-            // disk-space attacks), but this should be safe due to the

-            // protections in the compact block handler -- see related comment

-            // in compact block optimistic reconstruction handling.

-            ProcessNewBlock(chainparams, pblock, /*fForceProcessing=*/true, &fNewBlock);

+            ProcessNewBlock(chainparams, pblock, true, &fNewBlock);

             if (fNewBlock) {

                 pfrom->nLastBlockTime = GetTime();

             } else {

@@ -2554,12 +2252,136 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr

             ReadCompactSize(vRecv); // ignore tx count; assume it is 0.

         }

 

-        // Headers received via a HEADERS message should be valid, and reflect

-        // the chain the peer is on. If we receive a known-invalid header,

-        // disconnect the peer if it is using one of our outbound connection

-        // slots.

-        bool should_punish = !pfrom->fInbound && !pfrom->m_manual_connection;

-        return ProcessHeadersMessage(pfrom, connman, headers, chainparams, should_punish);

+        if (nCount == 0) {

+            // Nothing interesting. Stop asking this peers for more headers.

+            return true;

+        }

+

+        const CBlockIndex *pindexLast = nullptr;

+        {

+        LOCK(cs_main);

+        CNodeState *nodestate = State(pfrom->GetId());

+

+        // If this looks like it could be a block announcement (nCount <

+        // MAX_BLOCKS_TO_ANNOUNCE), use special logic for handling headers that

+        // don't connect:

+        // - Send a getheaders message in response to try to connect the chain.

+        // - The peer can send up to MAX_UNCONNECTING_HEADERS in a row that

+        //   don't connect before giving DoS points

+        // - Once a headers message is received that is valid and does connect,

+        //   nUnconnectingHeaders gets reset back to 0.

+        if (mapBlockIndex.find(headers[0].hashPrevBlock) == mapBlockIndex.end() && nCount < MAX_BLOCKS_TO_ANNOUNCE) {

+            nodestate->nUnconnectingHeaders++;

+            connman.PushMessage(pfrom, msgMaker.Make(NetMsgType::GETHEADERS, chainActive.GetLocator(pindexBestHeader), uint256()));

+            LogPrint(BCLog::NET, "received header %s: missing prev block %s, sending getheaders (%d) to end (peer=%d, nUnconnectingHeaders=%d)\n",

+                    headers[0].GetHash().ToString(),

+                    headers[0].hashPrevBlock.ToString(),

+                    pindexBestHeader->nHeight,

+                    pfrom->GetId(), nodestate->nUnconnectingHeaders);

+            // Set hashLastUnknownBlock for this peer, so that if we

+            // eventually get the headers - even from a different peer -

+            // we can use this peer to download.

+            UpdateBlockAvailability(pfrom->GetId(), headers.back().GetHash());

+

+            if (nodestate->nUnconnectingHeaders % MAX_UNCONNECTING_HEADERS == 0) {

+                Misbehaving(pfrom->GetId(), 20);

+            }

+            return true;

+        }

+

+        uint256 hashLastBlock;

+        for (const CBlockHeader& header : headers) {

+            if (!hashLastBlock.IsNull() && header.hashPrevBlock != hashLastBlock) {

+                Misbehaving(pfrom->GetId(), 20);

+                return error("non-continuous headers sequence");

+            }

+            hashLastBlock = header.GetHash();

+        }

+        }

+

+        CValidationState state;

+        if (!ProcessNewBlockHeaders(headers, state, chainparams, &pindexLast)) {

+            int nDoS;

+            if (state.IsInvalid(nDoS)) {

+                if (nDoS > 0) {

+                    LOCK(cs_main);

+                    Misbehaving(pfrom->GetId(), nDoS);

+                }

+                return error("invalid header received");

+            }

+        }

+

+        {

+        LOCK(cs_main);

+        CNodeState *nodestate = State(pfrom->GetId());

+        if (nodestate->nUnconnectingHeaders > 0) {

+            LogPrint(BCLog::NET, "peer=%d: resetting nUnconnectingHeaders (%d -> 0)\n", pfrom->GetId(), nodestate->nUnconnectingHeaders);

+        }

+        nodestate->nUnconnectingHeaders = 0;

+

+        assert(pindexLast);

+        UpdateBlockAvailability(pfrom->GetId(), pindexLast->GetBlockHash());

+

+        if (nCount == MAX_HEADERS_RESULTS) {

+            // Headers message had its maximum size; the peer may have more headers.

+            // TODO: optimize: if pindexLast is an ancestor of chainActive.Tip or pindexBestHeader, continue

+            // from there instead.

+            LogPrint(BCLog::NET, "more getheaders (%d) to end to peer=%d (startheight:%d)\n", pindexLast->nHeight, pfrom->GetId(), pfrom->nStartingHeight);

+            connman.PushMessage(pfrom, msgMaker.Make(NetMsgType::GETHEADERS, chainActive.GetLocator(pindexLast), uint256()));

+        }

+

+        bool fCanDirectFetch = CanDirectFetch(chainparams.GetConsensus());

+        // If this set of headers is valid and ends in a block with at least as

+        // much work as our tip, download as much as possible.

+        if (fCanDirectFetch && pindexLast->IsValid(BLOCK_VALID_TREE) && chainActive.Tip()->nChainWork <= pindexLast->nChainWork) {

+            std::vector<const CBlockIndex*> vToFetch;

+            const CBlockIndex *pindexWalk = pindexLast;

+            // Calculate all the blocks we'd need to switch to pindexLast, up to a limit.

+            while (pindexWalk && !chainActive.Contains(pindexWalk) && vToFetch.size() <= MAX_BLOCKS_IN_TRANSIT_PER_PEER) {

+                if (!(pindexWalk->nStatus & BLOCK_HAVE_DATA) &&

+                        !mapBlocksInFlight.count(pindexWalk->GetBlockHash()) &&

+                        (!IsWitnessEnabled(pindexWalk->pprev, chainparams.GetConsensus()) || State(pfrom->GetId())->fHaveWitness)) {

+                    // We don't have this block, and it's not yet in flight.

+                    vToFetch.push_back(pindexWalk);

+                }

+                pindexWalk = pindexWalk->pprev;

+            }

+            // If pindexWalk still isn't on our main chain, we're looking at a

+            // very large reorg at a time we think we're close to caught up to

+            // the main chain -- this shouldn't really happen.  Bail out on the

+            // direct fetch and rely on parallel download instead.

+            if (!chainActive.Contains(pindexWalk)) {

+                LogPrint(BCLog::NET, "Large reorg, won't direct fetch to %s (%d)\n",

+                        pindexLast->GetBlockHash().ToString(),

+                        pindexLast->nHeight);

+            } else {

+                std::vector<CInv> vGetData;

+                // Download as much as possible, from earliest to latest.

+                for (const CBlockIndex *pindex : reverse_iterate(vToFetch)) {

+                    if (nodestate->nBlocksInFlight >= MAX_BLOCKS_IN_TRANSIT_PER_PEER) {

+                        // Can't download any more from this peer

+                        break;

+                    }

+                    uint32_t nFetchFlags = GetFetchFlags(pfrom);

+                    vGetData.push_back(CInv(MSG_BLOCK | nFetchFlags, pindex->GetBlockHash()));

+                    MarkBlockAsInFlight(pfrom->GetId(), pindex->GetBlockHash(), pindex);

+                    LogPrint(BCLog::NET, "Requesting block %s from  peer=%d\n",

+                            pindex->GetBlockHash().ToString(), pfrom->GetId());

+                }

+                if (vGetData.size() > 1) {

+                    LogPrint(BCLog::NET, "Downloading blocks toward %s (%d) via headers direct fetch\n",

+                            pindexLast->GetBlockHash().ToString(), pindexLast->nHeight);

+                }

+                if (vGetData.size() > 0) {

+                    if (nodestate->fSupportsDesiredCmpctVersion && vGetData.size() == 1 && mapBlocksInFlight.size() == 1 && pindexLast->pprev->IsValid(BLOCK_VALID_CHAIN)) {

+                        // In any case, we want to download using a compact block, not a regular one

+                        vGetData[0] = CInv(MSG_CMPCT_BLOCK, vGetData[0].hash);

+                    }

+                    connman.PushMessage(pfrom, msgMaker.Make(NetMsgType::GETDATA, vGetData));

+                }

+            }

+        }

+        }

     }

 

     else if (strCommand == NetMsgType::BLOCK && !fImporting && !fReindex) // Ignore blocks received while importing

@@ -2569,7 +2391,11 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr

 

         LogPrint(BCLog::NET, "received block %s peer=%d\n", pblock->GetHash().ToString(), pfrom->GetId());

 

-        bool forceProcessing = false;

+        // Process all blocks from whitelisted peers, even if not requested,

+        // unless we're still syncing with the network.

+        // Such an unrequested block may still be processed, subject to the

+        // conditions in AcceptBlock().

+        bool forceProcessing = pfrom->fWhitelisted && !IsInitialBlockDownload();

         const uint256 hash(pblock->GetHash());

         {

             LOCK(cs_main);

@@ -2612,7 +2438,7 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr

         pfrom->fSentAddr = true;

 

         pfrom->vAddrToSend.clear();

-        std::vector<CAddress> vAddr = connman->GetAddresses();

+        std::vector<CAddress> vAddr = connman.GetAddresses();

         FastRandomContext insecure_rand;

         for (const CAddress &addr : vAddr)

             pfrom->PushAddress(addr, insecure_rand);

@@ -2628,7 +2454,7 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr

             return true;

         }

 

-        if (connman->OutboundTargetReached(false) && !pfrom->fWhitelisted)

+        if (connman.OutboundTargetReached(false) && !pfrom->fWhitelisted)

         {

             LogPrint(BCLog::NET, "mempool request with bandwidth limit reached, disconnect peer=%d\n", pfrom->GetId());

             pfrom->fDisconnect = true;

@@ -2657,7 +2483,7 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr

             // it, if the remote node sends a ping once per second and this node takes 5

             // seconds to respond to each, the 5th ping the remote sends would appear to

             // return very quickly.

-            connman->PushMessage(pfrom, msgMaker.Make(NetMsgType::PONG, nonce));

+            connman.PushMessage(pfrom, msgMaker.Make(NetMsgType::PONG, nonce));

         }

     }

 

@@ -2803,13 +2629,13 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr

     return true;

 }


  

-static bool SendRejectsAndCheckIfBanned(CNode* pnode, CConnman* connman)

+static bool SendRejectsAndCheckIfBanned(CNode* pnode, CConnman& connman)

 {

     AssertLockHeld(cs_main);

     CNodeState &state = *State(pnode->GetId());

 

     for (const CBlockReject& reject : state.rejects) {

-        connman->PushMessage(pnode, CNetMsgMaker(INIT_PROTO_VERSION).Make(NetMsgType::REJECT, (std::string)NetMsgType::BLOCK, reject.chRejectCode, reject.strRejectReason, reject.hashBlock));

+        connman.PushMessage(pnode, CNetMsgMaker(INIT_PROTO_VERSION).Make(NetMsgType::REJECT, (std::string)NetMsgType::BLOCK, reject.chRejectCode, reject.strRejectReason, reject.hashBlock));

     }

     state.rejects.clear();

 

@@ -2817,7 +2643,7 @@ static bool SendRejectsAndCheckIfBanned(CNode* pnode, CConnman* connman)

         state.fShouldBan = false;

         if (pnode->fWhitelisted)

             LogPrintf("Warning: not punishing whitelisted peer %s!\n", pnode->addr.ToString());

-        else if (pnode->m_manual_connection)

+        else if (pnode->fAddnode)

             LogPrintf("Warning: not punishing addnoded peer %s!\n", pnode->addr.ToString());

         else {

             pnode->fDisconnect = true;

@@ -2825,7 +2651,7 @@ static bool SendRejectsAndCheckIfBanned(CNode* pnode, CConnman* connman)

                 LogPrintf("Warning: not banning local peer %s!\n", pnode->addr.ToString());

             else

             {

-                connman->Ban(pnode->addr, BanReasonNodeMisbehaving);

+                connman.Ban(pnode->addr, BanReasonNodeMisbehaving);

             }

         }

         return true;

@@ -2833,7 +2659,7 @@ static bool SendRejectsAndCheckIfBanned(CNode* pnode, CConnman* connman)

     return false;

 }

 

-bool PeerLogicValidation::ProcessMessages(CNode* pfrom, std::atomic<bool>& interruptMsgProc)

+bool ProcessMessages(CNode* pfrom, CConnman& connman, const std::atomic<bool>& interruptMsgProc)

 {

     const CChainParams& chainparams = Params();

     //

@@ -2867,7 +2693,7 @@ bool PeerLogicValidation::ProcessMessages(CNode* pfrom, std::atomic<bool>& inter

         // Just take one message

         msgs.splice(msgs.begin(), pfrom->vProcessMsg, pfrom->vProcessMsg.begin());

         pfrom->nProcessQueueSize -= msgs.front().vRecv.size() + CMessageHeader::HEADER_SIZE;

-        pfrom->fPauseRecv = pfrom->nProcessQueueSize > connman->GetReceiveFloodSize();

+        pfrom->fPauseRecv = pfrom->nProcessQueueSize > connman.GetReceiveFloodSize();

         fMoreWork = !pfrom->vProcessMsg.empty();

     }

     CNetMessage& msg(msgs.front());

@@ -2916,7 +2742,7 @@ bool PeerLogicValidation::ProcessMessages(CNode* pfrom, std::atomic<bool>& inter

     }

     catch (const std::ios_base::failure& e)

     {

-        connman->PushMessage(pfrom, CNetMsgMaker(INIT_PROTO_VERSION).Make(NetMsgType::REJECT, strCommand, REJECT_MALFORMED, std::string("error parsing message")));

+        connman.PushMessage(pfrom, CNetMsgMaker(INIT_PROTO_VERSION).Make(NetMsgType::REJECT, strCommand, REJECT_MALFORMED, std::string("error parsing message")));

         if (strstr(e.what(), "end of data"))

         {

             // Allow exceptions from under-length message on vRecv

@@ -2953,135 +2779,6 @@ bool PeerLogicValidation::ProcessMessages(CNode* pfrom, std::atomic<bool>& inter

     return fMoreWork;

 }

 

-void PeerLogicValidation::ConsiderEviction(CNode *pto, int64_t time_in_seconds)

-{

-    AssertLockHeld(cs_main);

-

-    CNodeState &state = *State(pto->GetId());

-    const CNetMsgMaker msgMaker(pto->GetSendVersion());

-

-    if (!state.m_chain_sync.m_protect && IsOutboundDisconnectionCandidate(pto) && state.fSyncStarted) {

-        // This is an outbound peer subject to disconnection if they don't

-        // announce a block with as much work as the current tip within

-        // CHAIN_SYNC_TIMEOUT + HEADERS_RESPONSE_TIME seconds (note: if

-        // their chain has more work than ours, we should sync to it,

-        // unless it's invalid, in which case we should find that out and

-        // disconnect from them elsewhere).

-        if (state.pindexBestKnownBlock != nullptr && state.pindexBestKnownBlock->nChainWork >= chainActive.Tip()->nChainWork) {

-            if (state.m_chain_sync.m_timeout != 0) {

-                state.m_chain_sync.m_timeout = 0;

-                state.m_chain_sync.m_work_header = nullptr;

-                state.m_chain_sync.m_sent_getheaders = false;

-            }

-        } else if (state.m_chain_sync.m_timeout == 0 || (state.m_chain_sync.m_work_header != nullptr && state.pindexBestKnownBlock != nullptr && state.pindexBestKnownBlock->nChainWork >= state.m_chain_sync.m_work_header->nChainWork)) {

-            // Our best block known by this peer is behind our tip, and we're either noticing

-            // that for the first time, OR this peer was able to catch up to some earlier point

-            // where we checked against our tip.

-            // Either way, set a new timeout based on current tip.

-            state.m_chain_sync.m_timeout = time_in_seconds + CHAIN_SYNC_TIMEOUT;

-            state.m_chain_sync.m_work_header = chainActive.Tip();

-            state.m_chain_sync.m_sent_getheaders = false;

-        } else if (state.m_chain_sync.m_timeout > 0 && time_in_seconds > state.m_chain_sync.m_timeout) {

-            // No evidence yet that our peer has synced to a chain with work equal to that

-            // of our tip, when we first detected it was behind. Send a single getheaders

-            // message to give the peer a chance to update us.

-            if (state.m_chain_sync.m_sent_getheaders) {

-                // They've run out of time to catch up!

-                LogPrintf("Disconnecting outbound peer %d for old chain, best known block = %s\n", pto->GetId(), state.pindexBestKnownBlock != nullptr ? state.pindexBestKnownBlock->GetBlockHash().ToString() : "<none>");

-                pto->fDisconnect = true;

-            } else {

-                LogPrint(BCLog::NET, "sending getheaders to outbound peer=%d to verify chain work (current best known block:%s, benchmark blockhash: %s)\n", pto->GetId(), state.pindexBestKnownBlock != nullptr ? state.pindexBestKnownBlock->GetBlockHash().ToString() : "<none>", state.m_chain_sync.m_work_header->GetBlockHash().ToString());

-                connman->PushMessage(pto, msgMaker.Make(NetMsgType::GETHEADERS, chainActive.GetLocator(state.m_chain_sync.m_work_header->pprev), uint256()));

-                state.m_chain_sync.m_sent_getheaders = true;

-                constexpr int64_t HEADERS_RESPONSE_TIME = 120; // 2 minutes

-                // Bump the timeout to allow a response, which could clear the timeout

-                // (if the response shows the peer has synced), reset the timeout (if

-                // the peer syncs to the required work but not to our tip), or result

-                // in disconnect (if we advance to the timeout and pindexBestKnownBlock

-                // has not sufficiently progressed)

-                state.m_chain_sync.m_timeout = time_in_seconds + HEADERS_RESPONSE_TIME;

-            }

-        }

-    }

-}

-

-void PeerLogicValidation::EvictExtraOutboundPeers(int64_t time_in_seconds)

-{

-    // Check whether we have too many outbound peers

-    int extra_peers = connman->GetExtraOutboundCount();

-    if (extra_peers > 0) {

-        // If we have more outbound peers than we target, disconnect one.

-        // Pick the outbound peer that least recently announced

-        // us a new block, with ties broken by choosing the more recent

-        // connection (higher node id)

-        NodeId worst_peer = -1;

-        int64_t oldest_block_announcement = std::numeric_limits<int64_t>::max();

-

-        LOCK(cs_main);

-

-        connman->ForEachNode([&](CNode* pnode) {

-            // Ignore non-outbound peers, or nodes marked for disconnect already

-            if (!IsOutboundDisconnectionCandidate(pnode) || pnode->fDisconnect) return;

-            CNodeState *state = State(pnode->GetId());

-            if (state == nullptr) return; // shouldn't be possible, but just in case

-            // Don't evict our protected peers

-            if (state->m_chain_sync.m_protect) return;

-            if (state->m_last_block_announcement < oldest_block_announcement || (state->m_last_block_announcement == oldest_block_announcement && pnode->GetId() > worst_peer)) {

-                worst_peer = pnode->GetId();

-                oldest_block_announcement = state->m_last_block_announcement;

-            }

-        });

-        if (worst_peer != -1) {

-            bool disconnected = connman->ForNode(worst_peer, [&](CNode *pnode) {

-                // Only disconnect a peer that has been connected to us for

-                // some reasonable fraction of our check-frequency, to give

-                // it time for new information to have arrived.

-                // Also don't disconnect any peer we're trying to download a

-                // block from.

-                CNodeState &state = *State(pnode->GetId());

-                if (time_in_seconds - pnode->nTimeConnected > MINIMUM_CONNECT_TIME && state.nBlocksInFlight == 0) {

-                    LogPrint(BCLog::NET, "disconnecting extra outbound peer=%d (last block announcement received at time %d)\n", pnode->GetId(), oldest_block_announcement);

-                    pnode->fDisconnect = true;

-                    return true;

-                } else {

-                    LogPrint(BCLog::NET, "keeping outbound peer=%d chosen for eviction (connect time: %d, blocks_in_flight: %d)\n", pnode->GetId(), pnode->nTimeConnected, state.nBlocksInFlight);

-                    return false;

-                }

-            });

-            if (disconnected) {

-                // If we disconnected an extra peer, that means we successfully

-                // connected to at least one peer after the last time we

-                // detected a stale tip. Don't try any more extra peers until

-                // we next detect a stale tip, to limit the load we put on the

-                // network from these extra connections.

-                connman->SetTryNewOutboundPeer(false);

-            }

-        }

-    }

-}

-

-void PeerLogicValidation::CheckForStaleTipAndEvictPeers(const Consensus::Params &consensusParams)

-{

-    if (connman == nullptr) return;

-

-    int64_t time_in_seconds = GetTime();

-

-    EvictExtraOutboundPeers(time_in_seconds);

-

-    if (time_in_seconds > m_stale_tip_check_time) {

-        LOCK(cs_main);

-        // Check whether our tip is stale, and if so, allow using an extra

-        // outbound peer

-        if (TipMayBeStale(consensusParams)) {

-            LogPrintf("Potential stale tip detected, will try using extra outbound peer (last tip update: %d seconds ago)\n", time_in_seconds - g_last_tip_update);

-            connman->SetTryNewOutboundPeer(true);

-        } else if (connman->GetTryNewOutboundPeer()) {

-            connman->SetTryNewOutboundPeer(false);

-        }

-        m_stale_tip_check_time = time_in_seconds + STALE_CHECK_INTERVAL;

-    }

-}

-

 class CompareInvMempoolOrder

 {

     CTxMemPool *mp;

@@ -3099,7 +2796,7 @@ public:

     }

 };

 

-bool PeerLogicValidation::SendMessages(CNode* pto, std::atomic<bool>& interruptMsgProc)

+bool SendMessages(CNode* pto, CConnman& connman, const std::atomic<bool>& interruptMsgProc)

 {

     const Consensus::Params& consensusParams = Params().GetConsensus();

     {

@@ -3131,11 +2828,11 @@ bool PeerLogicValidation::SendMessages(CNode* pto, std::atomic<bool>& interruptM

             pto->nPingUsecStart = GetTimeMicros();

             if (pto->nVersion > BIP0031_VERSION) {

                 pto->nPingNonceSent = nonce;

-                connman->PushMessage(pto, msgMaker.Make(NetMsgType::PING, nonce));

+                connman.PushMessage(pto, msgMaker.Make(NetMsgType::PING, nonce));

             } else {

                 // Peer is too old to support ping command with nonce, pong will never arrive.

                 pto->nPingNonceSent = 0;

-                connman->PushMessage(pto, msgMaker.Make(NetMsgType::PING));

+                connman.PushMessage(pto, msgMaker.Make(NetMsgType::PING));

             }

         }

 

@@ -3170,14 +2867,14 @@ bool PeerLogicValidation::SendMessages(CNode* pto, std::atomic<bool>& interruptM

                     // receiver rejects addr messages larger than 1000

                     if (vAddr.size() >= 1000)

                     {

-                        connman->PushMessage(pto, msgMaker.Make(NetMsgType::ADDR, vAddr));

+                        connman.PushMessage(pto, msgMaker.Make(NetMsgType::ADDR, vAddr));

                         vAddr.clear();

                     }

                 }

             }

             pto->vAddrToSend.clear();

             if (!vAddr.empty())

-                connman->PushMessage(pto, msgMaker.Make(NetMsgType::ADDR, vAddr));

+                connman.PushMessage(pto, msgMaker.Make(NetMsgType::ADDR, vAddr));

             // we only send the big addr message once

             if (pto->vAddrToSend.capacity() > 40)

                 pto->vAddrToSend.shrink_to_fit();

@@ -3204,7 +2901,7 @@ bool PeerLogicValidation::SendMessages(CNode* pto, std::atomic<bool>& interruptM

                 if (pindexStart->pprev)

                     pindexStart = pindexStart->pprev;

                 LogPrint(BCLog::NET, "initial getheaders (%d) to peer=%d (startheight:%d)\n", pindexStart->nHeight, pto->GetId(), pto->nStartingHeight);

-                connman->PushMessage(pto, msgMaker.Make(NetMsgType::GETHEADERS, chainActive.GetLocator(pindexStart), uint256()));

+                connman.PushMessage(pto, msgMaker.Make(NetMsgType::GETHEADERS, chainActive.GetLocator(pindexStart), uint256()));

             }

         }

 

@@ -3213,7 +2910,7 @@ bool PeerLogicValidation::SendMessages(CNode* pto, std::atomic<bool>& interruptM

         // transactions become unconfirmed and spams other nodes.

         if (!fReindex && !fImporting && !IsInitialBlockDownload())

         {

-            GetMainSignals().Broadcast(nTimeBestReceived, connman);

+            GetMainSignals().Broadcast(nTimeBestReceived, &connman);

         }

 

         //

@@ -3297,10 +2994,10 @@ bool PeerLogicValidation::SendMessages(CNode* pto, std::atomic<bool>& interruptM

                         LOCK(cs_most_recent_block);

                         if (most_recent_block_hash == pBestIndex->GetBlockHash()) {

                             if (state.fWantsCmpctWitness || !fWitnessesPresentInMostRecentCompactBlock)

-                                connman->PushMessage(pto, msgMaker.Make(nSendFlags, NetMsgType::CMPCTBLOCK, *most_recent_compact_block));

+                                connman.PushMessage(pto, msgMaker.Make(nSendFlags, NetMsgType::CMPCTBLOCK, *most_recent_compact_block));

                             else {

                                 CBlockHeaderAndShortTxIDs cmpctblock(*most_recent_block, state.fWantsCmpctWitness);

-                                connman->PushMessage(pto, msgMaker.Make(nSendFlags, NetMsgType::CMPCTBLOCK, cmpctblock));

+                                connman.PushMessage(pto, msgMaker.Make(nSendFlags, NetMsgType::CMPCTBLOCK, cmpctblock));

                             }

                             fGotBlockFromCache = true;

                         }

@@ -3310,7 +3007,7 @@ bool PeerLogicValidation::SendMessages(CNode* pto, std::atomic<bool>& interruptM

                         bool ret = ReadBlockFromDisk(block, pBestIndex, consensusParams);

                         assert(ret);

                         CBlockHeaderAndShortTxIDs cmpctblock(block, state.fWantsCmpctWitness);

-                        connman->PushMessage(pto, msgMaker.Make(nSendFlags, NetMsgType::CMPCTBLOCK, cmpctblock));

+                        connman.PushMessage(pto, msgMaker.Make(nSendFlags, NetMsgType::CMPCTBLOCK, cmpctblock));

                     }

                     state.pindexBestHeaderSent = pBestIndex;

                 } else if (state.fPreferHeaders) {

@@ -3323,7 +3020,7 @@ bool PeerLogicValidation::SendMessages(CNode* pto, std::atomic<bool>& interruptM

                         LogPrint(BCLog::NET, "%s: sending header %s to peer=%d\n", __func__,

                                 vHeaders.front().GetHash().ToString(), pto->GetId());

                     }

-                    connman->PushMessage(pto, msgMaker.Make(NetMsgType::HEADERS, vHeaders));

+                    connman.PushMessage(pto, msgMaker.Make(NetMsgType::HEADERS, vHeaders));

                     state.pindexBestHeaderSent = pBestIndex;

                 } else

                     fRevertToInv = true;

@@ -3369,7 +3066,7 @@ bool PeerLogicValidation::SendMessages(CNode* pto, std::atomic<bool>& interruptM

             for (const uint256& hash : pto->vInventoryBlockToSend) {

                 vInv.push_back(CInv(MSG_BLOCK, hash));

                 if (vInv.size() == MAX_INV_SZ) {

-                    connman->PushMessage(pto, msgMaker.Make(NetMsgType::INV, vInv));

+                    connman.PushMessage(pto, msgMaker.Make(NetMsgType::INV, vInv));

                     vInv.clear();

                 }

             }

@@ -3415,7 +3112,7 @@ bool PeerLogicValidation::SendMessages(CNode* pto, std::atomic<bool>& interruptM

                     pto->filterInventoryKnown.insert(hash);

                     vInv.push_back(inv);

                     if (vInv.size() == MAX_INV_SZ) {

-                        connman->PushMessage(pto, msgMaker.Make(NetMsgType::INV, vInv));

+                        connman.PushMessage(pto, msgMaker.Make(NetMsgType::INV, vInv));

                         vInv.clear();

                     }

                 }

@@ -3481,7 +3178,7 @@ bool PeerLogicValidation::SendMessages(CNode* pto, std::atomic<bool>& interruptM

                         }

                     }

                     if (vInv.size() == MAX_INV_SZ) {

-                        connman->PushMessage(pto, msgMaker.Make(NetMsgType::INV, vInv));

+                        connman.PushMessage(pto, msgMaker.Make(NetMsgType::INV, vInv));

                         vInv.clear();

                     }

                     pto->filterInventoryKnown.insert(hash);

@@ -3489,7 +3186,7 @@ bool PeerLogicValidation::SendMessages(CNode* pto, std::atomic<bool>& interruptM

             }

         }

         if (!vInv.empty())

-            connman->PushMessage(pto, msgMaker.Make(NetMsgType::INV, vInv));

+            connman.PushMessage(pto, msgMaker.Make(NetMsgType::INV, vInv));

 

         // Detect whether we're stalling

         nNow = GetTimeMicros();

@@ -3548,9 +3245,6 @@ bool PeerLogicValidation::SendMessages(CNode* pto, std::atomic<bool>& interruptM

             }

         }

 

-        // Check that outbound peers have reasonable chains

-        // GetTime() is used by this anti-DoS logic so we can test this using mocktime

-        ConsiderEviction(pto, GetTime());

 

         //

         // Message: getdata (blocks)

@@ -3587,7 +3281,7 @@ bool PeerLogicValidation::SendMessages(CNode* pto, std::atomic<bool>& interruptM

                 vGetData.push_back(inv);

                 if (vGetData.size() >= 1000)

                 {

-                    connman->PushMessage(pto, msgMaker.Make(NetMsgType::GETDATA, vGetData));

+                    connman.PushMessage(pto, msgMaker.Make(NetMsgType::GETDATA, vGetData));

                     vGetData.clear();

                 }

             } else {

@@ -3597,7 +3291,7 @@ bool PeerLogicValidation::SendMessages(CNode* pto, std::atomic<bool>& interruptM

             pto->mapAskFor.erase(pto->mapAskFor.begin());

         }

         if (!vGetData.empty())

-            connman->PushMessage(pto, msgMaker.Make(NetMsgType::GETDATA, vGetData));

+            connman.PushMessage(pto, msgMaker.Make(NetMsgType::GETDATA, vGetData));

 

         //

         // Message: feefilter

@@ -3614,7 +3308,7 @@ bool PeerLogicValidation::SendMessages(CNode* pto, std::atomic<bool>& interruptM

                 // We always have a fee filter of at least minRelayTxFee

                 filterToSend = std::max(filterToSend, ::minRelayTxFee.GetFeePerK());

                 if (filterToSend != pto->lastSentFeeFilter) {

-                    connman->PushMessage(pto, msgMaker.Make(NetMsgType::FEEFILTER, filterToSend));

+                    connman.PushMessage(pto, msgMaker.Make(NetMsgType::FEEFILTER, filterToSend));

                     pto->lastSentFeeFilter = filterToSend;

                 }

                 pto->nextSendTimeFeeFilter = PoissonNextSend(timeNow, AVG_FEEFILTER_BROADCAST_INTERVAL);

--- a/src/net_processing.h

+++ b/src/net_processing.h

@@ -8,7 +8,6 @@

 

 #include "net.h"

 #include "validationinterface.h"

-#include "consensus/params.h"

 

 /** Default for -maxorphantx, maximum number of orphan transactions kept in memory */

 static const unsigned int DEFAULT_MAX_ORPHAN_TRANSACTIONS = 100;

@@ -22,51 +21,23 @@ static const unsigned int DEFAULT_BLOCK_RECONSTRUCTION_EXTRA_TXN = 100;

  *  Timeout = base + per_header * (expected number of headers) */

 static constexpr int64_t HEADERS_DOWNLOAD_TIMEOUT_BASE = 15 * 60 * 1000000; // 15 minutes

 static constexpr int64_t HEADERS_DOWNLOAD_TIMEOUT_PER_HEADER = 1000; // 1ms/header

-/** Protect at least this many outbound peers from disconnection due to slow/

- * behind headers chain.

- */

-static constexpr int32_t MAX_OUTBOUND_PEERS_TO_PROTECT_FROM_DISCONNECT = 4;

-/** Timeout for (unprotected) outbound peers to sync to our chainwork, in seconds */

-static constexpr int64_t CHAIN_SYNC_TIMEOUT = 20 * 60; // 20 minutes

-/** How frequently to check for stale tips, in seconds */

-static constexpr int64_t STALE_CHECK_INTERVAL = 10 * 60; // 10 minutes

-/** How frequently to check for extra outbound peers and disconnect, in seconds */

-static constexpr int64_t EXTRA_PEER_CHECK_INTERVAL = 45;

-/** Minimum time an outbound-peer-eviction candidate must be connected for, in order to evict, in seconds */

-static constexpr int64_t MINIMUM_CONNECT_TIME = 30;

 

-class PeerLogicValidation : public CValidationInterface, public NetEventsInterface {

+/** Register with a network node to receive its signals */

+void RegisterNodeSignals(CNodeSignals& nodeSignals);

+/** Unregister a network node */

+void UnregisterNodeSignals(CNodeSignals& nodeSignals);

+

+class PeerLogicValidation : public CValidationInterface {

 private:

-    CConnman* const connman;

+    CConnman* connman;

 

 public:

-    explicit PeerLogicValidation(CConnman* connman, CScheduler &scheduler);

+    PeerLogicValidation(CConnman* connmanIn);

 

     void BlockConnected(const std::shared_ptr<const CBlock>& pblock, const CBlockIndex* pindexConnected, const std::vector<CTransactionRef>& vtxConflicted) override;

     void UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload) override;

     void BlockChecked(const CBlock& block, const CValidationState& state) override;

     void NewPoWValidBlock(const CBlockIndex *pindex, const std::shared_ptr<const CBlock>& pblock) override;

-

-

-    void InitializeNode(CNode* pnode) override;

-    void FinalizeNode(NodeId nodeid, bool& fUpdateConnectionTime) override;

-    /** Process protocol messages received from a given node */

-    bool ProcessMessages(CNode* pfrom, std::atomic<bool>& interrupt) override;

-    /**

-    * Send queued protocol messages to be sent to a give node.

-    *

-    * @param[in]   pto             The node which we are sending messages to.

-    * @param[in]   interrupt       Interrupt condition for processing threads

-    * @return                      True if there is more work to be done

-    */

-    bool SendMessages(CNode* pto, std::atomic<bool>& interrupt) override;

-

-    void ConsiderEviction(CNode *pto, int64_t time_in_seconds);

-    void CheckForStaleTipAndEvictPeers(const Consensus::Params &consensusParams);

-    void EvictExtraOutboundPeers(int64_t time_in_seconds);

-

-private:

-    int64_t m_stale_tip_check_time; //! Next time to check for stale tip

 };

 

 struct CNodeStateStats {

@@ -81,4 +52,16 @@ bool GetNodeStateStats(NodeId nodeid, CNodeStateStats &stats);

 /** Increase a node's misbehavior score. */

 void Misbehaving(NodeId nodeid, int howmuch);

 

+/** Process protocol messages received from a given node */

+bool ProcessMessages(CNode* pfrom, CConnman& connman, const std::atomic<bool>& interrupt);

+/**

+ * Send queued protocol messages to be sent to a give node.

+ *

+ * @param[in]   pto             The node which we are sending messages to.

+ * @param[in]   connman         The connection manager for that node.

+ * @param[in]   interrupt       Interrupt condition for processing threads

+ * @return                      True if there is more work to be done

+ */

+bool SendMessages(CNode* pto, CConnman& connman, const std::atomic<bool>& interrupt);

+

 #endif // BITCOIN_NET_PROCESSING_H

--- a/src/netbase.cpp

+++ b/src/netbase.cpp

@@ -184,48 +184,6 @@ struct timeval MillisToTimeval(int64_t nTimeout)

     return timeout;

 }

 

-/** SOCKS version */

-enum SOCKSVersion: uint8_t {

-    SOCKS4 = 0x04,

-    SOCKS5 = 0x05

-};

-

-/** Values defined for METHOD in RFC1928 */

-enum SOCKS5Method: uint8_t {

-    NOAUTH = 0x00,        //! No authentication required

-    GSSAPI = 0x01,        //! GSSAPI

-    USER_PASS = 0x02,     //! Username/password

-    NO_ACCEPTABLE = 0xff, //! No acceptable methods

-};

-

-/** Values defined for CMD in RFC1928 */

-enum SOCKS5Command: uint8_t {

-    CONNECT = 0x01,

-    BIND = 0x02,

-    UDP_ASSOCIATE = 0x03

-};

-

-/** Values defined for REP in RFC1928 */

-enum SOCKS5Reply: uint8_t {

-    SUCCEEDED = 0x00,        //! Succeeded

-    GENFAILURE = 0x01,       //! General failure

-    NOTALLOWED = 0x02,       //! Connection not allowed by ruleset

-    NETUNREACHABLE = 0x03,   //! Network unreachable

-    HOSTUNREACHABLE = 0x04,  //! Network unreachable

-    CONNREFUSED = 0x05,      //! Connection refused

-    TTLEXPIRED = 0x06,       //! TTL expired

-    CMDUNSUPPORTED = 0x07,   //! Command not supported

-    ATYPEUNSUPPORTED = 0x08, //! Address type not supported

-};

-

-/** Values defined for ATYPE in RFC1928 */

-enum SOCKS5Atyp: uint8_t {

-    IPV4 = 0x01,

-    DOMAINNAME = 0x03,

-    IPV6 = 0x04,

-};

-

-/** Status codes that can be returned by InterruptibleRecv */

 enum class IntrRecvError {

     OK,

     Timeout,

@@ -245,7 +203,7 @@ enum class IntrRecvError {

  *

  * @note This function requires that hSocket is in non-blocking mode.

  */

-static IntrRecvError InterruptibleRecv(uint8_t* data, size_t len, int timeout, const SOCKET& hSocket)

+static IntrRecvError InterruptibleRecv(char* data, size_t len, int timeout, const SOCKET& hSocket)

 {

     int64_t curTime = GetTimeMillis();

     int64_t endTime = curTime + timeout;

@@ -253,7 +211,7 @@ static IntrRecvError InterruptibleRecv(uint8_t* data, size_t len, int timeout, c

     // to break off in case of an interruption.

     const int64_t maxWait = 1000;

     while (len > 0 && curTime < endTime) {

-        ssize_t ret = recv(hSocket, (char*)data, len, 0); // Optimistically try the recv first

+        ssize_t ret = recv(hSocket, data, len, 0); // Optimistically try the recv first

         if (ret > 0) {

             len -= ret;

             data += ret;

@@ -284,35 +242,24 @@ static IntrRecvError InterruptibleRecv(uint8_t* data, size_t len, int timeout, c

     return len == 0 ? IntrRecvError::OK : IntrRecvError::Timeout;

 }

 

-/** Credentials for proxy authentication */

 struct ProxyCredentials

 {

     std::string username;

     std::string password;

 };

 

-/** Convert SOCKS5 reply to a an error message */

-std::string Socks5ErrorString(uint8_t err)

+std::string Socks5ErrorString(int err)

 {

     switch(err) {

-        case SOCKS5Reply::GENFAILURE:

-            return "general failure";

-        case SOCKS5Reply::NOTALLOWED:

-            return "connection not allowed";

-        case SOCKS5Reply::NETUNREACHABLE:

-            return "network unreachable";

-        case SOCKS5Reply::HOSTUNREACHABLE:

-            return "host unreachable";

-        case SOCKS5Reply::CONNREFUSED:

-            return "connection refused";

-        case SOCKS5Reply::TTLEXPIRED:

-            return "TTL expired";

-        case SOCKS5Reply::CMDUNSUPPORTED:

-            return "protocol error";

-        case SOCKS5Reply::ATYPEUNSUPPORTED:

-            return "address type not supported";

-        default:

-            return "unknown";

+        case 0x01: return "general failure";

+        case 0x02: return "connection not allowed";

+        case 0x03: return "network unreachable";

+        case 0x04: return "host unreachable";

+        case 0x05: return "connection refused";

+        case 0x06: return "TTL expired";

+        case 0x07: return "protocol error";

+        case 0x08: return "address type not supported";

+        default:   return "unknown";

     }

 }

 

@@ -327,34 +274,34 @@ static bool Socks5(const std::string& strDest, int port, const ProxyCredentials

     }

     // Accepted authentication methods

     std::vector<uint8_t> vSocks5Init;

-    vSocks5Init.push_back(SOCKSVersion::SOCKS5);

+    vSocks5Init.push_back(0x05);

     if (auth) {

-        vSocks5Init.push_back(0x02); // Number of methods

-        vSocks5Init.push_back(SOCKS5Method::NOAUTH);

-        vSocks5Init.push_back(SOCKS5Method::USER_PASS);

+        vSocks5Init.push_back(0x02); // # METHODS

+        vSocks5Init.push_back(0x00); // X'00' NO AUTHENTICATION REQUIRED

+        vSocks5Init.push_back(0x02); // X'02' USERNAME/PASSWORD (RFC1929)

     } else {

-        vSocks5Init.push_back(0x01); // Number of methods

-        vSocks5Init.push_back(SOCKS5Method::NOAUTH);

+        vSocks5Init.push_back(0x01); // # METHODS

+        vSocks5Init.push_back(0x00); // X'00' NO AUTHENTICATION REQUIRED

     }

     ssize_t ret = send(hSocket, (const char*)vSocks5Init.data(), vSocks5Init.size(), MSG_NOSIGNAL);

     if (ret != (ssize_t)vSocks5Init.size()) {

         CloseSocket(hSocket);

         return error("Error sending to proxy");

     }

-    uint8_t pchRet1[2];

+    char pchRet1[2];

     if ((recvr = InterruptibleRecv(pchRet1, 2, SOCKS5_RECV_TIMEOUT, hSocket)) != IntrRecvError::OK) {

         CloseSocket(hSocket);

         LogPrintf("Socks5() connect to %s:%d failed: InterruptibleRecv() timeout or other failure\n", strDest, port);

         return false;

     }

-    if (pchRet1[0] != SOCKSVersion::SOCKS5) {

+    if (pchRet1[0] != 0x05) {

         CloseSocket(hSocket);

         return error("Proxy failed to initialize");

     }

-    if (pchRet1[1] == SOCKS5Method::USER_PASS && auth) {

+    if (pchRet1[1] == 0x02 && auth) {

         // Perform username/password authentication (as described in RFC1929)

         std::vector<uint8_t> vAuth;

-        vAuth.push_back(0x01); // Current (and only) version of user/pass subnegotiation

+        vAuth.push_back(0x01);

         if (auth->username.size() > 255 || auth->password.size() > 255)

             return error("Proxy username or password too long");

         vAuth.push_back(auth->username.size());

@@ -367,7 +314,7 @@ static bool Socks5(const std::string& strDest, int port, const ProxyCredentials

             return error("Error sending authentication to proxy");

         }

         LogPrint(BCLog::PROXY, "SOCKS5 sending proxy authentication %s:%s\n", auth->username, auth->password);

-        uint8_t pchRetA[2];

+        char pchRetA[2];

         if ((recvr = InterruptibleRecv(pchRetA, 2, SOCKS5_RECV_TIMEOUT, hSocket)) != IntrRecvError::OK) {

             CloseSocket(hSocket);

             return error("Error reading proxy authentication response");

@@ -376,17 +323,17 @@ static bool Socks5(const std::string& strDest, int port, const ProxyCredentials

             CloseSocket(hSocket);

             return error("Proxy authentication unsuccessful");

         }

-    } else if (pchRet1[1] == SOCKS5Method::NOAUTH) {

+    } else if (pchRet1[1] == 0x00) {

         // Perform no authentication

     } else {

         CloseSocket(hSocket);

         return error("Proxy requested wrong authentication method %02x", pchRet1[1]);

     }

     std::vector<uint8_t> vSocks5;

-    vSocks5.push_back(SOCKSVersion::SOCKS5); // VER protocol version

-    vSocks5.push_back(SOCKS5Command::CONNECT); // CMD CONNECT

-    vSocks5.push_back(0x00); // RSV Reserved must be 0

-    vSocks5.push_back(SOCKS5Atyp::DOMAINNAME); // ATYP DOMAINNAME

+    vSocks5.push_back(0x05); // VER protocol version

+    vSocks5.push_back(0x01); // CMD CONNECT

+    vSocks5.push_back(0x00); // RSV Reserved

+    vSocks5.push_back(0x03); // ATYP DOMAINNAME

     vSocks5.push_back(strDest.size()); // Length<=255 is checked at beginning of function

     vSocks5.insert(vSocks5.end(), strDest.begin(), strDest.end());

     vSocks5.push_back((port >> 8) & 0xFF);

@@ -396,7 +343,7 @@ static bool Socks5(const std::string& strDest, int port, const ProxyCredentials

         CloseSocket(hSocket);

         return error("Error sending to proxy");

     }

-    uint8_t pchRet2[4];

+    char pchRet2[4];

     if ((recvr = InterruptibleRecv(pchRet2, 4, SOCKS5_RECV_TIMEOUT, hSocket)) != IntrRecvError::OK) {

         CloseSocket(hSocket);

         if (recvr == IntrRecvError::Timeout) {

@@ -408,26 +355,26 @@ static bool Socks5(const std::string& strDest, int port, const ProxyCredentials

             return error("Error while reading proxy response");

         }

     }

-    if (pchRet2[0] != SOCKSVersion::SOCKS5) {

+    if (pchRet2[0] != 0x05) {

         CloseSocket(hSocket);

         return error("Proxy failed to accept request");

     }

-    if (pchRet2[1] != SOCKS5Reply::SUCCEEDED) {

+    if (pchRet2[1] != 0x00) {

         // Failures to connect to a peer that are not proxy errors

         CloseSocket(hSocket);

         LogPrintf("Socks5() connect to %s:%d failed: %s\n", strDest, port, Socks5ErrorString(pchRet2[1]));

         return false;

     }

-    if (pchRet2[2] != 0x00) { // Reserved field must be 0

+    if (pchRet2[2] != 0x00) {

         CloseSocket(hSocket);

         return error("Error: malformed proxy response");

     }

-    uint8_t pchRet3[256];

+    char pchRet3[256];

     switch (pchRet2[3])

     {

-        case SOCKS5Atyp::IPV4: recvr = InterruptibleRecv(pchRet3, 4, SOCKS5_RECV_TIMEOUT, hSocket); break;

-        case SOCKS5Atyp::IPV6: recvr = InterruptibleRecv(pchRet3, 16, SOCKS5_RECV_TIMEOUT, hSocket); break;

-        case SOCKS5Atyp::DOMAINNAME:

+        case 0x01: recvr = InterruptibleRecv(pchRet3, 4, SOCKS5_RECV_TIMEOUT, hSocket); break;

+        case 0x04: recvr = InterruptibleRecv(pchRet3, 16, SOCKS5_RECV_TIMEOUT, hSocket); break;

+        case 0x03:

         {

             recvr = InterruptibleRecv(pchRet3, 1, SOCKS5_RECV_TIMEOUT, hSocket);

             if (recvr != IntrRecvError::OK) {

--- a/src/policy/feerate.cpp

+++ b/src/policy/feerate.cpp

@@ -7,7 +7,7 @@

 

 #include "tinyformat.h"

 

-const std::string CURRENCY_UNIT = "BTC";

+const std::string CURRENCY_UNIT = "LTC";

 

 CFeeRate::CFeeRate(const CAmount& nFeePaid, size_t nBytes_)

 {

--- a/src/policy/policy.h

+++ b/src/policy/policy.h

@@ -16,8 +16,10 @@

 class CCoinsViewCache;

 class CTxOut;

 

+/** Default for -blockmaxsize, which controls the maximum size of block the mining code will create **/

+static const unsigned int DEFAULT_BLOCK_MAX_SIZE = 750000;

 /** Default for -blockmaxweight, which controls the range of block weights the mining code will create **/

-static const unsigned int DEFAULT_BLOCK_MAX_WEIGHT = MAX_BLOCK_WEIGHT - 4000;

+static const unsigned int DEFAULT_BLOCK_MAX_WEIGHT = 3000000;

 /** Default for -blockmintxfee, which sets the minimum feerate for a transaction in blocks created by mining code **/

 static const unsigned int DEFAULT_BLOCK_MIN_TX_FEE = 1000;

 /** The maximum weight for transactions we're willing to relay/mine */

@@ -27,7 +29,7 @@ static const unsigned int MAX_P2SH_SIGOPS = 15;

 /** The maximum number of sigops we're willing to relay/mine in a single tx */

 static const unsigned int MAX_STANDARD_TX_SIGOPS_COST = MAX_BLOCK_SIGOPS_COST/5;

 /** Default for -maxmempool, maximum megabytes of mempool memory usage */

-static const unsigned int DEFAULT_MAX_MEMPOOL_SIZE = 300;

+static const unsigned int DEFAULT_MAX_MEMPOOL_SIZE = 5;

 /** Default for -incrementalrelayfee, which sets the minimum feerate increase for mempool limiting or BIP 125 replacement **/

 static const unsigned int DEFAULT_INCREMENTAL_RELAY_FEE = 1000;

 /** Default for -bytespersigop */

@@ -43,7 +45,7 @@ static const unsigned int MAX_STANDARD_P2WSH_SCRIPT_SIZE = 3600;

  * standard and should be done with care and ideally rarely. It makes sense to

  * only increase the dust limit after prior releases were already not creating

  * outputs below the new threshold */

-static const unsigned int DUST_RELAY_TX_FEE = 3000;

+static const unsigned int DUST_RELAY_TX_FEE = 300000;

 /**

  * Standard script verification flags that standard transactions will comply

  * with. However scripts violating these flags may still be present in valid

--- a/src/pow.cpp

+++ b/src/pow.cpp

@@ -9,6 +9,7 @@

 #include "chain.h"

 #include "primitives/block.h"

 #include "uint256.h"

+#include "util.h"

 

 unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHeader *pblock, const Consensus::Params& params)

 {

@@ -38,9 +39,17 @@ unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHead

     }

 

     // Go back by what we want to be 14 days worth of blocks

-    int nHeightFirst = pindexLast->nHeight - (params.DifficultyAdjustmentInterval()-1);

-    assert(nHeightFirst >= 0);

-    const CBlockIndex* pindexFirst = pindexLast->GetAncestor(nHeightFirst);

+    // Litecoin: This fixes an issue where a 51% attack can change difficulty at will.

+    // Go back the full period unless it's the first retarget after genesis. Code courtesy of Art Forz

+    int blockstogoback = params.DifficultyAdjustmentInterval()-1;

+    if ((pindexLast->nHeight+1) != params.DifficultyAdjustmentInterval())

+        blockstogoback = params.DifficultyAdjustmentInterval();

+

+    // Go back by what we want to be 14 days worth of blocks

+    const CBlockIndex* pindexFirst = pindexLast;

+    for (int i = 0; pindexFirst && i < blockstogoback; i++)

+        pindexFirst = pindexFirst->pprev;

+

     assert(pindexFirst);

 

     return CalculateNextWorkRequired(pindexLast, pindexFirst->GetBlockTime(), params);

@@ -59,11 +68,19 @@ unsigned int CalculateNextWorkRequired(const CBlockIndex* pindexLast, int64_t nF

         nActualTimespan = params.nPowTargetTimespan*4;

 

     // Retarget

-    const arith_uint256 bnPowLimit = UintToArith256(params.powLimit);

     arith_uint256 bnNew;

+    arith_uint256 bnOld;

     bnNew.SetCompact(pindexLast->nBits);

+    bnOld = bnNew;

+    // Litecoin: intermediate uint256 can overflow by 1 bit

+    const arith_uint256 bnPowLimit = UintToArith256(params.powLimit);

+    bool fShift = bnNew.bits() > bnPowLimit.bits() - 1;

+    if (fShift)

+        bnNew >>= 1;

     bnNew *= nActualTimespan;

     bnNew /= params.nPowTargetTimespan;

+    if (fShift)

+        bnNew <<= 1;

 

     if (bnNew > bnPowLimit)

         bnNew = bnPowLimit;

--- a/src/primitives/block.cpp

+++ b/src/primitives/block.cpp

@@ -9,12 +9,20 @@

 #include "tinyformat.h"

 #include "utilstrencodings.h"

 #include "crypto/common.h"

+#include "crypto/scrypt.h"

 

 uint256 CBlockHeader::GetHash() const

 {

     return SerializeHash(*this);

 }

 

+uint256 CBlockHeader::GetPoWHash() const

+{

+    uint256 thash;

+    scrypt_1024_1_1_256(BEGIN(nVersion), BEGIN(thash));

+    return thash;

+}

+

 std::string CBlock::ToString() const

 {

     std::stringstream s;

--- a/src/primitives/block.h

+++ b/src/primitives/block.h

@@ -62,6 +62,8 @@ public:

 

     uint256 GetHash() const;

 

+    uint256 GetPoWHash() const;

+

     int64_t GetBlockTime() const

     {

         return (int64_t)nTime;

--- a/src/rpc/blockchain.cpp

+++ b/src/rpc/blockchain.cpp

@@ -656,8 +656,8 @@ UniValue getblockheader(const JSONRPCRequest& request)

             "\nResult (for verbose=false):\n"

             "\"data\"             (string) A string that is serialized, hex-encoded data for block 'hash'.\n"

             "\nExamples:\n"

-            + HelpExampleCli("getblockheader", "\"00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09\"")

-            + HelpExampleRpc("getblockheader", "\"00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09\"")

+            + HelpExampleCli("getblockheader", "\"e2acdf2dd19a702e5d12a925f1e984b01e47a933562ca893656d4afb38b44ee3\"")

+            + HelpExampleRpc("getblockheader", "\"e2acdf2dd19a702e5d12a925f1e984b01e47a933562ca893656d4afb38b44ee3\"")

         );

 

     LOCK(cs_main);

@@ -731,8 +731,8 @@ UniValue getblock(const JSONRPCRequest& request)

             "  ,...                     Same output as verbosity = 1.\n"

             "}\n"

             "\nExamples:\n"

-            + HelpExampleCli("getblock", "\"00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09\"")

-            + HelpExampleRpc("getblock", "\"00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09\"")

+            + HelpExampleCli("getblock", "\"e2acdf2dd19a702e5d12a925f1e984b01e47a933562ca893656d4afb38b44ee3\"")

+            + HelpExampleRpc("getblock", "\"e2acdf2dd19a702e5d12a925f1e984b01e47a933562ca893656d4afb38b44ee3\"")

         );

 

     LOCK(cs_main);

@@ -944,10 +944,9 @@ UniValue gettxout(const JSONRPCRequest& request)

             "gettxout \"txid\" n ( include_mempool )\n"

             "\nReturns details about an unspent transaction output.\n"

             "\nArguments:\n"

-            "1. \"txid\"             (string, required) The transaction id\n"

-            "2. \"n\"                (numeric, required) vout number\n"

-            "3. \"include_mempool\"  (boolean, optional) Whether to include the mempool. Default: true."

-            "     Note that an unspent output that is spent in the mempool won't appear.\n"

+            "1. \"txid\"       (string, required) The transaction id\n"

+            "2. n              (numeric, required) vout number\n"

+            "3. include_mempool  (boolean, optional) Whether to include the mempool\n"

             "\nResult:\n"

             "{\n"

             "  \"bestblock\" : \"hash\",    (string) the block hash\n"

@@ -958,8 +957,8 @@ UniValue gettxout(const JSONRPCRequest& request)

             "     \"hex\" : \"hex\",        (string) \n"

             "     \"reqSigs\" : n,          (numeric) Number of required signatures\n"

             "     \"type\" : \"pubkeyhash\", (string) The type, eg pubkeyhash\n"

-            "     \"addresses\" : [          (array of string) array of bitcoin addresses\n"

-            "        \"address\"     (string) bitcoin address\n"

+            "     \"addresses\" : [          (array of string) array of litecoin addresses\n"

+            "        \"address\"     (string) litecoin address\n"

             "        ,...\n"

             "     ]\n"

             "  },\n"

--- a/src/rpc/client.cpp

+++ b/src/rpc/client.cpp

@@ -115,8 +115,8 @@ static const CRPCConvertParam vRPCConvertParams[] =

     { "keypoolrefill", 0, "newsize" },

     { "getrawmempool", 0, "verbose" },

     { "estimatefee", 0, "nblocks" },

-    { "estimatesmartfee", 0, "conf_target" },

-    { "estimaterawfee", 0, "conf_target" },

+    { "estimatesmartfee", 0, "nblocks" },

+    { "estimaterawfee", 0, "nblocks" },

     { "estimaterawfee", 1, "threshold" },

     { "prioritisetransaction", 1, "dummy" },

     { "prioritisetransaction", 2, "fee_delta" },

--- a/src/rpc/mining.cpp

+++ b/src/rpc/mining.cpp

@@ -128,7 +128,7 @@ UniValue generateBlocks(std::shared_ptr<CReserveScript> coinbaseScript, int nGen

             LOCK(cs_main);

             IncrementExtraNonce(pblock, chainActive.Tip(), nExtraNonce);

         }

-        while (nMaxTries > 0 && pblock->nNonce < nInnerLoopCount && !CheckProofOfWork(pblock->GetHash(), pblock->nBits, Params().GetConsensus())) {

+        while (nMaxTries > 0 && pblock->nNonce < nInnerLoopCount && !CheckProofOfWork(pblock->GetPoWHash(), pblock->nBits, Params().GetConsensus())) {

             ++pblock->nNonce;

             --nMaxTries;

         }

@@ -161,7 +161,7 @@ UniValue generatetoaddress(const JSONRPCRequest& request)

             "\nMine blocks immediately to a specified address (before the RPC call returns)\n"

             "\nArguments:\n"

             "1. nblocks      (numeric, required) How many blocks are generated immediately.\n"

-            "2. address      (string, required) The address to send the newly generated bitcoin to.\n"

+            "2. address      (string, required) The address to send the newly generated litecoin to.\n"

             "3. maxtries     (numeric, optional) How many iterations to try (default = 1000000).\n"

             "\nResult:\n"

             "[ blockhashes ]     (array) hashes of blocks generated\n"

@@ -195,6 +195,7 @@ UniValue getmininginfo(const JSONRPCRequest& request)

             "\nResult:\n"

             "{\n"

             "  \"blocks\": nnn,             (numeric) The current block\n"

+            "  \"currentblocksize\": nnn,   (numeric) The last block size\n"

             "  \"currentblockweight\": nnn, (numeric) The last block weight\n"

             "  \"currentblocktx\": nnn,     (numeric) The last block transaction\n"

             "  \"difficulty\": xxx.xxxxx    (numeric) The current difficulty\n"

@@ -213,6 +214,7 @@ UniValue getmininginfo(const JSONRPCRequest& request)

 

     UniValue obj(UniValue::VOBJ);

     obj.push_back(Pair("blocks",           (int)chainActive.Height()));

+    obj.push_back(Pair("currentblocksize", (uint64_t)nLastBlockSize));

     obj.push_back(Pair("currentblockweight", (uint64_t)nLastBlockWeight));

     obj.push_back(Pair("currentblocktx",   (uint64_t)nLastBlockTx));

     obj.push_back(Pair("difficulty",       (double)GetDifficulty()));

@@ -438,10 +440,10 @@ UniValue getblocktemplate(const JSONRPCRequest& request)

         throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Peer-to-peer functionality missing or disabled");

 

     if (g_connman->GetNodeCount(CConnman::CONNECTIONS_ALL) == 0)

-        throw JSONRPCError(RPC_CLIENT_NOT_CONNECTED, "Bitcoin is not connected!");

+        throw JSONRPCError(RPC_CLIENT_NOT_CONNECTED, "Litecoin is not connected!");

 

     if (IsInitialBlockDownload())

-        throw JSONRPCError(RPC_CLIENT_IN_INITIAL_DOWNLOAD, "Bitcoin is downloading blocks...");

+        throw JSONRPCError(RPC_CLIENT_IN_INITIAL_DOWNLOAD, "Litecoin is downloading blocks...");

 

     static unsigned int nTransactionsUpdatedLast;

 

@@ -823,7 +825,7 @@ UniValue estimatesmartfee(const JSONRPCRequest& request)

             "       \"CONSERVATIVE\"\n"

             "\nResult:\n"

             "{\n"

-            "  \"feerate\" : x.x,     (numeric, optional) estimate fee-per-kilobyte (in BTC)\n"

+            "  \"feerate\" : x.x,     (numeric, optional) estimate fee-per-kilobyte (in LTC)\n"

             "  \"errors\": [ str... ] (json array of strings, optional) Errors encountered during processing\n"

             "  \"blocks\" : n         (numeric) block number where estimate was found\n"

             "}\n"

--- a/src/rpc/misc.cpp

+++ b/src/rpc/misc.cpp

@@ -56,7 +56,7 @@ UniValue getinfo(const JSONRPCRequest& request)

             "  \"version\": xxxxx,           (numeric) the server version\n"

             "  \"protocolversion\": xxxxx,   (numeric) the protocol version\n"

             "  \"walletversion\": xxxxx,     (numeric) the wallet version\n"

-            "  \"balance\": xxxxxxx,         (numeric) the total bitcoin balance of the wallet\n"

+            "  \"balance\": xxxxxxx,         (numeric) the total litecoin balance of the wallet\n"

             "  \"blocks\": xxxxxx,           (numeric) the current number of blocks processed in the server\n"

             "  \"timeoffset\": xxxxx,        (numeric) the time offset\n"

             "  \"connections\": xxxxx,       (numeric) the number of connections\n"

@@ -168,13 +168,13 @@ UniValue validateaddress(const JSONRPCRequest& request)

     if (request.fHelp || request.params.size() != 1)

         throw std::runtime_error(

             "validateaddress \"address\"\n"

-            "\nReturn information about the given bitcoin address.\n"

+            "\nReturn information about the given litecoin address.\n"

             "\nArguments:\n"

-            "1. \"address\"     (string, required) The bitcoin address to validate\n"

+            "1. \"address\"     (string, required) The litecoin address to validate\n"

             "\nResult:\n"

             "{\n"

             "  \"isvalid\" : true|false,       (boolean) If the address is valid or not. If not, this is the only property returned.\n"

-            "  \"address\" : \"address\", (string) The bitcoin address validated\n"

+            "  \"address\" : \"address\", (string) The litecoin address validated\n"

             "  \"scriptPubKey\" : \"hex\",       (string) The hex encoded scriptPubKey generated by the address\n"

             "  \"ismine\" : true|false,        (boolean) If the address is yours or not\n"

             "  \"iswatchonly\" : true|false,   (boolean) If the address is watchonly\n"

@@ -195,8 +195,8 @@ UniValue validateaddress(const JSONRPCRequest& request)

             "  \"hdmasterkeyid\" : \"<hash160>\" (string, optional) The Hash160 of the HD master pubkey\n"

             "}\n"

             "\nExamples:\n"

-            + HelpExampleCli("validateaddress", "\"1PSSGeFHDnKNxiEyFrD1wcEaHr9hrQDDWc\"")

-            + HelpExampleRpc("validateaddress", "\"1PSSGeFHDnKNxiEyFrD1wcEaHr9hrQDDWc\"")

+            + HelpExampleCli("validateaddress", "\"LER4HnAEFwYHbmGxCfP2po1nPrUeiK8KM2\"")

+            + HelpExampleRpc("validateaddress", "\"LER4HnAEFwYHbmGxCfP2po1nPrUeiK8KM2\"")

         );

 

 #ifdef ENABLE_WALLET

@@ -333,9 +333,9 @@ UniValue createmultisig(const JSONRPCRequest& request)

 

             "\nArguments:\n"

             "1. nrequired      (numeric, required) The number of required signatures out of the n keys or addresses.\n"

-            "2. \"keys\"       (string, required) A json array of keys which are bitcoin addresses or hex-encoded public keys\n"

+            "2. \"keys\"       (string, required) A json array of keys which are litecoin addresses or hex-encoded public keys\n"

             "     [\n"

-            "       \"key\"    (string) bitcoin address or hex-encoded public key\n"

+            "       \"key\"    (string) litecoin address or hex-encoded public key\n"

             "       ,...\n"

             "     ]\n"

 

@@ -347,9 +347,9 @@ UniValue createmultisig(const JSONRPCRequest& request)

 

             "\nExamples:\n"

             "\nCreate a multisig address from 2 addresses\n"

-            + HelpExampleCli("createmultisig", "2 \"[\\\"16sSauSf5pF2UkUwvKGq4qjNRzBZYqgEL5\\\",\\\"171sgjn4YtPu27adkKGrdDwzRTxnRkBfKV\\\"]\"") +

+            + HelpExampleCli("createmultisig", "2 \"[\\\"LEr4hnAefwYhBmGxcFP2Po1NPrUEIk8KM2\\\",\\\"LYKr1oaPSqShthukmLDhdZsqUJgzVnQiAQ\\\"]\"") +

             "\nAs a json rpc call\n"

-            + HelpExampleRpc("createmultisig", "2, \"[\\\"16sSauSf5pF2UkUwvKGq4qjNRzBZYqgEL5\\\",\\\"171sgjn4YtPu27adkKGrdDwzRTxnRkBfKV\\\"]\"")

+            + HelpExampleRpc("createmultisig", "2, \"[\\\"LEr4hnAefwYhBmGxcFP2Po1NPrUEIk8KM2\\\",\\\"LYKr1oaPSqShthukmLDhdZsqUJgzVnQiAQ\\\"]\"")

         ;

         throw std::runtime_error(msg);

     }

@@ -373,7 +373,7 @@ UniValue verifymessage(const JSONRPCRequest& request)

             "verifymessage \"address\" \"signature\" \"message\"\n"

             "\nVerify a signed message\n"

             "\nArguments:\n"

-            "1. \"address\"         (string, required) The bitcoin address to use for the signature.\n"

+            "1. \"address\"         (string, required) The litecoin address to use for the signature.\n"

             "2. \"signature\"       (string, required) The signature provided by the signer in base 64 encoding (see signmessage).\n"

             "3. \"message\"         (string, required) The message that was signed.\n"

             "\nResult:\n"

@@ -382,11 +382,11 @@ UniValue verifymessage(const JSONRPCRequest& request)


              "\nUnlock the wallet for 30 seconds\n"

             + HelpExampleCli("walletpassphrase", "\"mypassphrase\" 30") +

             "\nCreate the signature\n"

-            + HelpExampleCli("signmessage", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XX\" \"my message\"") +

+            + HelpExampleCli("signmessage", "\"LEr4hNAefWYhBMgxCFP2Po1NPrUeiK8kM2\" \"my message\"") +

             "\nVerify the signature\n"

-            + HelpExampleCli("verifymessage", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XX\" \"signature\" \"my message\"") +

+            + HelpExampleCli("verifymessage", "\"LEr4hNAefWYhBMgxCFP2Po1NPrUeiK8kM2\" \"signature\" \"my message\"") +

             "\nAs json rpc\n"

-            + HelpExampleRpc("verifymessage", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XX\", \"signature\", \"my message\"")

+            + HelpExampleRpc("verifymessage", "\"LEr4hNAefWYhBMgxCFP2Po1NPrUeiK8kM2\", \"signature\", \"my message\"")

         );

 

     LOCK(cs_main);

@@ -435,7 +435,7 @@ UniValue signmessagewithprivkey(const JSONRPCRequest& request)

             "\nCreate the signature\n"

             + HelpExampleCli("signmessagewithprivkey", "\"privkey\" \"my message\"") +

             "\nVerify the signature\n"

-            + HelpExampleCli("verifymessage", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XX\" \"signature\" \"my message\"") +

+            + HelpExampleCli("verifymessage", "\"LEr4hNAefWYhBMgxCFP2Po1NPrUeiK8kM2\" \"signature\" \"my message\"") +

             "\nAs json rpc\n"

             + HelpExampleRpc("signmessagewithprivkey", "\"privkey\", \"my message\"")

         );

@@ -642,7 +642,7 @@ UniValue echo(const JSONRPCRequest& request)

             "echo|echojson \"message\" ...\n"

             "\nSimply echo back the input arguments. This command is for testing.\n"

             "\nThe difference between echo and echojson is that echojson has argument conversion enabled in the client-side table in"

-            "bitcoin-cli and the GUI. There is no server-side difference."

+            "litecoin-cli and the GUI. There is no server-side difference."

         );

 

     return request.params;

--- a/src/rpc/net.cpp

+++ b/src/rpc/net.cpp

@@ -156,7 +156,7 @@ UniValue getpeerinfo(const JSONRPCRequest& request)

         // their ver message.

         obj.push_back(Pair("subver", stats.cleanSubVer));

         obj.push_back(Pair("inbound", stats.fInbound));

-        obj.push_back(Pair("addnode", stats.m_manual_connection));

+        obj.push_back(Pair("addnode", stats.fAddnode));

         obj.push_back(Pair("startingheight", stats.nStartingHeight));

         if (fStateStats) {

             obj.push_back(Pair("banscore", statestats.nMisbehavior));

@@ -205,8 +205,8 @@ UniValue addnode(const JSONRPCRequest& request)

             "1. \"node\"     (string, required) The node (see getpeerinfo for nodes)\n"

             "2. \"command\"  (string, required) 'add' to add a node to the list, 'remove' to remove a node from the list, 'onetry' to try a connection to the node once\n"

             "\nExamples:\n"

-            + HelpExampleCli("addnode", "\"192.168.0.6:8333\" \"onetry\"")

-            + HelpExampleRpc("addnode", "\"192.168.0.6:8333\", \"onetry\"")

+            + HelpExampleCli("addnode", "\"192.168.0.6:9333\" \"onetry\"")

+            + HelpExampleRpc("addnode", "\"192.168.0.6:9333\", \"onetry\"")

         );

 

     if(!g_connman)

@@ -294,7 +294,7 @@ UniValue getaddednodeinfo(const JSONRPCRequest& request)

             "    \"connected\" : true|false,          (boolean) If connected\n"

             "    \"addresses\" : [                    (list of objects) Only when connected = true\n"

             "       {\n"

-            "         \"address\" : \"192.168.0.201:8333\",  (string) The bitcoin server IP and port we're connected to\n"

+            "         \"address\" : \"192.168.0.201:9333\",  (string) The litecoin server IP and port we're connected to\n"

             "         \"connected\" : \"outbound\"           (string) connection, inbound or outbound\n"

             "       }\n"

             "     ]\n"

--- a/src/rpc/protocol.cpp

+++ b/src/rpc/protocol.cpp

@@ -66,14 +66,9 @@ static const std::string COOKIEAUTH_USER = "__cookie__";

 /** Default name for auth cookie file */

 static const std::string COOKIEAUTH_FILE = ".cookie";

 

-/** Get name of RPC authentication cookie file */

-static fs::path GetAuthCookieFile(bool temp=false)

+fs::path GetAuthCookieFile()

 {

-    std::string arg = gArgs.GetArg("-rpccookiefile", COOKIEAUTH_FILE);

-    if (temp) {

-        arg += ".tmp";

-    }

-    fs::path path(arg);

+    fs::path path(gArgs.GetArg("-rpccookiefile", COOKIEAUTH_FILE));

     if (!path.is_complete()) path = GetDataDir() / path;

     return path;

 }

@@ -89,20 +84,14 @@ bool GenerateAuthCookie(std::string *cookie_out)

      * these are set to 077 in init.cpp unless overridden with -sysperms.

      */

     std::ofstream file;

-    fs::path filepath_tmp = GetAuthCookieFile(true);

-    file.open(filepath_tmp.string().c_str());

+    fs::path filepath = GetAuthCookieFile();

+    file.open(filepath.string().c_str());

     if (!file.is_open()) {

-        LogPrintf("Unable to open cookie authentication file %s for writing\n", filepath_tmp.string());

+        LogPrintf("Unable to open cookie authentication file %s for writing\n", filepath.string());

         return false;

     }

     file << cookie;

     file.close();

-

-    fs::path filepath = GetAuthCookieFile(false);

-    if (!RenameOver(filepath_tmp, filepath)) {

-        LogPrintf("Unable to rename cookie authentication file %s to %s\n", filepath_tmp.string(), filepath.string());

-        return false;

-    }

     LogPrintf("Generated RPC authentication cookie %s\n", filepath.string());

 

     if (cookie_out)

--- a/src/rpc/protocol.h

+++ b/src/rpc/protocol.h

@@ -91,6 +91,8 @@ UniValue JSONRPCReplyObj(const UniValue& result, const UniValue& error, const Un

 std::string JSONRPCReply(const UniValue& result, const UniValue& error, const UniValue& id);

 UniValue JSONRPCError(int code, const std::string& message);

 

+/** Get name of RPC authentication cookie file */

+fs::path GetAuthCookieFile();

 /** Generate a new RPC authentication cookie and write it to disk */

 bool GenerateAuthCookie(std::string *cookie_out);

 /** Read the RPC authentication cookie from disk */

--- a/src/rpc/rawtransaction.cpp

+++ b/src/rpc/rawtransaction.cpp

@@ -112,7 +112,7 @@ UniValue getrawtransaction(const JSONRPCRequest& request)

             "         \"reqSigs\" : n,            (numeric) The required sigs\n"

             "         \"type\" : \"pubkeyhash\",  (string) The type, eg 'pubkeyhash'\n"

             "         \"addresses\" : [           (json array of string)\n"

-            "           \"address\"        (string) bitcoin address\n"

+            "           \"address\"        (string) litecoin address\n"

             "           ,...\n"

             "         ]\n"

             "       }\n"

@@ -310,7 +310,7 @@ UniValue createrawtransaction(const JSONRPCRequest& request)

             "     ]\n"

             "2. \"outputs\"               (object, required) a json object with outputs\n"

             "    {\n"

-            "      \"address\": x.xxx,    (numeric or string, required) The key is the bitcoin address, the numeric value (can be string) is the " + CURRENCY_UNIT + " amount\n"

+            "      \"address\": x.xxx,    (numeric or string, required) The key is the litecoin address, the numeric value (can be string) is the " + CURRENCY_UNIT + " amount\n"

             "      \"data\": \"hex\"      (string, required) The key is \"data\", the value is hex encoded data\n"

             "      ,...\n"

             "    }\n"

@@ -395,7 +395,7 @@ UniValue createrawtransaction(const JSONRPCRequest& request)

         } else {

             CBitcoinAddress address(name_);

             if (!address.IsValid())

-                throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, std::string("Invalid Bitcoin address: ")+name_);

+                throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, std::string("Invalid Litecoin address: ")+name_);

 

             if (setAddress.count(address))

                 throw JSONRPCError(RPC_INVALID_PARAMETER, std::string("Invalid parameter, duplicated address: ")+name_);

@@ -457,7 +457,7 @@ UniValue decoderawtransaction(const JSONRPCRequest& request)

             "         \"reqSigs\" : n,            (numeric) The required sigs\n"

             "         \"type\" : \"pubkeyhash\",  (string) The type, eg 'pubkeyhash'\n"

             "         \"addresses\" : [           (json array of string)\n"

-            "           \"12tvKAXCxZjSmdNbao16dKXC8tRWfcF5oc\"   (string) bitcoin address\n"

+            "           \"12tvKAXCxZjSmdNbao16dKXC8tRWfcF5oc\"   (string) litecoin address\n"

             "           ,...\n"

             "         ]\n"

             "       }\n"

@@ -500,7 +500,7 @@ UniValue decodescript(const JSONRPCRequest& request)

             "  \"type\":\"type\", (string) The output type\n"

             "  \"reqSigs\": n,    (numeric) The required signatures\n"

             "  \"addresses\": [   (json array of string)\n"

-            "     \"address\"     (string) bitcoin address\n"

+            "     \"address\"     (string) litecoin address\n"

             "     ,...\n"

             "  ],\n"

             "  \"p2sh\",\"address\" (string) address of P2SH script wrapping this redeem script (not returned if the script is already a P2SH).\n"

--- a/src/rpc/server.cpp

+++ b/src/rpc/server.cpp

@@ -240,11 +240,11 @@ UniValue stop(const JSONRPCRequest& jsonRequest)

     if (jsonRequest.fHelp || jsonRequest.params.size() > 1)

         throw std::runtime_error(

             "stop\n"

-            "\nStop Bitcoin server.");

+            "\nStop Litecoin server.");

     // Event loop will exit after current HTTP requests have been handled, so

     // this reply will get back to the client.

     StartShutdown();

-    return "Bitcoin server stopping";

+    return "Litecoin server stopping";

 }

 

 UniValue uptime(const JSONRPCRequest& jsonRequest)

@@ -387,10 +387,11 @@ void JSONRPCRequest::parse(const UniValue& valRequest)

         throw JSONRPCError(RPC_INVALID_REQUEST, "Params must be an array or object");

 }

 

-static UniValue JSONRPCExecOne(JSONRPCRequest jreq, const UniValue& req)

+static UniValue JSONRPCExecOne(const UniValue& req)

 {

     UniValue rpc_result(UniValue::VOBJ);

 

+    JSONRPCRequest jreq;

     try {

         jreq.parse(req);

 

@@ -410,11 +411,11 @@ static UniValue JSONRPCExecOne(JSONRPCRequest jreq, const UniValue& req)

     return rpc_result;

 }

 

-std::string JSONRPCExecBatch(const JSONRPCRequest& jreq, const UniValue& vReq)

+std::string JSONRPCExecBatch(const UniValue& vReq)

 {

     UniValue ret(UniValue::VARR);

     for (unsigned int reqIdx = 0; reqIdx < vReq.size(); reqIdx++)

-        ret.push_back(JSONRPCExecOne(jreq, vReq[reqIdx]));

+        ret.push_back(JSONRPCExecOne(vReq[reqIdx]));

 

     return ret.write() + "\n";

 }

@@ -513,13 +514,13 @@ std::vector<std::string> CRPCTable::listCommands() const

 

 std::string HelpExampleCli(const std::string& methodname, const std::string& args)

 {

-    return "> bitcoin-cli " + methodname + " " + args + "\n";

+    return "> litecoin-cli " + methodname + " " + args + "\n";

 }

 

 std::string HelpExampleRpc(const std::string& methodname, const std::string& args)

 {

     return "> curl --user myusername --data-binary '{\"jsonrpc\": \"1.0\", \"id\":\"curltest\", "

-        "\"method\": \"" + methodname + "\", \"params\": [" + args + "] }' -H 'content-type: text/plain;' http://127.0.0.1:8332/\n";

+        "\"method\": \"" + methodname + "\", \"params\": [" + args + "] }' -H 'content-type: text/plain;' http://127.0.0.1:9332/\n";

 }

 

 void RPCSetTimerInterfaceIfUnset(RPCTimerInterface *iface)

--- a/src/rpc/server.h

+++ b/src/rpc/server.h

@@ -191,7 +191,7 @@ extern std::string HelpExampleRpc(const std::string& methodname, const std::stri

 bool StartRPC();

 void InterruptRPC();

 void StopRPC();

-std::string JSONRPCExecBatch(const JSONRPCRequest& jreq, const UniValue& vReq);

+std::string JSONRPCExecBatch(const UniValue& vReq);

 

 // Retrieves any serialization flags requested in command line argument

 int RPCSerializationFlags();

--- a/src/script/ismine.cpp

+++ b/src/script/ismine.cpp

@@ -46,8 +46,6 @@ isminetype IsMine(const CKeyStore &keystore, const CTxDestination& dest, bool& i

 

 isminetype IsMine(const CKeyStore &keystore, const CScript& scriptPubKey, bool& isInvalid, SigVersion sigversion)

 {

-    isInvalid = false;

-

     std::vector<valtype> vSolutions;

     txnouttype whichType;

     if (!Solver(scriptPubKey, whichType, vSolutions)) {

--- a/src/timedata.h

+++ b/src/timedata.h

@@ -10,7 +10,7 @@

 #include <stdint.h>

 #include <vector>

 

-static const int64_t DEFAULT_MAX_TIME_ADJUSTMENT = 70 * 60;

+static const int64_t DEFAULT_MAX_TIME_ADJUSTMENT = 35 * 60;

 

 class CNetAddr;

 

--- a/src/txdb.cpp

+++ b/src/txdb.cpp

@@ -287,8 +287,14 @@ bool CBlockTreeDB::LoadBlockIndexGuts(const Consensus::Params& consensusParams,

                 pindexNew->nStatus        = diskindex.nStatus;

                 pindexNew->nTx            = diskindex.nTx;

 

-                if (!CheckProofOfWork(pindexNew->GetBlockHash(), pindexNew->nBits, consensusParams))

-                    return error("%s: CheckProofOfWork failed: %s", __func__, pindexNew->ToString());

+                // Litecoin: Disable PoW Sanity check while loading block index from disk.

+                // We use the sha256 hash for the block index for performance reasons, which is recorded for later use.

+                // CheckProofOfWork() uses the scrypt hash which is discarded after a block is accepted.

+                // While it is technically feasible to verify the PoW, doing so takes several minutes as it

+                // requires recomputing every PoW hash during every Litecoin startup.

+                // We opt instead to simply trust the data that is on your local disk.

+                //if (!CheckProofOfWork(pindexNew->GetBlockHash(), pindexNew->nBits, consensusParams))

+                //    return error("%s: CheckProofOfWork failed: %s", __func__, pindexNew->ToString());

 

                 pcursor->Next();

             } else {

--- a/src/txmempool.h

+++ b/src/txmempool.h

@@ -207,7 +207,7 @@ struct mempoolentry_txid

 class CompareTxMemPoolEntryByDescendantScore

 {

 public:

-    bool operator()(const CTxMemPoolEntry& a, const CTxMemPoolEntry& b) const

+    bool operator()(const CTxMemPoolEntry& a, const CTxMemPoolEntry& b)

     {

         bool fUseADescendants = UseDescendantScore(a);

         bool fUseBDescendants = UseDescendantScore(b);

@@ -229,7 +229,7 @@ public:

     }

 

     // Calculate which score to use for an entry (avoiding division).

-    bool UseDescendantScore(const CTxMemPoolEntry &a) const

+    bool UseDescendantScore(const CTxMemPoolEntry &a)

     {

         double f1 = (double)a.GetModifiedFee() * a.GetSizeWithDescendants();

         double f2 = (double)a.GetModFeesWithDescendants() * a.GetTxSize();

@@ -244,7 +244,7 @@ public:

 class CompareTxMemPoolEntryByScore

 {

 public:

-    bool operator()(const CTxMemPoolEntry& a, const CTxMemPoolEntry& b) const

+    bool operator()(const CTxMemPoolEntry& a, const CTxMemPoolEntry& b)

     {

         double f1 = (double)a.GetModifiedFee() * b.GetTxSize();

         double f2 = (double)b.GetModifiedFee() * a.GetTxSize();

@@ -258,7 +258,7 @@ public:

 class CompareTxMemPoolEntryByEntryTime

 {

 public:

-    bool operator()(const CTxMemPoolEntry& a, const CTxMemPoolEntry& b) const

+    bool operator()(const CTxMemPoolEntry& a, const CTxMemPoolEntry& b)

     {

         return a.GetTime() < b.GetTime();

     }

@@ -267,7 +267,7 @@ public:

 class CompareTxMemPoolEntryByAncestorFee

 {

 public:

-    bool operator()(const CTxMemPoolEntry& a, const CTxMemPoolEntry& b) const

+    bool operator()(const CTxMemPoolEntry& a, const CTxMemPoolEntry& b)

     {

         double aFees = a.GetModFeesWithAncestors();

         double aSize = a.GetSizeWithAncestors();

--- a/src/util.cpp

+++ b/src/util.cpp

@@ -87,8 +87,8 @@

 // Application startup time (used for uptime calculation)

 const int64_t nStartupTime = GetTime();

 

-const char * const BITCOIN_CONF_FILENAME = "bitcoin.conf";

-const char * const BITCOIN_PID_FILENAME = "bitcoind.pid";

+const char * const BITCOIN_CONF_FILENAME = "litecoin.conf";

+const char * const BITCOIN_PID_FILENAME = "litecoin.pid";

 

 ArgsManager gArgs;

 bool fPrintToConsole = false;

@@ -505,7 +505,7 @@ static std::string FormatException(const std::exception* pex, const char* pszThr

     char pszModule[MAX_PATH] = "";

     GetModuleFileNameA(nullptr, pszModule, sizeof(pszModule));

 #else

-    const char* pszModule = "bitcoin";

+    const char* pszModule = "litecoin";

 #endif

     if (pex)

         return strprintf(

@@ -530,7 +530,7 @@ fs::path GetDefaultDataDir()

     // Unix: ~/.bitcoin

 #ifdef WIN32

     // Windows

-    return GetSpecialFolderPath(CSIDL_APPDATA) / "Bitcoin";

+    return GetSpecialFolderPath(CSIDL_APPDATA) / "Litecoin";

 #else

     fs::path pathRet;

     char* pszHome = getenv("HOME");

@@ -540,10 +540,10 @@ fs::path GetDefaultDataDir()

         pathRet = fs::path(pszHome);

 #ifdef MAC_OSX

     // Mac

-    return pathRet / "Library/Application Support/Bitcoin";

+    return pathRet / "Library/Application Support/Litecoin";

 #else

     // Unix

-    return pathRet / ".bitcoin";

+    return pathRet / ".litecoin";

 #endif

 #endif

 }

@@ -889,7 +889,9 @@ std::string CopyrightHolders(const std::string& strPrefix)

 

     // Check for untranslated substitution to make sure Bitcoin Core copyright is not removed by accident

     if (strprintf(COPYRIGHT_HOLDERS, COPYRIGHT_HOLDERS_SUBSTITUTION).find("Bitcoin Core") == std::string::npos) {

-        strCopyrightHolders += "\n" + strPrefix + "The Bitcoin Core developers";

+        std::string strYear = strPrefix;

+        strYear.replace(strYear.find("2011"), sizeof("2011")-1, "2009");

+        strCopyrightHolders += "\n" + strYear + "The Bitcoin Core developers";

     }

     return strCopyrightHolders;

 }

--- a/src/utilstrencodings.cpp

+++ b/src/utilstrencodings.cpp

@@ -65,19 +65,6 @@ bool IsHex(const std::string& str)

     return (str.size() > 0) && (str.size()%2 == 0);

 }

 

-bool IsHexNumber(const std::string& str)

-{

-    size_t starting_location = 0;

-    if (str.size() > 2 && *str.begin() == '0' && *(str.begin()+1) == 'x') {

-        starting_location = 2;

-    }

-    for (auto c : str.substr(starting_location)) {

-        if (HexDigit(c) < 0) return false;

-    }

-    // Return false for empty string or "0x".

-    return (str.size() > starting_location);

-}

-

 std::vector<unsigned char> ParseHex(const char* psz)

 {

     // convert hex dump to vector

--- a/src/utilstrencodings.h

+++ b/src/utilstrencodings.h

@@ -38,13 +38,7 @@ std::string SanitizeString(const std::string& str, int rule = SAFE_CHARS_DEFAULT

 std::vector<unsigned char> ParseHex(const char* psz);

 std::vector<unsigned char> ParseHex(const std::string& str);

 signed char HexDigit(char c);

-/* Returns true if each character in str is a hex character, and has an even

- * number of hex digits.*/

 bool IsHex(const std::string& str);

-/**

-* Return true if the string is a hex number, optionally prefixed with "0x"

-*/

-bool IsHexNumber(const std::string& str);

 std::vector<unsigned char> DecodeBase64(const char* p, bool* pfInvalid = nullptr);

 std::string DecodeBase64(const std::string& str);

 std::string EncodeBase64(const unsigned char* pch, size_t len);

--- a/src/validation.cpp

+++ b/src/validation.cpp

@@ -50,7 +50,7 @@

 #include <boost/thread.hpp>

 

 #if defined(NDEBUG)

-# error "Bitcoin cannot be compiled without assertions."

+# error "Litecoin cannot be compiled without assertions."

 #endif

 

 /**

@@ -80,7 +80,6 @@ int64_t nMaxTipAge = DEFAULT_MAX_TIP_AGE;

 bool fEnableReplacement = DEFAULT_ENABLE_REPLACEMENT;

 

 uint256 hashAssumeValid;

-arith_uint256 nMinimumChainWork;

 

 CFeeRate minRelayTxFee = CFeeRate(DEFAULT_MIN_RELAY_TX_FEE);

 CAmount maxTxFee = DEFAULT_TRANSACTION_MAXFEE;

@@ -93,7 +92,7 @@ static void CheckBlockIndex(const Consensus::Params& consensusParams);

 /** Constant stuff for coinbase transactions we create: */

 CScript COINBASE_FLAGS;

 

-const std::string strMessageMagic = "Bitcoin Signed Message:\n";

+const std::string strMessageMagic = "Litecoin Signed Message:\n";

 

 // Internal stuff

 namespace {

@@ -153,26 +152,6 @@ namespace {

     /** chainwork for the last block that preciousblock has been applied to. */

     arith_uint256 nLastPreciousChainwork = 0;

 

-    /** In order to efficiently track invalidity of headers, we keep the set of

-      * blocks which we tried to connect and found to be invalid here (ie which

-      * were set to BLOCK_FAILED_VALID since the last restart). We can then

-      * walk this set and check if a new header is a descendant of something in

-      * this set, preventing us from having to walk mapBlockIndex when we try

-      * to connect a bad block and fail.

-      *

-      * While this is more complicated than marking everything which descends

-      * from an invalid block as invalid at the time we discover it to be

-      * invalid, doing so would require walking all of mapBlockIndex to find all

-      * descendants. Since this case should be very rare, keeping track of all

-      * BLOCK_FAILED_VALID blocks in a set should be just fine and work just as

-      * well.

-      *

-      * Because we alreardy walk mapBlockIndex in height-order at startup, we go

-      * ahead and mark descendants of invalid blocks as FAILED_CHILD at that time,

-      * instead of putting things in this set.

-      */

-    std::set<CBlockIndex*> g_failed_blocks;

-

     /** Dirty block index entries. */

     std::set<CBlockIndex*> setDirtyBlockIndex;

 

@@ -860,7 +839,7 @@ static bool AcceptToMemoryPoolWorker(const CChainParams& chainparams, CTxMemPool

         // Remove conflicting transactions from the mempool

         for (const CTxMemPool::txiter it : allConflicting)

         {

-            LogPrint(BCLog::MEMPOOL, "replacing tx %s with %s for %s BTC additional fees, %d delta bytes\n",

+            LogPrint(BCLog::MEMPOOL, "replacing tx %s with %s for %s LTC additional fees, %d delta bytes\n",

                     it->GetTx().GetHash().ToString(),

                     hash.ToString(),

                     FormatMoney(nModifiedFees - nConflictingFees),

@@ -1022,7 +1001,7 @@ bool ReadBlockFromDisk(CBlock& block, const CDiskBlockPos& pos, const Consensus:

     }

 

     // Check the header

-    if (!CheckProofOfWork(block.GetHash(), block.nBits, consensusParams))

+    if (!CheckProofOfWork(block.GetPoWHash(), block.nBits, consensusParams))

         return error("ReadBlockFromDisk: Errors in block header at %s", pos.ToString());

 

     return true;

@@ -1053,6 +1032,8 @@ CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams)

 

 bool IsInitialBlockDownload()

 {

+    const CChainParams& chainParams = Params();

+

     // Once this function has returned false, it must remain false.

     static std::atomic<bool> latchToFalse{false};

     // Optimization: pre-test latch before taking the lock.

@@ -1066,7 +1047,7 @@ bool IsInitialBlockDownload()

         return true;

     if (chainActive.Tip() == nullptr)

         return true;

-    if (chainActive.Tip()->nChainWork < nMinimumChainWork)

+    if (chainActive.Tip()->nChainWork < UintToArith256(chainParams.GetConsensus().nMinimumChainWork))

         return true;

     if (chainActive.Tip()->GetBlockTime() < (GetTime() - nMaxTipAge))

         return true;

@@ -1188,7 +1169,6 @@ void static InvalidChainFound(CBlockIndex* pindexNew)

 void static InvalidBlockFound(CBlockIndex *pindex, const CValidationState &state) {

     if (!state.CorruptionPossible()) {

         pindex->nStatus |= BLOCK_FAILED_VALID;

-        g_failed_blocks.insert(pindex);

         setDirtyBlockIndex.insert(pindex);

         setBlockIndexCandidates.erase(pindex);

         InvalidChainFound(pindex);

@@ -1604,8 +1584,8 @@ static ThresholdConditionCache warningcache[VERSIONBITS_NUM_BITS];

 static unsigned int GetBlockScriptFlags(const CBlockIndex* pindex, const Consensus::Params& consensusparams) {

     AssertLockHeld(cs_main);

 

-    // BIP16 didn't become active until Apr 1 2012

-    int64_t nBIP16SwitchTime = 1333238400;

+    // BIP16 didn't become active until Oct 1 2012

+    int64_t nBIP16SwitchTime = 1349049600;

     bool fStrictPayToScriptHash = (pindex->GetBlockTime() >= nBIP16SwitchTime);

 

     unsigned int flags = fStrictPayToScriptHash ? SCRIPT_VERIFY_P2SH : SCRIPT_VERIFY_NONE;

@@ -1684,7 +1664,7 @@ static bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockInd

         if (it != mapBlockIndex.end()) {

             if (it->second->GetAncestor(pindex->nHeight) == pindex &&

                 pindexBestHeader->GetAncestor(pindex->nHeight) == pindex &&

-                pindexBestHeader->nChainWork >= nMinimumChainWork) {

+                pindexBestHeader->nChainWork >= UintToArith256(chainparams.GetConsensus().nMinimumChainWork)) {

                 // This block is a member of the assumed verified chain and an ancestor of the best header.

                 // The equivalent time check discourages hash power from extorting the network via DOS attack

                 //  into accepting an invalid block through telling users they must manually set assumevalid.

@@ -1714,9 +1694,10 @@ static bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockInd

     // Now that the whole chain is irreversibly beyond that time it is applied to all blocks except the

     // two in the chain that violate it. This prevents exploiting the issue against nodes during their

     // initial block download.

-    bool fEnforceBIP30 = (!pindex->phashBlock) || // Enforce on CreateNewBlock invocations which don't have a hash.

-                          !((pindex->nHeight==91842 && pindex->GetBlockHash() == uint256S("0x00000000000a4d0a398161ffc163c503763b1f4360639393e0e4c8e300e0caec")) ||

-                           (pindex->nHeight==91880 && pindex->GetBlockHash() == uint256S("0x00000000000743f190a18c5577a3c2d2a1f610ae9601ac046a38084ccb7cd721")));

+    bool fEnforceBIP30 = true;

+                        //(!pindex->phashBlock) || // Enforce on CreateNewBlock invocations which don't have a hash.

+                        //  !((pindex->nHeight==91842 && pindex->GetBlockHash() == uint256S("0x00000000000a4d0a398161ffc163c503763b1f4360639393e0e4c8e300e0caec")) ||

+                        //   (pindex->nHeight==91880 && pindex->GetBlockHash() == uint256S("0x00000000000743f190a18c5577a3c2d2a1f610ae9601ac046a38084ccb7cd721")));

 

     // Once BIP34 activated it was not possible to create new duplicate coinbases and thus other than starting

     // with the 2 existing duplicate coinbase pairs, not possible to create overwriting txs.  But by the

@@ -2538,18 +2519,17 @@ bool InvalidateBlock(CValidationState& state, const CChainParams& chainparams, C

 {

     AssertLockHeld(cs_main);

 

-    // We first disconnect backwards and then mark the blocks as invalid.

-    // This prevents a case where pruned nodes may fail to invalidateblock

-    // and be left unable to start as they have no tip candidates (as there

-    // are no blocks that meet the "have data and are not invalid per

-    // nStatus" criteria for inclusion in setBlockIndexCandidates).

-

-    bool pindex_was_in_chain = false;

-    CBlockIndex *invalid_walk_tip = chainActive.Tip();

+    // Mark the block itself as invalid.

+    pindex->nStatus |= BLOCK_FAILED_VALID;

+    setDirtyBlockIndex.insert(pindex);

+    setBlockIndexCandidates.erase(pindex);

 

     DisconnectedBlockTransactions disconnectpool;

     while (chainActive.Contains(pindex)) {

-        pindex_was_in_chain = true;

+        CBlockIndex *pindexWalk = chainActive.Tip();

+        pindexWalk->nStatus |= BLOCK_FAILED_CHILD;

+        setDirtyBlockIndex.insert(pindexWalk);

+        setBlockIndexCandidates.erase(pindexWalk);

         // ActivateBestChain considers blocks already in chainActive

         // unconditionally valid already, so force disconnect away from it.

         if (!DisconnectTip(state, chainparams, &disconnectpool)) {

@@ -2560,21 +2540,6 @@ bool InvalidateBlock(CValidationState& state, const CChainParams& chainparams, C

         }

     }

 

-    // Now mark the blocks we just disconnected as descendants invalid

-    // (note this may not be all descendants).

-    while (pindex_was_in_chain && invalid_walk_tip != pindex) {

-        invalid_walk_tip->nStatus |= BLOCK_FAILED_CHILD;

-        setDirtyBlockIndex.insert(invalid_walk_tip);

-        setBlockIndexCandidates.erase(invalid_walk_tip);

-        invalid_walk_tip = invalid_walk_tip->pprev;

-    }

-

-    // Mark the block itself as invalid.

-    pindex->nStatus |= BLOCK_FAILED_VALID;

-    setDirtyBlockIndex.insert(pindex);

-    setBlockIndexCandidates.erase(pindex);

-    g_failed_blocks.insert(pindex);

-

     // DisconnectTip will add transactions to disconnectpool; try to add these

     // back to the mempool.

     UpdateMempoolForReorg(disconnectpool, true);

@@ -2612,7 +2577,6 @@ bool ResetBlockFailureFlags(CBlockIndex *pindex) {

                 // Reset invalid block marker if it was pointing to one of those.

                 pindexBestInvalid = nullptr;

             }

-            g_failed_blocks.erase(it->second);

         }

         it++;

     }

@@ -2803,7 +2767,7 @@ static bool FindUndoPos(CValidationState &state, int nFile, CDiskBlockPos &pos,

 static bool CheckBlockHeader(const CBlockHeader& block, CValidationState& state, const Consensus::Params& consensusParams, bool fCheckPOW = true)

 {

     // Check proof of work matches claimed amount

-    if (fCheckPOW && !CheckProofOfWork(block.GetHash(), block.nBits, consensusParams))

+    if (fCheckPOW && !CheckProofOfWork(block.GetPoWHash(), block.nBits, consensusParams))

         return state.DoS(50, false, REJECT_INVALID, "high-hash", false, "proof of work failed");

 

     return true;

@@ -2973,6 +2937,10 @@ static bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationSta

             return state.Invalid(false, REJECT_OBSOLETE, strprintf("bad-version(0x%08x)", block.nVersion),

                                  strprintf("rejected nVersion=0x%08x block", block.nVersion));

 

+    if (block.nVersion < VERSIONBITS_TOP_BITS && IsWitnessEnabled(pindexPrev, consensusParams))

+        return state.Invalid(false, REJECT_OBSOLETE, strprintf("bad-version(0x%08x)", block.nVersion),

+                                 strprintf("rejected nVersion=0x%08x block", block.nVersion));

+

     return true;

 }

 

@@ -3089,21 +3057,6 @@ static bool AcceptBlockHeader(const CBlockHeader& block, CValidationState& state

             return state.DoS(100, error("%s: prev block invalid", __func__), REJECT_INVALID, "bad-prevblk");

         if (!ContextualCheckBlockHeader(block, state, chainparams, pindexPrev, GetAdjustedTime()))

             return error("%s: Consensus::ContextualCheckBlockHeader: %s, %s", __func__, hash.ToString(), FormatStateMessage(state));

-

-        if (!pindexPrev->IsValid(BLOCK_VALID_SCRIPTS)) {

-            for (const CBlockIndex* failedit : g_failed_blocks) {

-                if (pindexPrev->GetAncestor(failedit->nHeight) == failedit) {

-                    assert(failedit->nStatus & BLOCK_FAILED_VALID);

-                    CBlockIndex* invalid_walk = pindexPrev;

-                    while (invalid_walk != failedit) {

-                        invalid_walk->nStatus |= BLOCK_FAILED_CHILD;

-                        setDirtyBlockIndex.insert(invalid_walk);

-                        invalid_walk = invalid_walk->pprev;

-                    }

-                    return state.DoS(100, error("%s: prev block invalid", __func__), REJECT_INVALID, "bad-prevblk");

-                }

-            }

-        }

     }

     if (pindex == nullptr)

         pindex = AddToBlockIndex(block);

@@ -3117,15 +3070,13 @@ static bool AcceptBlockHeader(const CBlockHeader& block, CValidationState& state

 }

 

 // Exposed wrapper for AcceptBlockHeader

-bool ProcessNewBlockHeaders(const std::vector<CBlockHeader>& headers, CValidationState& state, const CChainParams& chainparams, const CBlockIndex** ppindex, CBlockHeader *first_invalid)

+bool ProcessNewBlockHeaders(const std::vector<CBlockHeader>& headers, CValidationState& state, const CChainParams& chainparams, const CBlockIndex** ppindex)

 {

-    if (first_invalid != nullptr) first_invalid->SetNull();

     {

         LOCK(cs_main);

         for (const CBlockHeader& header : headers) {

             CBlockIndex *pindex = nullptr; // Use a temp pindex instead of ppindex to avoid a const_cast

             if (!AcceptBlockHeader(header, state, chainparams, &pindex)) {

-                if (first_invalid) *first_invalid = header;

                 return false;

             }

             if (ppindex) {

@@ -3155,7 +3106,7 @@ static bool AcceptBlock(const std::shared_ptr<const CBlock>& pblock, CValidation

     // process an unrequested block if it's new and has enough work to

     // advance our tip, and isn't too many blocks ahead.

     bool fAlreadyHave = pindex->nStatus & BLOCK_HAVE_DATA;

-    bool fHasMoreOrSameWork = (chainActive.Tip() ? pindex->nChainWork >= chainActive.Tip()->nChainWork : true);

+    bool fHasMoreWork = (chainActive.Tip() ? pindex->nChainWork > chainActive.Tip()->nChainWork : true);

     // Blocks that are too out-of-order needlessly limit the effectiveness of

     // pruning, because pruning will not delete block files that contain any

     // blocks which are too close in height to the tip.  Apply this test

@@ -3172,15 +3123,9 @@ static bool AcceptBlock(const std::shared_ptr<const CBlock>& pblock, CValidation

     // and unrequested blocks.

     if (fAlreadyHave) return true;

     if (!fRequested) {  // If we didn't ask for it:

-        if (pindex->nTx != 0) return true;    // This is a previously-processed block that was pruned

-        if (!fHasMoreOrSameWork) return true; // Don't process less-work chains

-        if (fTooFarAhead) return true;        // Block height is too high

-

-        // Protect against DoS attacks from low-work chains.

-        // If our tip is behind, a peer could try to send us

-        // low-work blocks on a fake chain that we would never

-        // request; don't process these.

-        if (pindex->nChainWork < nMinimumChainWork) return true;

+        if (pindex->nTx != 0) return true;  // This is a previously-processed block that was pruned

+        if (!fHasMoreWork) return true;     // Don't process less-work chains

+        if (fTooFarAhead) return true;      // Block height is too high

     }

     if (fNewBlock) *fNewBlock = true;

 

@@ -3530,10 +3475,6 @@ bool static LoadBlockIndexDB(const CChainParams& chainparams)

                 pindex->nChainTx = pindex->nTx;

             }

         }

-        if (!(pindex->nStatus & BLOCK_FAILED_MASK) && pindex->pprev && (pindex->pprev->nStatus & BLOCK_FAILED_MASK)) {

-            pindex->nStatus |= BLOCK_FAILED_CHILD;

-            setDirtyBlockIndex.insert(pindex);

-        }

         if (pindex->IsValid(BLOCK_VALID_TRANSACTIONS) && (pindex->nChainTx || pindex->pprev == nullptr))

             setBlockIndexCandidates.insert(pindex);

         if (pindex->nStatus & BLOCK_FAILED_MASK && (!pindexBestInvalid || pindex->nChainWork > pindexBestInvalid->nChainWork))

@@ -3924,7 +3865,6 @@ void UnloadBlockIndex()

     nLastBlockFile = 0;

     nBlockSequenceId = 1;

     setDirtyBlockIndex.clear();

-    g_failed_blocks.clear();

     setDirtyFileInfo.clear();

     versionbitscache.Clear();

     for (int b = 0; b < VERSIONBITS_NUM_BITS; b++) {

--- a/src/validation.h

+++ b/src/validation.h

@@ -50,7 +50,7 @@ static const bool DEFAULT_WHITELISTRELAY = true;

 /** Default for DEFAULT_WHITELISTFORCERELAY. */

 static const bool DEFAULT_WHITELISTFORCERELAY = true;

 /** Default for -minrelaytxfee, minimum relay fee for transactions */

-static const unsigned int DEFAULT_MIN_RELAY_TX_FEE = 1000;

+static const unsigned int DEFAULT_MIN_RELAY_TX_FEE = 100000;

 //! -maxtxfee default

 static const CAmount DEFAULT_TRANSACTION_MAXFEE = 0.1 * COIN;

 //! Discourage users to set fees higher than this amount (in satoshis) per kB

@@ -161,6 +161,7 @@ extern CTxMemPool mempool;

 typedef std::unordered_map<uint256, CBlockIndex*, BlockHasher> BlockMap;

 extern BlockMap mapBlockIndex;

 extern uint64_t nLastBlockTx;

+extern uint64_t nLastBlockSize;

 extern uint64_t nLastBlockWeight;

 extern const std::string strMessageMagic;

 extern CWaitableCriticalSection csBestBlock;

@@ -185,9 +186,6 @@ extern bool fEnableReplacement;

 /** Block hash whose ancestors we will assume to have valid scripts without checking them. */

 extern uint256 hashAssumeValid;

 

-/** Minimum work we will assume exists on some valid chain. */

-extern arith_uint256 nMinimumChainWork;

-

 /** Best header we've seen so far (used for getheaders queries' starting points). */

 extern CBlockIndex *pindexBestHeader;

 

@@ -204,7 +202,7 @@ extern uint64_t nPruneTarget;

 /** Block files containing a block-height within MIN_BLOCKS_TO_KEEP of chainActive.Tip() will not be pruned. */

 static const unsigned int MIN_BLOCKS_TO_KEEP = 288;

 

-static const signed int DEFAULT_CHECKBLOCKS = 6;

+static const signed int DEFAULT_CHECKBLOCKS = 6 * 4;

 static const unsigned int DEFAULT_CHECKLEVEL = 3;

 

 // Require that user allocate at least 550MB for block & undo files (blk???.dat and rev???.dat)

@@ -247,9 +245,8 @@ bool ProcessNewBlock(const CChainParams& chainparams, const std::shared_ptr<cons

  * @param[out] state This may be set to an Error state if any error occurred processing them

  * @param[in]  chainparams The params for the chain we want to connect to

  * @param[out] ppindex If set, the pointer will be set to point to the last new block index object for the given headers

- * @param[out] first_invalid First header that fails validation, if one exists

  */

-bool ProcessNewBlockHeaders(const std::vector<CBlockHeader>& block, CValidationState& state, const CChainParams& chainparams, const CBlockIndex** ppindex=nullptr, CBlockHeader *first_invalid=nullptr);

+bool ProcessNewBlockHeaders(const std::vector<CBlockHeader>& block, CValidationState& state, const CChainParams& chainparams, const CBlockIndex** ppindex=nullptr);

 

 /** Check whether enough disk space is available for an incoming block */

 bool CheckDiskSpace(uint64_t nAdditionalBytes = 0);

--- a/src/validationinterface.cpp

+++ b/src/validationinterface.cpp

@@ -4,9 +4,7 @@

 // file COPYING or http://www.opensource.org/licenses/mit-license.php.

 

 #include "validationinterface.h"

-

 #include "init.h"

-#include "primitives/block.h"

 #include "scheduler.h"

 #include "sync.h"

 #include "util.h"

--- a/src/version.h

+++ b/src/version.h

@@ -15,7 +15,7 @@ static const int PROTOCOL_VERSION = 70015;

 static const int INIT_PROTO_VERSION = 209;

 

 //! In this version, 'getheaders' was introduced.

-static const int GETHEADERS_VERSION = 31800;

+static const int GETHEADERS_VERSION = 70002;

 

 //! disconnect from peers older than this proto version

 static const int MIN_PEER_PROTO_VERSION = GETHEADERS_VERSION;

--- a/src/versionbits.cpp

+++ b/src/versionbits.cpp

@@ -107,7 +107,7 @@ ThresholdState AbstractThresholdConditionChecker::GetStateFor(const CBlockIndex*

 // return the numerical statistics of blocks signalling the specified BIP9 condition in this current period

 BIP9Stats AbstractThresholdConditionChecker::GetStateStatisticsFor(const CBlockIndex* pindex, const Consensus::Params& params) const

 {

-    BIP9Stats stats = {};

+    BIP9Stats stats;

 

     stats.period = Period(params);

     stats.threshold = Threshold(params);


참조 :  https://steemit.com/kr/@hackyminer/trace-source-code-using-git-howto


'IT Tech. > CrytoCurrency' 카테고리의 다른 글

NiceHash 사용하기  (0) 2018.02.06
코인별 마켓 규모  (12) 2017.12.14
viaBTC server 구축 / 거래소 만들기  (0) 2017.12.12
모네로 채굴용 Pool 구축하기  (2) 2017.09.06
xmr-stak-cpu 빌드(컴파일) 하기  (0) 2017.09.06
블로그 이미지

StartGuide

I want to share the basic to programming of each category and how to solve the error. This basic instruction can be extended further. And I have been worked in southeast Asia more than 3 years. And I want to have the chance to work another country.

,
노출되는 이미지가 불편하시겠지만 양해를 구합니다. 노출, 클릭등에 관한 자료로 활용 중입니다.


코인별 마켓 규모 




1. 기능 


-코인 (비트코인, 알트코인) 시가 총액 순서


-비트코인과 발행량 규모(비교)


-1시간, 24시간, 7일 상승/하락 변화



2. 사용 모듈


- 환율 API : free.currencyconverterapi.com


- 코인 API: api.coinmarketcap.com


- tablesorter : tablesorter.com




- 실행 버젼 URL : http://marketcap.bitballoon.com/?limit=10



- 실행 스샷




블로그 이미지

StartGuide

I want to share the basic to programming of each category and how to solve the error. This basic instruction can be extended further. And I have been worked in southeast Asia more than 3 years. And I want to have the chance to work another country.

,
노출되는 이미지가 불편하시겠지만 양해를 구합니다. 노출, 클릭등에 관한 자료로 활용 중입니다.


viaBTC server 구축 / 거래소 만들기




requirements(필수 요소)








블로그 이미지

StartGuide

I want to share the basic to programming of each category and how to solve the error. This basic instruction can be extended further. And I have been worked in southeast Asia more than 3 years. And I want to have the chance to work another country.

,
노출되는 이미지가 불편하시겠지만 양해를 구합니다. 노출, 클릭등에 관한 자료로 활용 중입니다.

모네로(XMR, monero) 채굴용 Pool 구축하기



- 모네로 채굴, 저렴한 수수료, 자체 구축


- 1 CPU로 시작해서, 4 CPU로 확장을 고려(방문자가 많아지면,)


- 채굴장에서 전용풀도 필요하다면, 원격 구축 대행 가능(?)




채굴 실행 / 채굴 접속 


- 이미지 : 채굴중 진행 표시

- Mining Program 마이닝 프로그램 : xmr-stak-cpu.exe


- 설정 : config.txt

-- "cpu_threads_conf":

-- "pool_address" : 

-- "wallet_address" :

-- "pool_password" :



사전 준비


1. VPS (가상 사설 서버, 최소 1CPU/1GB/20GB HDD, 권장 4 CPU/8GB/80GB HDD )


2. Ubuntu 14.04 x64 (최소)


3. Putty / Winscp등의 ssh /sftp 지원툴




Ubuntu 설정


1. Update Ubuntu


2. Setup SWAP


3. 필요한 패키지 설치




Monero 데몬 설정(Wallet)



1. 폴더 생성 : mkdir monero

2. 다운로드 & unzip : https://downloads.getmonero.org/monero.linux.x64.v0-10-1-0.tar.bz2

3. monerd실행 (동기화)




채굴풀 설정(Mining Pool )


1.git clone : git clone https://github.com/zone117x/node-cryptonote-pool.git pool

2. cd pool

3. npm update

4. cp config_example.json config.json

5. 수수료를 저렴하게 수정, 출금 금액도 낮게 설정





결과물 : 웹 메인 화면





원문 : 

http://betbybitcoin.com/setup-monero-mining-pool-using-node-cryptonote-pool/


참조 : https://github.com/teracycle/teracycle-pool

참조 : https://moneroeric.com/install-monero-wallet-address/

블로그 이미지

StartGuide

I want to share the basic to programming of each category and how to solve the error. This basic instruction can be extended further. And I have been worked in southeast Asia more than 3 years. And I want to have the chance to work another country.

,
노출되는 이미지가 불편하시겠지만 양해를 구합니다. 노출, 클릭등에 관한 자료로 활용 중입니다.

xmr-stak-cpu 빌드(컴파일) 하기



XMR(모네로, monero)를 위한 CPU채굴 프로그램




1. 폴더 생성


mkdir c:\xmr-stak-dep


2. Visual Studion 2017 Commnunity 다운로드 및 설치, 실행후에


1) Desktop development with C++(왼쪽에서 선택)

2) Toolset for Visual Studio C++ 2015... (오른쪽에서 선택)


3. Cmake for Win64 다운로드 ( 3.9 )


4. Dependencies ( OpenSSL/Hwloc and Microhttpd ) 다운로드


unzip c:\xmr-stap-dep

 


개발자 기부/수수료

4.1 on_switch_pool(size_t pool_id) : 

    if ( pool_id = dev_pool_id )

     donate.xmr-stak.net:6666 또는 donate.xmr-stak.net:3333

4.2 case EV_SWITCH_POOL:

    on_switch_pool(ev.iPoolId)


5. 컴파일


xmr-stak-cpu를 github에서 다운로드후 unzip c:\xmr-stak-cpu


아래 명령어를 실행




 "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools\VsMSBuildCmd.bat"
set CMAKE_PREFIX_PATH=C:\xmr-stak-dep\hwloc;C:\xmr-stak-dep\libmicrohttpd;C:\xmr-stak-dep\openssl
mkdir build
cd build
cmake -G "Visual Studio 15 2017 Win64" -T v141,host=x64 ..
msbuild xmr-stak-cpu.sln /p:Configuration=Release
cd bin\Release
copy ..\..\..\config.txt .


또는 c:\xmr-stak-cpu 아래에

_vs1SetEnv.bat


"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools\VsMSBuildCmd.bat"

pause

_vs2Build.bat

:: should run after : setVs.bat

set CMAKE_PREFIX_PATH=d:\xmr-stak-dep\hwloc;d:\xmr-stak-dep\libmicrohttpd;d:\xmr-stak-dep\openssl
mkdir build
cd build
cmake -G "Visual Studio 15 2017 Win64" -T v141,host=x64 ..
msbuild xmr-stak-cpu.sln /p:Configuration=Release
cd bin\Release
copy ..\..\..\config.txt .

pause



5.1 실행시 Error1 : msvcp140.dll, vcruntime140.dll not available erros 

--> 다운로드 from Microsoft



5.2 원본 : https://github.com/fireice-uk/xmr-stak-cpu


5.3 첨부 : 컴파일 버젼





* 개발자 기부 수수료 부분 (자세히)


https://github.com/fireice-uk/xmr-stak-cpu/blob/master/executor.cpp
// executor.cpp
void executor::ex_clock_thd()
{
	size_t iSwitchPeriod = sec_to_ticks(iDevDonatePeriod);	// 6000 -> 12000
	size_t iDevPortion = (size_t)floor(((double)iSwitchPeriod) * fDevDonationLevel); // 240

	//No point in bothering with less than 10 sec
	if(iDevPortion < sec_to_ticks(10))
		iDevPortion = 0;

	//Add 2 seconds to compensate for connect
	if(iDevPortion != 0)
		iDevPortion += sec_to_ticks(2);		// 244
	while (true)
	{
		std::this_thread::sleep_for(std::chrono::milliseconds(size_t(iTickTime)));

		push_event(ex_event(EV_PERF_TICK));

		// Service timed events
		std::unique_lock lck(timed_event_mutex);
		std::list::iterator ev = lTimedEvents.begin();
		while (ev != lTimedEvents.end())
		{
			ev->ticks_left--;
			if(ev->ticks_left == 0)
			{
				push_event(std::move(ev->event));
				ev = lTimedEvents.erase(ev);
			}
			else
				ev++;
		}
		lck.unlock();

		if(iDevPortion == 0)
			continue;

		iSwitchPeriod--;
		if(iSwitchPeriod == 0)
		{
			push_event(ex_event(EV_SWITCH_POOL, usr_pool_id));
			iSwitchPeriod = sec_to_ticks(iDevDonatePeriod);
		}
		else if(iSwitchPeriod == iDevPortion)	// 244
		{
			push_event(ex_event(EV_SWITCH_POOL, dev_pool_id));
		}
	}
}

// donate-level.h
// constexpr double fDevDonationLevel = 2.0 / 100.0;

// executor.h
constexpr static size_t iDevDonatePeriod = 100 * 60;



[실행]

[2017-11-14 11:53:29] : Starting single thread, affinity: 0.
[2017-11-14 11:53:29] : Starting single thread, affinity: 1.
[2017-11-14 11:53:29] : Starting single thread, affinity: 2.
[2017-11-14 11:53:29] : iDevDonatePeriod: 6000
[2017-11-14 11:53:29] : Connecting to pool xmr-eu.dwarfpool.com:8005 ...
[2017-11-14 11:53:29] : iSwitchPeriod: 12000
[2017-11-14 11:53:29] : hwloc: memory pinned
[2017-11-14 11:53:29] : fDevDonationLevel: 1202590843
[2017-11-14 11:53:29] : iDevPortion: 240
[2017-11-14 11:53:29] : iDevPortion: 244
[2017-11-14 11:53:29] : hwloc: memory pinned
[2017-11-14 11:53:29] : MEMORY ALLOC FAILED: VirtualAlloc failed.
[2017-11-14 11:53:29] : hwloc: memory pinned
[2017-11-14 11:53:29] : MEMORY ALLOC FAILED: VirtualAlloc failed.
[2017-11-14 11:53:29] : MEMORY ALLOC FAILED: VirtualAlloc failed.
[2017-11-14 11:53:29] : Connected. Logging in...
[2017-11-14 11:53:30] : Difficulty changed. Now: 20000.
[2017-11-14 11:53:30] : New block detected.


블로그 이미지

StartGuide

I want to share the basic to programming of each category and how to solve the error. This basic instruction can be extended further. And I have been worked in southeast Asia more than 3 years. And I want to have the chance to work another country.

,
노출되는 이미지가 불편하시겠지만 양해를 구합니다. 노출, 클릭등에 관한 자료로 활용 중입니다.

CudaMiner 윈도우용 컴파일 하기



-- 비트코인/알트코인 마이닝 마이너 만들기



1. 사전 준비


1) Visual Studio 201x (c++설치)


2) Nvidia CUDA Toolkit 5.5 , https://developer.nvidia.com/cuda-downloads


3) OpenSource Package ( phthreads, OpenSSL, curl )


4) Download CudaMiner Source , https://github.com/cbuchner1/CudaMiner




원문 : http://cryptomining-blog.com/tag/compile-cudaminer-for-windows/

블로그 이미지

StartGuide

I want to share the basic to programming of each category and how to solve the error. This basic instruction can be extended further. And I have been worked in southeast Asia more than 3 years. And I want to have the chance to work another country.

,
노출되는 이미지가 불편하시겠지만 양해를 구합니다. 노출, 클릭등에 관한 자료로 활용 중입니다.

가벼운 LiteCoin wallet(지갑)으로?



Litecoin core를 https://litecoin.org/ 를 통해서 다운로드 가능하지만, 지갑 정보를 모두 수령하기에는 용량이 너무 많다.


대체할 만한 가볍고 사이즈 작은 지갑으로 추천할 만한 것은 Eletctrum-LTC https://electrum-ltc.org/로 Bitcoin의 Electrum Wallet에서 fork된 버젼이다.


- 12개의 보안 문구를 seed로 사용하여, 침입자에게 좌절을 준다

- 지갑키를 압호화하는 패스워드도 필요하다.





- 참조 : 


https://themerkle.com/top-4-litecoin-wallet-clients/


https://www.reddit.com/r/litecoin/comments/6n4r51/best_wallet_for_litecoin/

블로그 이미지

StartGuide

I want to share the basic to programming of each category and how to solve the error. This basic instruction can be extended further. And I have been worked in southeast Asia more than 3 years. And I want to have the chance to work another country.

,
노출되는 이미지가 불편하시겠지만 양해를 구합니다. 노출, 클릭등에 관한 자료로 활용 중입니다.


비트코인 마이닝 하드웨어 성능 및 가격 비교(채산성)




1. ASIC Hardware/채굴 하드웨어



* Mhash/s = millions hashed per second(double sha256 raw speed performance)



원문 : https://en.bitcoin.it/wiki/Mining_hardware_comparison




2. 채굴 채산성 ( 2017년 8월 기준의 난이도 )


- AntMiner S9 기준 : 14,000,000 Mhash/s ( USD 2,400 ) 


- 월 USD 404 수입 : 6개월에 투자 회수 가능 



* 채산성 비교 2




https://www.cryptocompare.com/mining/#/equipment





* 실시간 Realtime Hashrate (채굴 비중)


https://btc.com/


AntMiner제작사 BitMain에서 운영하는 곳으로

AntPool.com과 BTC.com, HashNest.com등이 있음



* 특정 pool에서, 다중 coin(algorithm) 채굴 결과에 따른 효율성


- 동일 장비라면, 어떤 coin을 채굴하는 것이 좋을까?



블로그 이미지

StartGuide

I want to share the basic to programming of each category and how to solve the error. This basic instruction can be extended further. And I have been worked in southeast Asia more than 3 years. And I want to have the chance to work another country.

,
노출되는 이미지가 불편하시겠지만 양해를 구합니다. 노출, 클릭등에 관한 자료로 활용 중입니다.

BitCoin/비트코인 채굴하기



1. mining pool 가입하기


- 일반적인 PC로는 1bit coin를 채굴하기 위해서는 수백년이 소요된다.


- 대표적인 사이트 https://bitminter 가입하기



2. 채굴 도구 설치하기



- Java를 통해서 실행되는 Client로서, Java설치가 필요하다.



3. 채굴 Client 실행



- ENGINE START를 누르면, 시작된다.


- Client실행후에 Settings->Account의 설정은 https://bitminter.com/members/workers의 Workers설정과 가입 ID를 사용하면 된다.

- https://bitminter.com/members/workers의 메뉴에서 "Accepted"가 Client에서 작업한 결과를 반영하는 항목이다.


- 이 방식은 GPU를 사용하는 과정으로, ASIC를 사용하는 방식은 설명을 찾아 보면 될 것 같다.




*  CPU로 채굴하기


How to mine BitCoin with your CPU

https://jonathanmh.com/how-to-mine-bitcoin-with-your-cpu/


- cpuminer 

1. 다운로드, https://github.com/pooler/cpuminer

2. 사용법, minerd --help

3. 옵션

-a : specify the algorithm

-o : URL of mining sever


        • us1.bitminter.com:3333 (United States)
        • us2.bitminter.com:3333 (United States)
        • eu1.bitminter.com:3333 (Europe)


-u : username for mining server


e.g. John_asic3


-p : password for mining server


You can put X or 123 as password


-t : number of miner threds

-D: enable debug output

-P: verbose dump of protocol-level activities


mining.notify , https://github.com/ctubio/php-proxy-stratum/wiki/Stratum-Mining-Protocol

 {

  "method": "mining.notify",

  "params": [

// Job ID.

    "3e2f-4",

// Hash of previous block.

    "cc8122818b18803ee5d1 0f737a65b4bc083a2a8c00c6bf500000000000000000",

// The miner inserts ExtraNonce1 and ExtraNonce2 after this section of the coinbase

    "0100000001000000000000000000000000000000000 0000000000000000000000000000000ffffffff4d03bd5407094269744d696e7465722cfabe6d6d345a22ef755 0f17b770cd4443b0d6518cdc894f396e3bd6ec8d530bc62bb83380100000000000000096575313e2f00000004",

// The miner appends this after the first part of the coinbase and the two ExtraNonce values

    "ffffffff014089a150000000001976a9145c0e4a6830ff6ea9aea773d75bc207299cd50b7488ac00000000",

// List of merkle branches. The coinbase transaction is hashed against the merkle brances to build the final merkle root

    [

      "9e67c63ad57b49ab4be0bb35193dddf1910ade39a89e08e90f5af1c5a75fff2d",

      "bef5a66cadfd72b4003d8 fe43cc47dd799a1eea591779fcd1ea725d02a4de297",

      "27f05a3d8292bffe8836c605373a97b95210960fbb65 eab217ce8c1450c4198e",

      "d223f3be32ab0acaea400255ff40150487ad826d38ba9d484ceb8417aeb28b16",

      " 3ae54c3a88eee2ef1440cb171f23e25dd6c3c2f20e29d554e65848c4bfb3db69",

      "7709c4da7d0ccc6de618dc3 732e9ef542da80cd7cc68c6b105ccbad57b09a193",

      "2dda89452949583814463fa1dfc21ca5922835d893afb5 ac817b7028ab3b7efe",

      "1c0da5af5cb8c86d013e6dbce9e4ac8386e4b00d4d810e6cf75c8b36e4a480a7",

      "d7 dfa91ccabf0f151c388726a410f4ab430a231348b03862c2ca17ebcaa6c96a",

      "5533806ec8f9c855711eb7e99 07d878e56b9ed5986dd3e26c91868768ddc64a1",

      "b0194b4ea47866169ab41468208ac475e9a70c1af6467d0a 6a93dc9bcc0da0ed"

    ],

// Bitcoin block version, used in the block header

    "20000002",

// nBit, the encoded network difficulty. Used in the block header.

    "180130e0",

// nTime, the current time. nTime rolling should be supported, but should not increase faster than actual time.

    "59911174",

// Clean Jobs. If true, miners should abort their current work and immediately use the new job. 

// If false, they can still use the current job, but should move to the new one after exhauting the current nonce range.

    false

  ],

  "id": 1

}



*  주의할 사이트

1. 맬웨어 : minergate.com



블로그 이미지

StartGuide

I want to share the basic to programming of each category and how to solve the error. This basic instruction can be extended further. And I have been worked in southeast Asia more than 3 years. And I want to have the chance to work another country.

,