diff --git a/.gitignore b/.gitignore index b0dac187c..370866819 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,7 @@ src/bitcoin src/zcashd src/zcash-cli src/zcash-gtest -src/bitcoin-tx +src/zcash-tx src/test/test_bitcoin src/qt/test/test_bitcoin-qt @@ -61,7 +61,6 @@ src/qt/test/moc*.cpp *.pyc *.o *.o-* -*.patch .zcash *.a *.pb.cc @@ -121,4 +120,4 @@ qa/pull-tester/test.*/* /doc/doxygen/ -libbitcoinconsensus.pc +libzcashconsensus.pc diff --git a/COPYING b/COPYING index 943b31921..62038b6ba 100644 --- a/COPYING +++ b/COPYING @@ -18,3 +18,23 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +The MIT software license (http://www.opensource.org/licenses/mit-license.php) +above applies to the code directly included in this source distribution, with +the exception of certain files under the 'src/qt/' and 'scripts/img/' directories +which are distributed under the LGPL or GPL licenses. Dependencies downloaded +as part of the build process may be covered by other open source licenses. +For further details see 'contrib/DEBIAN/copyright'. + + +This product includes software developed by the OpenSSL Project for use in the +[OpenSSL Toolkit](https://www.openssl.org/). This product includes cryptographic +software written by Eric Young ([eay@cryptsoft.com](mailto:eay@cryptsoft.com)), +and UPnP software written by Thomas Bernard. + + +Although almost all of the Zcash code is licensed under "permissive" open source +licenses, users and distributors should note that when built using the default +build options, Zcash depends on Oracle Berkeley DB 6.2.x, which is licensed +under the GNU Affero General Public License. diff --git a/Makefile.am b/Makefile.am index 09cd9b92e..7cbd5c69b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -6,7 +6,7 @@ GZIP_ENV="-9n" if BUILD_BITCOIN_LIBS pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = libbitcoinconsensus.pc +pkgconfig_DATA = libzcashconsensus.pc endif BITCOIND_BIN=$(top_builddir)/src/zcashd$(EXEEXT) diff --git a/README.md b/README.md index 639f263c6..e03d5ab25 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ +<<<<<<< HEAD Zcash ===== @@ -20,12 +21,30 @@ proving scheme which preserves confidentiality of transaction metadata. Participation in the Zcash project is subject to a [Code of Conduct](code_of_conduct.md). +======= +Zcash 1.0.0 +=========== + +What is Zcash? +-------------- + +[Zcash](https://z.cash/) is an implementation of the "Zerocash" protocol. +Based on Bitcoin's code, it intends to offer a far higher standard of privacy +and anonymity through a sophisticated zero-knowledge proving scheme that +preserves confidentiality of transaction metadata. Technical details are +available in our [Protocol Specification](https://github.com/zcash/zips/raw/master/protocol/protocol.pdf). + +This software is the Zcash client. It downloads and stores the entire history +of Zcash transactions; depending on the speed of your computer and network +connection, the synchronization process could take a day or more once the +block chain has reached a significant size. + Security Warnings ----------------- See important security warnings in [doc/security-warnings.md](doc/security-warnings.md). - + License ------- @@ -135,3 +154,32 @@ tail -f ~/.komodo/debug.log ./src/komodo-cli help ``` +======= + +**Zcash is unfinished and highly experimental.** Use at your own risk. + +Where do I begin? +----------------- + +We have a guide for joining the public testnet: +https://github.com/zcash/zcash/wiki/Beta-Guide + +### Need Help? + +* See the documentation at the [Zcash Wiki](https://github.com/zcash/zcash/wiki) + for help and more information. +* Ask for help on the [Zcash](https://forum.z.cash/) forum. + +Participation in the Zcash project is subject to a +[Code of Conduct](code_of_conduct.md). + +Building +-------- + +Build Zcash along with most dependencies from source by running +./zcutil/build.sh. Currently only Linux is supported. + +License +------- + +For license information see the file [COPYING](COPYING). diff --git a/build-aux/m4/bitcoin_find_bdb48.m4 b/build-aux/m4/bitcoin_find_bdb48.m4 index 20a595270..bd5c2af45 100644 --- a/build-aux/m4/bitcoin_find_bdb48.m4 +++ b/build-aux/m4/bitcoin_find_bdb48.m4 @@ -1,11 +1,11 @@ -AC_DEFUN([BITCOIN_FIND_BDB53],[ +AC_DEFUN([BITCOIN_FIND_BDB62],[ AC_MSG_CHECKING([for Berkeley DB C++ headers]) BDB_CPPFLAGS= BDB_LIBS= bdbpath=X - bdb53path=X + bdb62path=X bdbdirlist= - for _vn in 5.3 53 5 ''; do + for _vn in 6.2 62 6 ''; do for _pfx in b lib ''; do bdbdirlist="$bdbdirlist ${_pfx}db${_vn}" done @@ -15,8 +15,8 @@ AC_DEFUN([BITCOIN_FIND_BDB53],[ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include <${searchpath}db_cxx.h> ]],[[ - #if !((DB_VERSION_MAJOR == 5 && DB_VERSION_MINOR >= 3) || DB_VERSION_MAJOR > 5) - #error "failed to find bdb 5.3+" + #if !((DB_VERSION_MAJOR == 6 && DB_VERSION_MINOR >= 2) || DB_VERSION_MAJOR > 6) + #error "failed to find bdb 6.2+" #endif ]])],[ if test "x$bdbpath" = "xX"; then @@ -28,32 +28,32 @@ AC_DEFUN([BITCOIN_FIND_BDB53],[ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include <${searchpath}db_cxx.h> ]],[[ - #if !(DB_VERSION_MAJOR == 5 && DB_VERSION_MINOR == 3) - #error "failed to find bdb 5.3" + #if !(DB_VERSION_MAJOR == 6 && DB_VERSION_MINOR == 2) + #error "failed to find bdb 6.2" #endif ]])],[ - bdb53path="${searchpath}" + bdb62path="${searchpath}" break ],[]) done if test "x$bdbpath" = "xX"; then AC_MSG_RESULT([no]) AC_MSG_ERROR([libdb_cxx headers missing, Bitcoin Core requires this library for wallet functionality (--disable-wallet to disable wallet functionality)]) - elif test "x$bdb53path" = "xX"; then + elif test "x$bdb62path" = "xX"; then BITCOIN_SUBDIR_TO_INCLUDE(BDB_CPPFLAGS,[${bdbpath}],db_cxx) - AC_ARG_WITH([incompatible-bdb],[AS_HELP_STRING([--with-incompatible-bdb], [allow using a bdb version other than 5.3])],[ - AC_MSG_WARN([Found Berkeley DB other than 5.3; wallets opened by this build will not be portable!]) + AC_ARG_WITH([incompatible-bdb],[AS_HELP_STRING([--with-incompatible-bdb], [allow using a bdb version other than 6.2])],[ + AC_MSG_WARN([Found Berkeley DB other than 6.2; wallets opened by this build will not be portable!]) ],[ - AC_MSG_ERROR([Found Berkeley DB other than 5.3, required for portable wallets (--with-incompatible-bdb to ignore or --disable-wallet to disable wallet functionality)]) + AC_MSG_ERROR([Found Berkeley DB other than 6.2, required for portable wallets (--with-incompatible-bdb to ignore or --disable-wallet to disable wallet functionality)]) ]) else - BITCOIN_SUBDIR_TO_INCLUDE(BDB_CPPFLAGS,[${bdb53path}],db_cxx) - bdbpath="${bdb53path}" + BITCOIN_SUBDIR_TO_INCLUDE(BDB_CPPFLAGS,[${bdb62path}],db_cxx) + bdbpath="${bdb62path}" fi AC_SUBST(BDB_CPPFLAGS) # TODO: Ideally this could find the library version and make sure it matches the headers being used - for searchlib in db_cxx-5.3 db_cxx; do + for searchlib in db_cxx-6.2 db_cxx; do AC_CHECK_LIB([$searchlib],[main],[ BDB_LIBS="-l${searchlib}" break diff --git a/configure.ac b/configure.ac index b1ec277ac..6d6918ec2 100644 --- a/configure.ac +++ b/configure.ac @@ -3,10 +3,10 @@ AC_PREREQ([2.60]) define(_CLIENT_VERSION_MAJOR, 1) define(_CLIENT_VERSION_MINOR, 0) define(_CLIENT_VERSION_REVISION, 0) -define(_CLIENT_VERSION_BUILD, 1) +define(_CLIENT_VERSION_BUILD, 50) define(_ZC_BUILD_VAL, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, m4_incr(_CLIENT_VERSION_BUILD), m4_eval(_CLIENT_VERSION_BUILD < 50), 1, m4_eval(_CLIENT_VERSION_BUILD - 24), m4_eval(_CLIENT_VERSION_BUILD == 50), 1, , m4_eval(_CLIENT_VERSION_BUILD - 50))) define(_CLIENT_VERSION_SUFFIX, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, _CLIENT_VERSION_REVISION-beta$1, m4_eval(_CLIENT_VERSION_BUILD < 50), 1, _CLIENT_VERSION_REVISION-rc$1, m4_eval(_CLIENT_VERSION_BUILD == 50), 1, _CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION-$1))) -define(_CLIENT_VERSION_IS_RELEASE, false) +define(_CLIENT_VERSION_IS_RELEASE, true) define(_COPYRIGHT_YEAR, 2016) AC_INIT([Zcash],[_CLIENT_VERSION_MAJOR._CLIENT_VERSION_MINOR._CLIENT_VERSION_SUFFIX(_ZC_BUILD_VAL)],[https://github.com/zcash/zcash/issues],[zcash]) AC_CONFIG_SRCDIR([src/main.cpp]) @@ -179,7 +179,7 @@ CPPFLAGS="$CPPFLAGS -DBOOST_SPIRIT_THREADSAFE -DHAVE_BUILD_INFO -D__STDC_FORMAT_ AC_ARG_WITH([utils], [AS_HELP_STRING([--with-utils], - [build bitcoin-cli bitcoin-tx (default=yes)])], + [build zcash-cli zcash-tx (default=yes)])], [build_bitcoin_utils=$withval], [build_bitcoin_utils=yes]) @@ -270,9 +270,9 @@ case $host in dnl add default macports paths CPPFLAGS="$CPPFLAGS -isystem /opt/local/include" LIBS="$LIBS -L/opt/local/lib" - if test -d /opt/local/include/db53; then - CPPFLAGS="$CPPFLAGS -I/opt/local/include/db53" - LIBS="$LIBS -L/opt/local/lib/db53" + if test -d /opt/local/include/db62; then + CPPFLAGS="$CPPFLAGS -I/opt/local/include/db62" + LIBS="$LIBS -L/opt/local/lib/db62" fi fi @@ -522,7 +522,7 @@ AC_SUBST(LIBMEMENV) if test x$enable_wallet != xno; then dnl Check for libdb_cxx only if wallet enabled - BITCOIN_FIND_BDB53 + BITCOIN_FIND_BDB62 fi dnl Check for libminiupnpc (optional) @@ -746,7 +746,7 @@ AC_MSG_CHECKING([whether to build bitcoind]) AM_CONDITIONAL([BUILD_BITCOIND], [test x$build_bitcoind = xyes]) AC_MSG_RESULT($build_bitcoind) -AC_MSG_CHECKING([whether to build utils (bitcoin-cli bitcoin-tx)]) +AC_MSG_CHECKING([whether to build utils (zcash-cli zcash-tx)]) AM_CONDITIONAL([BUILD_BITCOIN_UTILS], [test x$build_bitcoin_utils = xyes]) AC_MSG_RESULT($build_bitcoin_utils) @@ -754,7 +754,7 @@ AC_MSG_CHECKING([whether to build libraries]) AM_CONDITIONAL([BUILD_BITCOIN_LIBS], [test x$build_bitcoin_libs = xyes]) if test x$build_bitcoin_libs = xyes; then AC_DEFINE(HAVE_CONSENSUS_LIB, 1, [Define this symbol if the consensus lib has been built]) - AC_CONFIG_FILES([libbitcoinconsensus.pc:libbitcoinconsensus.pc.in]) + AC_CONFIG_FILES([libzcashconsensus.pc:libzcashconsensus.pc.in]) fi AC_MSG_RESULT($build_bitcoin_libs) diff --git a/contrib/DEBIAN/changelog b/contrib/DEBIAN/changelog index b4f30bd47..da6e2eb6c 100644 --- a/contrib/DEBIAN/changelog +++ b/contrib/DEBIAN/changelog @@ -1,5 +1,29 @@ -zcash (1.0.0-rc1) UNRELEASED; urgency=medium +zcash (1.0.0-sprout) jessie; urgency=medium + + * 1.0.0 release. + + -- Zcash Company Fri, 28 Oct 2016 03:00:50 -0700 + +zcash (1.0.0-rc4) jessie; urgency=medium + + * 1.0.0-rc4 release. + + -- Zcash Company Thu, 27 Oct 2016 13:36:00 +0100 + +zcash (1.0.0-rc3) jessie; urgency=medium + + * 1.0.0-rc3 release. + + -- Zcash Company Wed, 26 Oct 2016 23:17:03 +0100 + +zcash (1.0.0-rc2) jessie; urgency=medium + + * 1.0.0-rc2 release. + + -- Zcash Company Sun, 23 Oct 2016 01:51:27 +0100 + +zcash (1.0.0-rc1) jessie; urgency=medium * Initial packaging for Debian. - -- Zcash Company Thu, 13 Oct 2016 20:12:17 -0700 + -- Zcash Company Mon, 17 Oct 2016 11:47:02 -0700 diff --git a/contrib/DEBIAN/control b/contrib/DEBIAN/control index 936fdc469..d7990366c 100644 --- a/contrib/DEBIAN/control +++ b/contrib/DEBIAN/control @@ -7,12 +7,13 @@ Build-Depends: autoconf, automake, bsdmainutils, build-essential git, g++-multilib, libc6-dev, libtool m4, ncurses-dev, pkg-config, python unzip, wget, zlib1g-dev -Vcs-Git: git@github.com:zcash/zcash.git +Vcs-Git: https://github.com/zcash/zcash.git Vcs-Browser: https://github.com/zcash/zcash Package: zcash -Version: 1.0.0-rc1 +Version: 1.0.0-sprout Architecture: amd64 -Description: Zcash is an implementation of the "Zerocash" protocol. +Depends: libgomp1 +Description: An implementation of the "Zerocash" protocol. Based on Bitcoin's code, it intends to offer a far higher standard of privacy and anonymity through a sophisticiated zero-knowledge proving scheme which preserves confidentiality of transaction metadata. diff --git a/contrib/DEBIAN/copyright b/contrib/DEBIAN/copyright index f76942d41..04daeb024 100644 --- a/contrib/DEBIAN/copyright +++ b/contrib/DEBIAN/copyright @@ -15,15 +15,6 @@ Files: src/json/* Copyright: 2007-2009, John W. Wilkinson License: Expat -Files: debian/* -Copyright: 2010-2011, Jonas Smedegaard - 2011, Matt Corallo -License: GPL-2+ - -Files: debian/manpages/* -Copyright: Micah Anderson -License: GPL-3+ - Files: src/qt/res/icons/clock*.png, src/qt/res/icons/tx*.png, src/qt/res/src/*.svg Copyright: Wladimir van der Laan @@ -95,7 +86,7 @@ Copyright: 2008 Beman Dawes License: Boost-Software-License-1.0 Files: depends/sources/db-*.tar.gz -Copyright: 1990, 2013 Oracle and/or its affiliates; +Copyright: 1990, 2016 Oracle and/or its affiliates; 1990, 1993, 1994, 1995 The Regents of the University of California; 1995, 1996 The President and Fellows of Harvard University; 2000-2005 INRIA, France Telecom @@ -138,39 +129,676 @@ License: Boost-Software-License-1.0 License: BDB /* - * Copyright (c) 1990, 2013 Oracle and/or its affiliates. All rights reserved. + * The Oracle Berkeley DB product is licensed + * under the GNU AFFERO GENERAL PUBLIC LICENSE: * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Redistributions in any form must be accompanied by information on - * how to obtain complete source code for the DB software and any - * accompanying software that uses the DB software. The source code - * must either be included in the distribution or be available for no - * more than the cost of distribution plus a nominal fee, and must be - * freely redistributable under reasonable conditions. For an - * executable file, complete source code means the source code for all - * modules it contains. It does not include source code for modules or - * files that typically accompany the major components of the operating - * system on which the executable file runs. * - * THIS SOFTWARE IS PROVIDED BY ORACLE ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR - * NON-INFRINGEMENT, ARE DISCLAIMED. IN NO EVENT SHALL ORACLE 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. + * GNU AFFERO GENERAL PUBLIC LICENSE + * Version 3, 19 November 2007 + * + * Copyright (C) 2007 Free Software Foundation, Inc. + * Everyone is permitted to copy and distribute verbatim copies + * of this license document, but changing it is not allowed. + * + * Preamble + * + * The GNU Affero General Public License is a free, copyleft license for + * software and other kinds of works, specifically designed to ensure + * cooperation with the community in the case of network server software. + * + * The licenses for most software and other practical works are designed + * to take away your freedom to share and change the works. By contrast, + * our General Public Licenses are intended to guarantee your freedom to + * share and change all versions of a program--to make sure it remains free + * software for all its users. + * + * When we speak of free software, we are referring to freedom, not + * price. Our General Public Licenses are designed to make sure that you + * have the freedom to distribute copies of free software (and charge for + * them if you wish), that you receive source code or can get it if you + * want it, that you can change the software or use pieces of it in new + * free programs, and that you know you can do these things. + * + * Developers that use our General Public Licenses protect your rights + * with two steps: (1) assert copyright on the software, and (2) offer + * you this License which gives you legal permission to copy, distribute + * and/or modify the software. + * + * A secondary benefit of defending all users' freedom is that + * improvements made in alternate versions of the program, if they + * receive widespread use, become available for other developers to + * incorporate. Many developers of free software are heartened and + * encouraged by the resulting cooperation. However, in the case of + * software used on network servers, this result may fail to come about. + * The GNU General Public License permits making a modified version and + * letting the public access it on a server without ever releasing its + * source code to the public. + * + * The GNU Affero General Public License is designed specifically to + * ensure that, in such cases, the modified source code becomes available + * to the community. It requires the operator of a network server to + * provide the source code of the modified version running there to the + * users of that server. Therefore, public use of a modified version, on + * a publicly accessible server, gives the public access to the source + * code of the modified version. + * + * An older license, called the Affero General Public License and + * published by Affero, was designed to accomplish similar goals. This is + * a different license, not a version of the Affero GPL, but Affero has + * released a new version of the Affero GPL which permits relicensing under + * this license. + * + * The precise terms and conditions for copying, distribution and + * modification follow. + * + * TERMS AND CONDITIONS + * + * 0. Definitions. + * + * "This License" refers to version 3 of the GNU Affero General Public License. + * + * "Copyright" also means copyright-like laws that apply to other kinds of + * works, such as semiconductor masks. + * + * "The Program" refers to any copyrightable work licensed under this + * License. Each licensee is addressed as "you". "Licensees" and + * "recipients" may be individuals or organizations. + * + * To "modify" a work means to copy from or adapt all or part of the work + * in a fashion requiring copyright permission, other than the making of an + * exact copy. The resulting work is called a "modified version" of the + * earlier work or a work "based on" the earlier work. + * + * A "covered work" means either the unmodified Program or a work based + * on the Program. + * + * To "propagate" a work means to do anything with it that, without + * permission, would make you directly or secondarily liable for + * infringement under applicable copyright law, except executing it on a + * computer or modifying a private copy. Propagation includes copying, + * distribution (with or without modification), making available to the + * public, and in some countries other activities as well. + * + * To "convey" a work means any kind of propagation that enables other + * parties to make or receive copies. Mere interaction with a user through + * a computer network, with no transfer of a copy, is not conveying. + * + * An interactive user interface displays "Appropriate Legal Notices" + * to the extent that it includes a convenient and prominently visible + * feature that (1) displays an appropriate copyright notice, and (2) + * tells the user that there is no warranty for the work (except to the + * extent that warranties are provided), that licensees may convey the + * work under this License, and how to view a copy of this License. If + * the interface presents a list of user commands or options, such as a + * menu, a prominent item in the list meets this criterion. + * + * 1. Source Code. + * + * The "source code" for a work means the preferred form of the work + * for making modifications to it. "Object code" means any non-source + * form of a work. + * + * A "Standard Interface" means an interface that either is an official + * standard defined by a recognized standards body, or, in the case of + * interfaces specified for a particular programming language, one that + * is widely used among developers working in that language. + * + * The "System Libraries" of an executable work include anything, other + * than the work as a whole, that (a) is included in the normal form of + * packaging a Major Component, but which is not part of that Major + * Component, and (b) serves only to enable use of the work with that + * Major Component, or to implement a Standard Interface for which an + * implementation is available to the public in source code form. A + * "Major Component", in this context, means a major essential component + * (kernel, window system, and so on) of the specific operating system + * (if any) on which the executable work runs, or a compiler used to + * produce the work, or an object code interpreter used to run it. + * + * The "Corresponding Source" for a work in object code form means all + * the source code needed to generate, install, and (for an executable + * work) run the object code and to modify the work, including scripts to + * control those activities. However, it does not include the work's + * System Libraries, or general-purpose tools or generally available free + * programs which are used unmodified in performing those activities but + * which are not part of the work. For example, Corresponding Source + * includes interface definition files associated with source files for + * the work, and the source code for shared libraries and dynamically + * linked subprograms that the work is specifically designed to require, + * such as by intimate data communication or control flow between those + * subprograms and other parts of the work. + * + * The Corresponding Source need not include anything that users + * can regenerate automatically from other parts of the Corresponding + * Source. + * + * The Corresponding Source for a work in source code form is that + * same work. + * + * 2. Basic Permissions. + * + * All rights granted under this License are granted for the term of + * copyright on the Program, and are irrevocable provided the stated + * conditions are met. This License explicitly affirms your unlimited + * permission to run the unmodified Program. The output from running a + * covered work is covered by this License only if the output, given its + * content, constitutes a covered work. This License acknowledges your + * rights of fair use or other equivalent, as provided by copyright law. + * + * You may make, run and propagate covered works that you do not + * convey, without conditions so long as your license otherwise remains + * in force. You may convey covered works to others for the sole purpose + * of having them make modifications exclusively for you, or provide you + * with facilities for running those works, provided that you comply with + * the terms of this License in conveying all material for which you do + * not control copyright. Those thus making or running the covered works + * for you must do so exclusively on your behalf, under your direction + * and control, on terms that prohibit them from making any copies of + * your copyrighted material outside their relationship with you. + * + * Conveying under any other circumstances is permitted solely under + * the conditions stated below. Sublicensing is not allowed; section 10 + * makes it unnecessary. + * + * 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + * + * No covered work shall be deemed part of an effective technological + * measure under any applicable law fulfilling obligations under article + * 11 of the WIPO copyright treaty adopted on 20 December 1996, or + * similar laws prohibiting or restricting circumvention of such + * measures. + * + * When you convey a covered work, you waive any legal power to forbid + * circumvention of technological measures to the extent such circumvention + * is effected by exercising rights under this License with respect to + * the covered work, and you disclaim any intention to limit operation or + * modification of the work as a means of enforcing, against the work's + * users, your or third parties' legal rights to forbid circumvention of + * technological measures. + * + * 4. Conveying Verbatim Copies. + * + * You may convey verbatim copies of the Program's source code as you + * receive it, in any medium, provided that you conspicuously and + * appropriately publish on each copy an appropriate copyright notice; + * keep intact all notices stating that this License and any + * non-permissive terms added in accord with section 7 apply to the code; + * keep intact all notices of the absence of any warranty; and give all + * recipients a copy of this License along with the Program. + * + * You may charge any price or no price for each copy that you convey, + * and you may offer support or warranty protection for a fee. + * + * 5. Conveying Modified Source Versions. + * + * You may convey a work based on the Program, or the modifications to + * produce it from the Program, in the form of source code under the + * terms of section 4, provided that you also meet all of these conditions: + * + * a) The work must carry prominent notices stating that you modified + * it, and giving a relevant date. + * + * b) The work must carry prominent notices stating that it is + * released under this License and any conditions added under section + * 7. This requirement modifies the requirement in section 4 to + * "keep intact all notices". + * + * c) You must license the entire work, as a whole, under this + * License to anyone who comes into possession of a copy. This + * License will therefore apply, along with any applicable section 7 + * additional terms, to the whole of the work, and all its parts, + * regardless of how they are packaged. This License gives no + * permission to license the work in any other way, but it does not + * invalidate such permission if you have separately received it. + * + * d) If the work has interactive user interfaces, each must display + * Appropriate Legal Notices; however, if the Program has interactive + * interfaces that do not display Appropriate Legal Notices, your + * work need not make them do so. + * + * A compilation of a covered work with other separate and independent + * works, which are not by their nature extensions of the covered work, + * and which are not combined with it such as to form a larger program, + * in or on a volume of a storage or distribution medium, is called an + * "aggregate" if the compilation and its resulting copyright are not + * used to limit the access or legal rights of the compilation's users + * beyond what the individual works permit. Inclusion of a covered work + * in an aggregate does not cause this License to apply to the other + * parts of the aggregate. + * + * 6. Conveying Non-Source Forms. + * + * You may convey a covered work in object code form under the terms + * of sections 4 and 5, provided that you also convey the + * machine-readable Corresponding Source under the terms of this License, + * in one of these ways: + * + * a) Convey the object code in, or embodied in, a physical product + * (including a physical distribution medium), accompanied by the + * Corresponding Source fixed on a durable physical medium + * customarily used for software interchange. + * + * b) Convey the object code in, or embodied in, a physical product + * (including a physical distribution medium), accompanied by a + * written offer, valid for at least three years and valid for as + * long as you offer spare parts or customer support for that product + * model, to give anyone who possesses the object code either (1) a + * copy of the Corresponding Source for all the software in the + * product that is covered by this License, on a durable physical + * medium customarily used for software interchange, for a price no + * more than your reasonable cost of physically performing this + * conveying of source, or (2) access to copy the + * Corresponding Source from a network server at no charge. + * + * c) Convey individual copies of the object code with a copy of the + * written offer to provide the Corresponding Source. This + * alternative is allowed only occasionally and noncommercially, and + * only if you received the object code with such an offer, in accord + * with subsection 6b. + * + * d) Convey the object code by offering access from a designated + * place (gratis or for a charge), and offer equivalent access to the + * Corresponding Source in the same way through the same place at no + * further charge. You need not require recipients to copy the + * Corresponding Source along with the object code. If the place to + * copy the object code is a network server, the Corresponding Source + * may be on a different server (operated by you or a third party) + * that supports equivalent copying facilities, provided you maintain + * clear directions next to the object code saying where to find the + * Corresponding Source. Regardless of what server hosts the + * Corresponding Source, you remain obligated to ensure that it is + * available for as long as needed to satisfy these requirements. + * + * e) Convey the object code using peer-to-peer transmission, provided + * you inform other peers where the object code and Corresponding + * Source of the work are being offered to the general public at no + * charge under subsection 6d. + * + * A separable portion of the object code, whose source code is excluded + * from the Corresponding Source as a System Library, need not be + * included in conveying the object code work. + * + * A "User Product" is either (1) a "consumer product", which means any + * tangible personal property which is normally used for personal, family, + * or household purposes, or (2) anything designed or sold for incorporation + * into a dwelling. In determining whether a product is a consumer product, + * doubtful cases shall be resolved in favor of coverage. For a particular + * product received by a particular user, "normally used" refers to a + * typical or common use of that class of product, regardless of the status + * of the particular user or of the way in which the particular user + * actually uses, or expects or is expected to use, the product. A product + * is a consumer product regardless of whether the product has substantial + * commercial, industrial or non-consumer uses, unless such uses represent + * the only significant mode of use of the product. + * + * "Installation Information" for a User Product means any methods, + * procedures, authorization keys, or other information required to install + * and execute modified versions of a covered work in that User Product from + * a modified version of its Corresponding Source. The information must + * suffice to ensure that the continued functioning of the modified object + * code is in no case prevented or interfered with solely because + * modification has been made. + * + * If you convey an object code work under this section in, or with, or + * specifically for use in, a User Product, and the conveying occurs as + * part of a transaction in which the right of possession and use of the + * User Product is transferred to the recipient in perpetuity or for a + * fixed term (regardless of how the transaction is characterized), the + * Corresponding Source conveyed under this section must be accompanied + * by the Installation Information. But this requirement does not apply + * if neither you nor any third party retains the ability to install + * modified object code on the User Product (for example, the work has + * been installed in ROM). + * + * The requirement to provide Installation Information does not include a + * requirement to continue to provide support service, warranty, or updates + * for a work that has been modified or installed by the recipient, or for + * the User Product in which it has been modified or installed. Access to a + * network may be denied when the modification itself materially and + * adversely affects the operation of the network or violates the rules and + * protocols for communication across the network. + * + * Corresponding Source conveyed, and Installation Information provided, + * in accord with this section must be in a format that is publicly + * documented (and with an implementation available to the public in + * source code form), and must require no special password or key for + * unpacking, reading or copying. + * + * 7. Additional Terms. + * + * "Additional permissions" are terms that supplement the terms of this + * License by making exceptions from one or more of its conditions. + * Additional permissions that are applicable to the entire Program shall + * be treated as though they were included in this License, to the extent + * that they are valid under applicable law. If additional permissions + * apply only to part of the Program, that part may be used separately + * under those permissions, but the entire Program remains governed by + * this License without regard to the additional permissions. + * + * When you convey a copy of a covered work, you may at your option + * remove any additional permissions from that copy, or from any part of + * it. (Additional permissions may be written to require their own + * removal in certain cases when you modify the work.) You may place + * additional permissions on material, added by you to a covered work, + * for which you have or can give appropriate copyright permission. + * + * Notwithstanding any other provision of this License, for material you + * add to a covered work, you may (if authorized by the copyright holders of + * that material) supplement the terms of this License with terms: + * + * a) Disclaiming warranty or limiting liability differently from the + * terms of sections 15 and 16 of this License; or + * + * b) Requiring preservation of specified reasonable legal notices or + * author attributions in that material or in the Appropriate Legal + * Notices displayed by works containing it; or + * + * c) Prohibiting misrepresentation of the origin of that material, or + * requiring that modified versions of such material be marked in + * reasonable ways as different from the original version; or + * + * d) Limiting the use for publicity purposes of names of licensors or + * authors of the material; or + * + * e) Declining to grant rights under trademark law for use of some + * trade names, trademarks, or service marks; or + * + * f) Requiring indemnification of licensors and authors of that + * material by anyone who conveys the material (or modified versions of + * it) with contractual assumptions of liability to the recipient, for + * any liability that these contractual assumptions directly impose on + * those licensors and authors. + * + * All other non-permissive additional terms are considered "further + * restrictions" within the meaning of section 10. If the Program as you + * received it, or any part of it, contains a notice stating that it is + * governed by this License along with a term that is a further + * restriction, you may remove that term. If a license document contains + * a further restriction but permits relicensing or conveying under this + * License, you may add to a covered work material governed by the terms + * of that license document, provided that the further restriction does + * not survive such relicensing or conveying. + * + * If you add terms to a covered work in accord with this section, you + * must place, in the relevant source files, a statement of the + * additional terms that apply to those files, or a notice indicating + * where to find the applicable terms. + * + * Additional terms, permissive or non-permissive, may be stated in the + * form of a separately written license, or stated as exceptions; + * the above requirements apply either way. + * + * 8. Termination. + * + * You may not propagate or modify a covered work except as expressly + * provided under this License. Any attempt otherwise to propagate or + * modify it is void, and will automatically terminate your rights under + * this License (including any patent licenses granted under the third + * paragraph of section 11). + * + * However, if you cease all violation of this License, then your + * license from a particular copyright holder is reinstated (a) + * provisionally, unless and until the copyright holder explicitly and + * finally terminates your license, and (b) permanently, if the copyright + * holder fails to notify you of the violation by some reasonable means + * prior to 60 days after the cessation. + * + * Moreover, your license from a particular copyright holder is + * reinstated permanently if the copyright holder notifies you of the + * violation by some reasonable means, this is the first time you have + * received notice of violation of this License (for any work) from that + * copyright holder, and you cure the violation prior to 30 days after + * your receipt of the notice. + * + * Termination of your rights under this section does not terminate the + * licenses of parties who have received copies or rights from you under + * this License. If your rights have been terminated and not permanently + * reinstated, you do not qualify to receive new licenses for the same + * material under section 10. + * + * 9. Acceptance Not Required for Having Copies. + * + * You are not required to accept this License in order to receive or + * run a copy of the Program. Ancillary propagation of a covered work + * occurring solely as a consequence of using peer-to-peer transmission + * to receive a copy likewise does not require acceptance. However, + * nothing other than this License grants you permission to propagate or + * modify any covered work. These actions infringe copyright if you do + * not accept this License. Therefore, by modifying or propagating a + * covered work, you indicate your acceptance of this License to do so. + * + * 10. Automatic Licensing of Downstream Recipients. + * + * Each time you convey a covered work, the recipient automatically + * receives a license from the original licensors, to run, modify and + * propagate that work, subject to this License. You are not responsible + * for enforcing compliance by third parties with this License. + * + * An "entity transaction" is a transaction transferring control of an + * organization, or substantially all assets of one, or subdividing an + * organization, or merging organizations. If propagation of a covered + * work results from an entity transaction, each party to that + * transaction who receives a copy of the work also receives whatever + * licenses to the work the party's predecessor in interest had or could + * give under the previous paragraph, plus a right to possession of the + * Corresponding Source of the work from the predecessor in interest, if + * the predecessor has it or can get it with reasonable efforts. + * + * You may not impose any further restrictions on the exercise of the + * rights granted or affirmed under this License. For example, you may + * not impose a license fee, royalty, or other charge for exercise of + * rights granted under this License, and you may not initiate litigation + * (including a cross-claim or counterclaim in a lawsuit) alleging that + * any patent claim is infringed by making, using, selling, offering for + * sale, or importing the Program or any portion of it. + * + * 11. Patents. + * + * A "contributor" is a copyright holder who authorizes use under this + * License of the Program or a work on which the Program is based. The + * work thus licensed is called the contributor's "contributor version". + * + * A contributor's "essential patent claims" are all patent claims + * owned or controlled by the contributor, whether already acquired or + * hereafter acquired, that would be infringed by some manner, permitted + * by this License, of making, using, or selling its contributor version, + * but do not include claims that would be infringed only as a + * consequence of further modification of the contributor version. For + * purposes of this definition, "control" includes the right to grant + * patent sublicenses in a manner consistent with the requirements of + * this License. + * + * Each contributor grants you a non-exclusive, worldwide, royalty-free + * patent license under the contributor's essential patent claims, to + * make, use, sell, offer for sale, import and otherwise run, modify and + * propagate the contents of its contributor version. + * + * In the following three paragraphs, a "patent license" is any express + * agreement or commitment, however denominated, not to enforce a patent + * (such as an express permission to practice a patent or covenant not to + * sue for patent infringement). To "grant" such a patent license to a + * party means to make such an agreement or commitment not to enforce a + * patent against the party. + * + * If you convey a covered work, knowingly relying on a patent license, + * and the Corresponding Source of the work is not available for anyone + * to copy, free of charge and under the terms of this License, through a + * publicly available network server or other readily accessible means, + * then you must either (1) cause the Corresponding Source to be so + * available, or (2) arrange to deprive yourself of the benefit of the + * patent license for this particular work, or (3) arrange, in a manner + * consistent with the requirements of this License, to extend the patent + * license to downstream recipients. "Knowingly relying" means you have + * actual knowledge that, but for the patent license, your conveying the + * covered work in a country, or your recipient's use of the covered work + * in a country, would infringe one or more identifiable patents in that + * country that you have reason to believe are valid. + * + * If, pursuant to or in connection with a single transaction or + * arrangement, you convey, or propagate by procuring conveyance of, a + * covered work, and grant a patent license to some of the parties + * receiving the covered work authorizing them to use, propagate, modify + * or convey a specific copy of the covered work, then the patent license + * you grant is automatically extended to all recipients of the covered + * work and works based on it. + * + * A patent license is "discriminatory" if it does not include within + * the scope of its coverage, prohibits the exercise of, or is + * conditioned on the non-exercise of one or more of the rights that are + * specifically granted under this License. You may not convey a covered + * work if you are a party to an arrangement with a third party that is + * in the business of distributing software, under which you make payment + * to the third party based on the extent of your activity of conveying + * the work, and under which the third party grants, to any of the + * parties who would receive the covered work from you, a discriminatory + * patent license (a) in connection with copies of the covered work + * conveyed by you (or copies made from those copies), or (b) primarily + * for and in connection with specific products or compilations that + * contain the covered work, unless you entered into that arrangement, + * or that patent license was granted, prior to 28 March 2007. + * + * Nothing in this License shall be construed as excluding or limiting + * any implied license or other defenses to infringement that may + * otherwise be available to you under applicable patent law. + * + * 12. No Surrender of Others' Freedom. + * + * If conditions are imposed on you (whether by court order, agreement or + * otherwise) that contradict the conditions of this License, they do not + * excuse you from the conditions of this License. If you cannot convey a + * covered work so as to satisfy simultaneously your obligations under this + * License and any other pertinent obligations, then as a consequence you may + * not convey it at all. For example, if you agree to terms that obligate you + * to collect a royalty for further conveying from those to whom you convey + * the Program, the only way you could satisfy both those terms and this + * License would be to refrain entirely from conveying the Program. + * + * 13. Remote Network Interaction; Use with the GNU General Public License. + * + * Notwithstanding any other provision of this License, if you modify the + * Program, your modified version must prominently offer all users + * interacting with it remotely through a computer network (if your version + * supports such interaction) an opportunity to receive the Corresponding + * Source of your version by providing access to the Corresponding Source + * from a network server at no charge, through some standard or customary + * means of facilitating copying of software. This Corresponding Source + * shall include the Corresponding Source for any work covered by version 3 + * of the GNU General Public License that is incorporated pursuant to the + * following paragraph. + * + * Notwithstanding any other provision of this License, you have + * permission to link or combine any covered work with a work licensed + * under version 3 of the GNU General Public License into a single + * combined work, and to convey the resulting work. The terms of this + * License will continue to apply to the part which is the covered work, + * but the work with which it is combined will remain governed by version + * 3 of the GNU General Public License. + * + * 14. Revised Versions of this License. + * + * The Free Software Foundation may publish revised and/or new versions of + * the GNU Affero General Public License from time to time. Such new versions + * will be similar in spirit to the present version, but may differ in detail to + * address new problems or concerns. + * + * Each version is given a distinguishing version number. If the + * Program specifies that a certain numbered version of the GNU Affero General + * Public License "or any later version" applies to it, you have the + * option of following the terms and conditions either of that numbered + * version or of any later version published by the Free Software + * Foundation. If the Program does not specify a version number of the + * GNU Affero General Public License, you may choose any version ever published + * by the Free Software Foundation. + * + * If the Program specifies that a proxy can decide which future + * versions of the GNU Affero General Public License can be used, that proxy's + * public statement of acceptance of a version permanently authorizes you + * to choose that version for the Program. + * + * Later license versions may give you additional or different + * permissions. However, no additional obligations are imposed on any + * author or copyright holder as a result of your choosing to follow a + * later version. + * + * 15. Disclaimer of Warranty. + * + * THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY + * APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT + * HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY + * OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM + * IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF + * ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + * + * 16. Limitation of Liability. + * + * IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING + * WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS + * THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY + * GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE + * USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF + * DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD + * PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), + * EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGES. + * + * 17. Interpretation of Sections 15 and 16. + * + * If the disclaimer of warranty and limitation of liability provided + * above cannot be given local legal effect according to their terms, + * reviewing courts shall apply local law that most closely approximates + * an absolute waiver of all civil liability in connection with the + * Program, unless a warranty or assumption of liability accompanies a + * copy of the Program in return for a fee. + * + * END OF TERMS AND CONDITIONS + * + * How to Apply These Terms to Your New Programs + * + * If you develop a new program, and you want it to be of the greatest + * possible use to the public, the best way to achieve this is to make it + * free software which everyone can redistribute and change under these terms. + * + * To do so, attach the following notices to the program. It is safest + * to attach them to the start of each source file to most effectively + * state the exclusion of warranty; and each file should have at least + * the "copyright" line and a pointer to where the full notice is found. + * + * + * Copyright (C) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * Also add information on how to contact you by electronic and paper mail. + * + * If your software can interact with users remotely through a computer + * network, you should also make sure that it provides a way for users to + * get its source. For example, if your program is a web application, its + * interface could display a "Source" link that leads users to an archive + * of the code. There are many ways you could offer source, and different + * solutions will be better for different programs; see section 13 for the + * specific requirements. + * + * You should also get your employer (if you work as a programmer) or school, + * if any, to sign a "copyright disclaimer" for the program, if necessary. + * For more information on this, and how to apply and follow the GNU AGPL, see + * . */ + . + ADDITIONAL THIRD PARTY NOTICES: + . + =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= /* * Copyright (c) 1990, 1993, 1994, 1995 * The Regents of the University of California. All rights reserved. diff --git a/contrib/DEBIAN/examples/zcash.conf b/contrib/DEBIAN/examples/zcash.conf new file mode 100644 index 000000000..e9935a872 --- /dev/null +++ b/contrib/DEBIAN/examples/zcash.conf @@ -0,0 +1,138 @@ +## +## zcash.conf configuration file. Lines beginning with # are comments. +## + +# Network-related settings: + +# Run on the test network instead of the real zcash network. +#testnet=0 + +# Run a regression test network +#regtest=0 + +# Connect via a SOCKS5 proxy +#proxy=127.0.0.1:9050 + +# Bind to given address and always listen on it. Use [host]:port notation for IPv6 +#bind= + +# Bind to given address and whitelist peers connecting to it. Use [host]:port notation for IPv6 +#whitebind= + +############################################################## +## Quick Primer on addnode vs connect ## +## Let's say for instance you use addnode=4.2.2.4 ## +## addnode will connect you to and tell you about the ## +## nodes connected to 4.2.2.4. In addition it will tell ## +## the other nodes connected to it that you exist so ## +## they can connect to you. ## +## connect will not do the above when you 'connect' to it. ## +## It will *only* connect you to 4.2.2.4 and no one else.## +## ## +## So if you're behind a firewall, or have other problems ## +## finding nodes, add some using 'addnode'. ## +## ## +## If you want to stay private, use 'connect' to only ## +## connect to "trusted" nodes. ## +## ## +## If you run multiple nodes on a LAN, there's no need for ## +## all of them to open lots of connections. Instead ## +## 'connect' them all to one node that is port forwarded ## +## and has lots of connections. ## +## Thanks goes to [Noodle] on Freenode. ## +############################################################## + +# Use as many addnode= settings as you like to connect to specific peers +#addnode=69.164.218.197 +#addnode=10.0.0.2:8233 + +# Alternatively use as many connect= settings as you like to connect ONLY to specific peers +#connect=69.164.218.197 +#connect=10.0.0.1:8233 + +# Listening mode, enabled by default except when 'connect' is being used +#listen=1 + +# Maximum number of inbound+outbound connections. +#maxconnections= + +# +# JSON-RPC options (for controlling a running Zcash/zcashd process) +# + +# server=1 tells zcashd to accept JSON-RPC commands (set as default if not specified) +#server=1 + +# Bind to given address to listen for JSON-RPC connections. Use [host]:port notation for IPv6. +# This option can be specified multiple times (default: bind to all interfaces) +#rpcbind= + +# You must set rpcuser and rpcpassword to secure the JSON-RPC api +#rpcuser=Ulysses +#rpcpassword=YourSuperGreatPasswordNumber_DO_NOT_USE_THIS_OR_YOU_WILL_GET_ROBBED_385593 + +# How many seconds zcash will wait for a complete RPC HTTP request. +# after the HTTP connection is established. +#rpctimeout=30 + +# By default, only RPC connections from localhost are allowed. +# Specify as many rpcallowip= settings as you like to allow connections from other hosts, +# either as a single IPv4/IPv6 or with a subnet specification. + +# NOTE: opening up the RPC port to hosts outside your local trusted network is NOT RECOMMENDED, +# because the rpcpassword is transmitted over the network unencrypted and also because anyone +# that can authenticate on the RPC port can steal your keys + take over the account running zcashd +# For more information see https://github.com/zcash/zcash/issues/1497 + +#rpcallowip=10.1.1.34/255.255.255.0 +#rpcallowip=1.2.3.4/24 +#rpcallowip=2001:db8:85a3:0:0:8a2e:370:7334/96 + +# Listen for RPC connections on this TCP port: +#rpcport=8232 + +# You can use Zcash or zcashd to send commands to Zcash/zcashd +# running on another host using this option: +#rpcconnect=127.0.0.1 + +# Use Secure Sockets Layer (also known as TLS or HTTPS) to communicate +# with Zcash -server or zcashd +#rpcssl=1 + +# OpenSSL settings used when rpcssl=1 +#rpcsslciphers=TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH +#rpcsslcertificatechainfile=server.cert +#rpcsslprivatekeyfile=server.pem + +# Transaction Fee + +# Send transactions as zero-fee transactions if possible (default: 0) +#sendfreetransactions=0 + +# Create transactions that have enough fees (or priority) so they are likely to # begin confirmation within n blocks (default: 1). +# This setting is overridden by the -paytxfee option. +#txconfirmtarget=n + +# Miscellaneous options + +# Enable attempt to mine zcash. +#gen=0 + +# Set the number of threads to be used for mining zcash (-1 = all cores). +#genproclimit=1 + +# Specify a different Equihash solver (e.g. "tromp") to try to mine zcash +# faster when gen=1. +#equihashsolver=default + +# Pre-generate this many public/private key pairs, so wallet backups will be valid for +# both prior transactions and several dozen future transactions. +#keypool=100 + +# Pay an optional transaction fee every time you send zcash. Transactions with fees +# are more likely than free transactions to be included in generated blocks, so may +# be validated sooner. This setting does not affect private transactions created with +# 'z_sendmany'. +#paytxfee=0.00 + + diff --git a/contrib/DEBIAN/manpages/zcash-cli.1 b/contrib/DEBIAN/manpages/zcash-cli.1 new file mode 100644 index 000000000..985664c05 --- /dev/null +++ b/contrib/DEBIAN/manpages/zcash-cli.1 @@ -0,0 +1,77 @@ +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. +.TH ZCASH-CLI "1" "October 2016" "Zcash RPC client version v1.0.0-409dcb7" "User Commands" +.SH NAME +zcash-cli \- RPC client for the Zcash daemon +.SH DESCRIPTION +Zcash RPC client version v1.0.0 +.SS "Usage:" +.TP +zcash\-cli [options] [params] +Send command to Zcash +.TP +zcash\-cli [options] help +List commands +.TP +zcash\-cli [options] help +Get help for a command +.SH OPTIONS +.HP +\-? +.IP +This help message +.HP +\fB\-conf=\fR +.IP +Specify configuration file (default: zcash.conf) +.HP +\fB\-datadir=\fR +.IP +Specify data directory +.HP +\fB\-testnet\fR +.IP +Use the test network +.HP +\fB\-regtest\fR +.IP +Enter regression test mode, which uses a special chain in which blocks +can be solved instantly. This is intended for regression testing tools +and app development. +.HP +\fB\-rpcconnect=\fR +.IP +Send commands to node running on (default: 127.0.0.1) +.HP +\fB\-rpcport=\fR +.IP +Connect to JSON\-RPC on (default: 8232 or testnet: 18232) +.HP +\fB\-rpcwait\fR +.IP +Wait for RPC server to start +.HP +\fB\-rpcuser=\fR +.IP +Username for JSON\-RPC connections +.HP +\fB\-rpcpassword=\fR +.IP +Password for JSON\-RPC connections +.PP +SSL options: (see the Bitcoin Wiki for SSL setup instructions) +.HP +\fB\-rpcssl\fR +.IP +Use OpenSSL (https) for JSON\-RPC connections +.SH "SEE ALSO" +The full documentation for +.B Zcash +is maintained as a Texinfo manual. If the +.B info +and +.B Zcash +programs are properly installed at your site, the command +.IP +.B info Zcash +.PP +should give you access to the complete manual. diff --git a/contrib/DEBIAN/manpages/zcashd.1 b/contrib/DEBIAN/manpages/zcashd.1 new file mode 100644 index 000000000..3e1990dec --- /dev/null +++ b/contrib/DEBIAN/manpages/zcashd.1 @@ -0,0 +1,432 @@ +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. +.TH ZCASHD "1" "October 2016" "Zcash Daemon version v1.0.0-409dcb7" "User Commands" +.SH NAME +zcashd \- Network daemon for interacting with the Zcash blockchain +.SH DESCRIPTION +Zcash Daemon version v1.0.0 +.SS "Usage:" +.TP +zcashd [options] +Start Zcash Daemon +.SH OPTIONS +.HP +\-? +.IP +This help message +.HP +\fB\-alerts\fR +.IP +Receive and display P2P network alerts (default: 1) +.HP +\fB\-alertnotify=\fR +.IP +Execute command when a relevant alert is received or we see a really +long fork (%s in cmd is replaced by message) +.HP +\fB\-blocknotify=\fR +.IP +Execute command when the best block changes (%s in cmd is replaced by +block hash) +.HP +\fB\-checkblocks=\fR +.IP +How many blocks to check at startup (default: 288, 0 = all) +.HP +\fB\-checklevel=\fR +.IP +How thorough the block verification of \fB\-checkblocks\fR is (0\-4, default: 3) +.HP +\fB\-conf=\fR +.IP +Specify configuration file (default: zcash.conf) +.HP +\fB\-daemon\fR +.IP +Run in the background as a daemon and accept commands +.HP +\fB\-datadir=\fR +.IP +Specify data directory +.HP +\fB\-dbcache=\fR +.IP +Set database cache size in megabytes (4 to 16384, default: 100) +.HP +\fB\-loadblock=\fR +.IP +Imports blocks from external blk000??.dat file on startup +.HP +\fB\-maxorphantx=\fR +.IP +Keep at most unconnectable transactions in memory (default: 100) +.HP +\fB\-par=\fR +.IP +Set the number of script verification threads (\fB\-4\fR to 16, 0 = auto, <0 = +leave that many cores free, default: 0) +.HP +\fB\-pid=\fR +.IP +Specify pid file (default: zcashd.pid) +.HP +\fB\-prune=\fR +.IP +Reduce storage requirements by pruning (deleting) old blocks. This mode +disables wallet support and is incompatible with \fB\-txindex\fR. Warning: +Reverting this setting requires re\-downloading the entire blockchain. +(default: 0 = disable pruning blocks, >550 = target size in MiB to use +for block files) +.HP +\fB\-reindex\fR +.IP +Rebuild block chain index from current blk000??.dat files on startup +.HP +\fB\-sysperms\fR +.IP +Create new files with system default permissions, instead of umask 077 +(only effective with disabled wallet functionality) +.HP +\fB\-txindex\fR +.IP +Maintain a full transaction index, used by the getrawtransaction rpc +call (default: 0) +.PP +Connection options: +.HP +\fB\-addnode=\fR +.IP +Add a node to connect to and attempt to keep the connection open +.HP +\fB\-banscore=\fR +.IP +Threshold for disconnecting misbehaving peers (default: 100) +.HP +\fB\-bantime=\fR +.IP +Number of seconds to keep misbehaving peers from reconnecting (default: +86400) +.HP +\fB\-bind=\fR +.IP +Bind to given address and always listen on it. Use [host]:port notation +for IPv6 +.HP +\fB\-connect=\fR +.IP +Connect only to the specified node(s) +.HP +\fB\-discover\fR +.IP +Discover own IP addresses (default: 1 when listening and no \fB\-externalip\fR +or \fB\-proxy\fR) +.HP +\fB\-dns\fR +.IP +Allow DNS lookups for \fB\-addnode\fR, \fB\-seednode\fR and \fB\-connect\fR (default: 1) +.HP +\fB\-dnsseed\fR +.IP +Query for peer addresses via DNS lookup, if low on addresses (default: 1 +unless \fB\-connect\fR) +.HP +\fB\-externalip=\fR +.IP +Specify your own public address +.HP +\fB\-forcednsseed\fR +.IP +Always query for peer addresses via DNS lookup (default: 0) +.HP +\fB\-listen\fR +.IP +Accept connections from outside (default: 1 if no \fB\-proxy\fR or \fB\-connect\fR) +.HP +\fB\-maxconnections=\fR +.IP +Maintain at most connections to peers (default: 125) +.HP +\fB\-maxreceivebuffer=\fR +.IP +Maximum per\-connection receive buffer, *1000 bytes (default: 5000) +.HP +\fB\-maxsendbuffer=\fR +.IP +Maximum per\-connection send buffer, *1000 bytes (default: 1000) +.HP +\fB\-onion=\fR +.IP +Use separate SOCKS5 proxy to reach peers via Tor hidden services +(default: \fB\-proxy\fR) +.HP +\fB\-onlynet=\fR +.IP +Only connect to nodes in network (ipv4, ipv6 or onion) +.HP +\fB\-permitbaremultisig\fR +.IP +Relay non\-P2SH multisig (default: 1) +.HP +\fB\-port=\fR +.IP +Listen for connections on (default: 8233 or testnet: 18233) +.HP +\fB\-proxy=\fR +.IP +Connect through SOCKS5 proxy +.HP +\fB\-proxyrandomize\fR +.IP +Randomize credentials for every proxy connection. This enables Tor +stream isolation (default: 1) +.HP +\fB\-seednode=\fR +.IP +Connect to a node to retrieve peer addresses, and disconnect +.HP +\fB\-timeout=\fR +.IP +Specify connection timeout in milliseconds (minimum: 1, default: 5000) +.HP +\fB\-upnp\fR +.IP +Use UPnP to map the listening port (default: 0) +.HP +\fB\-whitebind=\fR +.IP +Bind to given address and whitelist peers connecting to it. Use +[host]:port notation for IPv6 +.HP +\fB\-whitelist=\fR +.IP +Whitelist peers connecting from the given netmask or IP address. Can be +specified multiple times. Whitelisted peers cannot be DoS banned and +their transactions are always relayed, even if they are already in the +mempool, useful e.g. for a gateway +.PP +Wallet options: +.HP +\fB\-disablewallet\fR +.IP +Do not load the wallet and disable wallet RPC calls +.HP +\fB\-keypool=\fR +.IP +Set key pool size to (default: 100) +.HP +\fB\-paytxfee=\fR +.IP +Fee (in BTC/kB) to add to transactions you send (default: 0.00) +.HP +\fB\-rescan\fR +.IP +Rescan the block chain for missing wallet transactions on startup +.HP +\fB\-salvagewallet\fR +.IP +Attempt to recover private keys from a corrupt wallet.dat on startup +.HP +\fB\-sendfreetransactions\fR +.IP +Send transactions as zero\-fee transactions if possible (default: 0) +.HP +\fB\-spendzeroconfchange\fR +.IP +Spend unconfirmed change when sending transactions (default: 1) +.HP +\fB\-txconfirmtarget=\fR +.IP +If paytxfee is not set, include enough fee so transactions begin +confirmation on average within n blocks (default: 2) +.HP +\fB\-maxtxfee=\fR +.IP +Maximum total fees to use in a single wallet transaction; setting this +too low may abort large transactions (default: 0.10) +.HP +\fB\-upgradewallet\fR +.IP +Upgrade wallet to latest format on startup +.HP +\fB\-wallet=\fR +.IP +Specify wallet file (within data directory) (default: wallet.dat) +.HP +\fB\-walletbroadcast\fR +.IP +Make the wallet broadcast transactions (default: 1) +.HP +\fB\-walletnotify=\fR +.IP +Execute command when a wallet transaction changes (%s in cmd is replaced +by TxID) +.HP +\fB\-zapwallettxes=\fR +.IP +Delete all wallet transactions and only recover those parts of the +blockchain through \fB\-rescan\fR on startup (1 = keep tx meta data e.g. +account owner and payment request information, 2 = drop tx meta data) +.PP +Debugging/Testing options: +.HP +\fB\-debug=\fR +.IP +Output debugging information (default: 0, supplying is +optional). If is not supplied, output all debugging +information. can be: addrman, alert, bench, coindb, db, lock, +rand, rpc, selectcoins, mempool, net, proxy, prune. +.HP +\fB\-gen\fR +.IP +Generate coins (default: 0) +.HP +\fB\-genproclimit=\fR +.IP +Set the number of threads for coin generation if enabled (\fB\-1\fR = all +cores, default: 1) +.HP +\fB\-equihashsolver=\fR +.IP +Specify the Equihash solver to be used if enabled (default: "default") +.HP +\fB\-help\-debug\fR +.IP +Show all debugging options (usage: \fB\-\-help\fR \fB\-help\-debug\fR) +.HP +\fB\-logips\fR +.IP +Include IP addresses in debug output (default: 0) +.HP +\fB\-logtimestamps\fR +.IP +Prepend debug output with timestamp (default: 1) +.HP +\fB\-minrelaytxfee=\fR +.IP +Fees (in BTC/Kb) smaller than this are considered zero fee for relaying +(default: 0.00005) +.HP +\fB\-printtoconsole\fR +.IP +Send trace/debug info to console instead of debug.log file +.HP +\fB\-shrinkdebugfile\fR +.IP +Shrink debug.log file on client startup (default: 1 when no \fB\-debug\fR) +.HP +\fB\-testnet\fR +.IP +Use the test network +.PP +Node relay options: +.HP +\fB\-datacarrier\fR +.IP +Relay and mine data carrier transactions (default: 1) +.HP +\fB\-datacarriersize\fR +.IP +Maximum size of data in data carrier transactions we relay and mine +(default: 80) +.PP +Block creation options: +.HP +\fB\-blockminsize=\fR +.IP +Set minimum block size in bytes (default: 0) +.HP +\fB\-blockmaxsize=\fR +.IP +Set maximum block size in bytes (default: 750000) +.HP +\fB\-blockprioritysize=\fR +.IP +Set maximum size of high\-priority/low\-fee transactions in bytes +(default: 50000) +.PP +RPC server options: +.HP +\fB\-server\fR +.IP +Accept command line and JSON\-RPC commands +.HP +\fB\-rest\fR +.IP +Accept public REST requests (default: 0) +.HP +\fB\-rpcbind=\fR +.IP +Bind to given address to listen for JSON\-RPC connections. Use +[host]:port notation for IPv6. This option can be specified multiple +times (default: bind to all interfaces) +.HP +\fB\-rpcuser=\fR +.IP +Username for JSON\-RPC connections +.HP +\fB\-rpcpassword=\fR +.IP +Password for JSON\-RPC connections +.HP +\fB\-rpcport=\fR +.IP +Listen for JSON\-RPC connections on (default: 8232 or testnet: +18232) +.HP +\fB\-rpcallowip=\fR +.IP +Allow JSON\-RPC connections from specified source. Valid for are a +single IP (e.g. 1.2.3.4), a network/netmask (e.g. 1.2.3.4/255.255.255.0) +or a network/CIDR (e.g. 1.2.3.4/24). This option can be specified +multiple times +.HP +\fB\-rpcthreads=\fR +.IP +Set the number of threads to service RPC calls (default: 4) +.HP +\fB\-rpckeepalive\fR +.IP +RPC support for HTTP persistent connections (default: 1) +.PP +RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions) +.HP +\fB\-rpcssl\fR +.IP +Use OpenSSL (https) for JSON\-RPC connections +.HP +\fB\-rpcsslcertificatechainfile=\fR +.IP +Server certificate file (default: server.cert) +.HP +\fB\-rpcsslprivatekeyfile=\fR +.IP +Server private key (default: server.pem) +.HP +\fB\-rpcsslciphers=\fR +.IP +Acceptable ciphers (default: +TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!3DES:@STRENGTH) +.SH COPYRIGHT +Copyright \(co 2009\-2016 The Bitcoin Core Developers +.br +Copyright \(co 2015\-2016 The Zcash Developers +.PP +This is experimental software. +.PP +Distributed under the MIT software license, see the accompanying file COPYING +or . +.PP +This product includes software developed by the OpenSSL Project for use in the +OpenSSL Toolkit and cryptographic software written +by Eric Young and UPnP software written by Thomas Bernard. +.SH "SEE ALSO" +The full documentation for +.B Zcash +is maintained as a Texinfo manual. If the +.B info +and +.B Zcash +programs are properly installed at your site, the command +.IP +.B info Zcash +.PP +should give you access to the complete manual. diff --git a/contrib/DEBIAN/postinst b/contrib/DEBIAN/postinst index 43294f711..2e6ff8a8d 100755 --- a/contrib/DEBIAN/postinst +++ b/contrib/DEBIAN/postinst @@ -2,8 +2,9 @@ # postinst script for zcash # # see: dh_installdeb(1) + set -e -set -x + # summary of how this script can be called: # * `configure' # * `abort-upgrade' @@ -13,9 +14,10 @@ set -x # * `abort-deconfigure' `in-favour' # `removing' # -# for details, see http://www.debian.org/doc/debian-policy/ or +# for details, see https://www.debian.org/doc/debian-policy/ or # the debian-policy package + case "$1" in configure) ;; diff --git a/contrib/DEBIAN/postrm b/contrib/DEBIAN/postrm index f397166fe..bb442a682 100755 --- a/contrib/DEBIAN/postrm +++ b/contrib/DEBIAN/postrm @@ -4,7 +4,7 @@ # see: dh_installdeb(1) set -e -#set -x + # summary of how this script can be called: # * `remove' # * `purge' @@ -15,18 +15,12 @@ set -e # * `abort-upgrade' # * `disappear' # -# for details, see http://www.debian.org/doc/debian-policy/ or +# for details, see https://www.debian.org/doc/debian-policy/ or # the debian-policy package -. /usr/share/debconf/confmodule + case "$1" in - upgrade|failed-upgrade) - ;; - - remove|abort-install|abort-upgrade|disappear) - ;; - - purge) + purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear) ;; *) diff --git a/contrib/DEBIAN/preinst b/contrib/DEBIAN/preinst index f07c5a240..7587b4a88 100755 --- a/contrib/DEBIAN/preinst +++ b/contrib/DEBIAN/preinst @@ -4,20 +4,18 @@ # see: dh_installdeb(1) set -e -#set -x + # summary of how this script can be called: # * `install' # * `install' # * `upgrade' # * `abort-upgrade' -# for details, see http://www.debian.org/doc/debian-policy/ or +# for details, see https://www.debian.org/doc/debian-policy/ or # the debian-policy package -case "$1" in - install) - ;; - upgrade) +case "$1" in + install|upgrade) ;; abort-upgrade) diff --git a/contrib/DEBIAN/prerm b/contrib/DEBIAN/prerm index 5b2697824..6a4f8c033 100755 --- a/contrib/DEBIAN/prerm +++ b/contrib/DEBIAN/prerm @@ -13,15 +13,12 @@ set -e # * `deconfigure' `in-favour' # `removing' # -# for details, see http://www.debian.org/doc/debian-policy/ or +# for details, see https://www.debian.org/doc/debian-policy/ or # the debian-policy package case "$1" in - remove|deconfigure) - ;; - - upgrade) + remove|upgrade|deconfigure) ;; failed-upgrade) diff --git a/contrib/DEBIAN/rules b/contrib/DEBIAN/rules new file mode 100755 index 000000000..b79cce595 --- /dev/null +++ b/contrib/DEBIAN/rules @@ -0,0 +1,25 @@ +#!/usr/bin/make -f +# See debhelper(7) (uncomment to enable) +# output every command that modifies files on the build system. +#export DH_VERBOSE = 1 + + +# see FEATURE AREAS in dpkg-buildflags(1) +#export DEB_BUILD_MAINT_OPTIONS = hardening=+all + +# see ENVIRONMENT in dpkg-buildflags(1) +# package maintainers to append CFLAGS +#export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic +# package maintainers to append LDFLAGS +#export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed + + +%: + dh $@ --with autotools_dev + + +# dh_make generated override targets +# This is example for Cmake (See https://bugs.debian.org/641051 ) +#override_dh_auto_configure: +# dh_auto_configure -- # -DCMAKE_LIBRARY_PATH=$(DEB_HOST_MULTIARCH) + diff --git a/contrib/DEBIAN/zcash.examples b/contrib/DEBIAN/zcash.examples new file mode 100644 index 000000000..924659c02 --- /dev/null +++ b/contrib/DEBIAN/zcash.examples @@ -0,0 +1 @@ +DEBIAN/examples/zcash.conf diff --git a/contrib/DEBIAN/zcash.manpages b/contrib/DEBIAN/zcash.manpages new file mode 100644 index 000000000..a1115f679 --- /dev/null +++ b/contrib/DEBIAN/zcash.manpages @@ -0,0 +1,2 @@ +DEBIAN/manpages/zcash-cli.1 +DEBIAN/manpages/zcashd.1 diff --git a/contrib/gitian-descriptors/gitian-linux.yml b/contrib/gitian-descriptors/gitian-linux.yml index 7a006b343..33fe21ab9 100644 --- a/contrib/gitian-descriptors/gitian-linux.yml +++ b/contrib/gitian-descriptors/gitian-linux.yml @@ -1,5 +1,5 @@ --- -name: "zcash-1.0.0-rc1" +name: "zcash-1.0.0" enable_cache: true distro: "debian" suites: diff --git a/contrib/gitian-downloader/aschildbach-key.pgp b/contrib/gitian-downloader/aschildbach-key.pgp deleted file mode 100644 index df06e19fa..000000000 Binary files a/contrib/gitian-downloader/aschildbach-key.pgp and /dev/null differ diff --git a/contrib/gitian-downloader/bluematt-key.pgp b/contrib/gitian-downloader/bluematt-key.pgp deleted file mode 100644 index 2389d4657..000000000 Binary files a/contrib/gitian-downloader/bluematt-key.pgp and /dev/null differ diff --git a/contrib/gitian-downloader/cfields-key.pgp b/contrib/gitian-downloader/cfields-key.pgp deleted file mode 100644 index 6b0bd240b..000000000 --- a/contrib/gitian-downloader/cfields-key.pgp +++ /dev/null @@ -1,52 +0,0 @@ ------BEGIN PGP PUBLIC KEY BLOCK----- -Version: GnuPG v1.4.12 (GNU/Linux) - -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 -MrD0ofsytfy1LQ== -=DE4h ------END PGP PUBLIC KEY BLOCK----- diff --git a/contrib/gitian-downloader/daira.asc b/contrib/gitian-downloader/daira.asc new file mode 100644 index 000000000..e60a2bbcb --- /dev/null +++ b/contrib/gitian-downloader/daira.asc @@ -0,0 +1,70 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: SKS 1.1.5 +Comment: Hostname: pgp.mit.edu + +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 +eCJPlVdlz6Oj1tV2kw== +=E8LJ +-----END PGP PUBLIC KEY BLOCK----- diff --git a/contrib/gitian-downloader/devrandom-key.pgp b/contrib/gitian-downloader/devrandom-key.pgp deleted file mode 100644 index 71898127b..000000000 Binary files a/contrib/gitian-downloader/devrandom-key.pgp and /dev/null differ diff --git a/contrib/gitian-downloader/fanquake-key.pgp b/contrib/gitian-downloader/fanquake-key.pgp deleted file mode 100644 index 9c03ff452..000000000 --- a/contrib/gitian-downloader/fanquake-key.pgp +++ /dev/null @@ -1,63 +0,0 @@ ------BEGIN PGP PUBLIC KEY BLOCK----- -Version: GnuPG/MacGPG2 v2.0.26 - -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 -XwbdK0Zpx/oDtRHpuDMGKJBV2LWAZYkEbFsmtg== -=3o2I ------END PGP PUBLIC KEY BLOCK----- diff --git a/contrib/gitian-downloader/gavinandresen-key.pgp b/contrib/gitian-downloader/gavinandresen-key.pgp deleted file mode 100644 index f81f44e87..000000000 Binary files a/contrib/gitian-downloader/gavinandresen-key.pgp and /dev/null differ diff --git a/contrib/gitian-downloader/jack.asc b/contrib/gitian-downloader/jack.asc new file mode 100644 index 000000000..db9967233 --- /dev/null +++ b/contrib/gitian-downloader/jack.asc @@ -0,0 +1,449 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +HifqTn/z+qdV2A== +=phy7 +-----END PGP PUBLIC KEY BLOCK----- diff --git a/contrib/gitian-downloader/jonasschnelli-key.pgp b/contrib/gitian-downloader/jonasschnelli-key.pgp deleted file mode 100644 index fe44c0fbd..000000000 Binary files a/contrib/gitian-downloader/jonasschnelli-key.pgp and /dev/null differ diff --git a/contrib/gitian-downloader/kevin.asc b/contrib/gitian-downloader/kevin.asc new file mode 100644 index 000000000..13a39ee7f --- /dev/null +++ b/contrib/gitian-downloader/kevin.asc @@ -0,0 +1,171 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +=qSqw +-----END PGP PUBLIC KEY BLOCK----- diff --git a/contrib/gitian-downloader/laanwj-key.pgp b/contrib/gitian-downloader/laanwj-key.pgp deleted file mode 100644 index 559295109..000000000 --- a/contrib/gitian-downloader/laanwj-key.pgp +++ /dev/null @@ -1,28 +0,0 @@ ------BEGIN PGP PUBLIC KEY BLOCK----- -Version: SKS 1.1.0 - -mQENBE5UtMEBCADOUz2i9l/D8xYINCmfUDnxi+DXvX5LmZ39ZdvsoE+ugO0SRRGdIHEFO2is -0xezX50wXu9aneb+tEqM0BuiLo6VxaXpxrkxHpr6c4jf37SkE/H0qsi/txEUp7337y3+4HMG -lUjiuh802I72p1qusjsKBnmnnR0rwNouTcoDmGUDh7jpKCtzFv+2TR2dRthJn7vmmjq3+bG6 -PYfqoFY1yHrAGT1lrDBULZsQ/NBLI2+J4oo2LYv3GCq8GNnzrovqvTvui50VSROhLrOe58o2 -shE+sjQShAy5wYkPt1R1fQnpfx+5vf+TPnkxVwRb3h5GhCp0YL8XC/BXsd5vM4KlVH2rABEB -AAG0K1dsYWRpbWlyIEouIHZhbiBkZXIgTGFhbiA8bGFhbndqQGdtYWlsLmNvbT6JATgEEwEC -ACIFAk5UtMECGwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEHSBCwEjRsmmy6YIAK09 -buNXyYQrJBsX16sXxEhx5QPKyF3uHJDFJv66SdnpvIkNoznsaPiRJkbTANop93FZmaGa6wVn -zGDiz7jPA8Dpxx5aAYPhIT+zPJAdXWM3wJ/Gio9besRNzniai8Lwi5MZ9R/5yFGBobm6/AcN -4sUoqA3NSV2U3I29R0Vwlzo8GVtmyi9ENSi6Oo7AcXNTRt69cxW4nAHkB+amwwDJlcAb31ex -bogYXPhScwqQZixRr+JBkKxBjkTXXnQypT4KI5SegYwQVYfyiZmDP7UHKe/u6pSKKbVphLg8 -xLB5spcXse8/a2+onrbNlw6y8TXiJ++Z54PE7zztWTXf2huakeG5AQ0ETlS0wQEIAMNO3OkP -xoPRKWzBLcI7JRITAW+HNaLTq3uN2+4WxA57DEjbL9EDoAv+7wTkDAL40f0T+xiu6GJcLFjw -GJZu/tYu7+mErHjrdo+K4suCQt7w5EXCBvOLjhW4tyYMzNx8hP+oqzOW9iEC+6VV91+DYeqt -EkJuyVXOI4vzBlTw8uGow8aMMsCq8XVvKUZFTPsjGl197Q5B3A+ZOFCR8xqiqdPjuz6MglVV -oFdDNu3EZn8zkGsQlovXoE9ndVeVzx/XMNmsxFaMYsReUs253RIf1FEfgExID0fg2OnyLCjS -2iFW1RgajS+/saIkKl+N1iuMzJA7wMAM0plhRueOG0MtZSsAEQEAAYkBHwQYAQIACQUCTlS0 -wQIbDAAKCRB0gQsBI0bJpmsDB/4waenn2CvSHXyomykfpwf5lMte1V5LvH3z5R2LY+1NopRv -LSz3iC39x69XWiTbhywDfgafnGPW4pWBOff2/bu5/A6z1Hnan1vyrRRD/hx1uMJ7S6q+bIvZ -iVIg1p0jH6tdIIhwX3cydhdRZHo7e9oSMgOUWsr6Ar59NRo9CENwGPE4U61HXfOnxWdrFWoA -XdwZczBeLxmUy6Vo6sKqv+gE4bqrtAM0sY/MsQ9cU95x+52ox/sq44lQMwd3ZBYUP7B1qbHI -hZSZuch6MLi5scLPeau0ZvCaljiaMeivP5+x0gWPRs0kI+9sZxInbqvrsJ6oOBJM3xYGhtn1 -zZ7qmZR7 -=si/k ------END PGP PUBLIC KEY BLOCK----- diff --git a/contrib/gitian-downloader/linux-download-config b/contrib/gitian-downloader/linux-download-config deleted file mode 100644 index 4c0377952..000000000 --- a/contrib/gitian-downloader/linux-download-config +++ /dev/null @@ -1,42 +0,0 @@ ---- -name: bitcoin -urls: -- http://bitcoin.org/bitcoin-latest-linux-gitian.zip -rss: -- url: - xpath: //item/link/text() - pattern: bitcoin-\d+.\d+.\d+-linux-gitian.zip -signers: - 0A82509767C7D4A5D14DA2301AE1D35043E08E54: - name: BlueMatt - key: bluematt - BF6273FAEF7CC0BA1F562E50989F6B3048A116B5: - name: Devrandom - key: devrandom - E463A93F5F3117EEDE6C7316BD02942421F4889F: - name: Luke-Jr - key: luke-jr - D762373D24904A3E42F33B08B9A408E71DAAC974: - name: "Pieter Wuille" - key: sipa - 77E72E69DA7EE0A148C06B21B34821D4944DE5F7: - name: tcatm - key: tcatm - 01CDF4627A3B88AAE4A571C87588242FBE38D3A8: - name: "Gavin Andresen" - key: gavinandresen - 71A3B16735405025D447E8F274810B012346C9A6: - name: "Wladimir J. van der Laan" - key: laanwj - AEC1884398647C47413C1C3FB1179EB7347DC10D: - name: "Warren Togami" - key: wtogami - 9692B91BBF0E8D34DFD33B1882C5C009628ECF0C: - name: michagogo - key: michagogo - E944AE667CF960B1004BC32FCA662BE18B877A60: - name: "Andreas Schildbach" - key: aschildbach - C060A6635913D98A3587D7DB1C2491FFEB0EF770: - name: "Cory Fields" - key: "cfields" diff --git a/contrib/gitian-downloader/luke-jr-key.pgp b/contrib/gitian-downloader/luke-jr-key.pgp deleted file mode 100644 index 4406e6d5b..000000000 Binary files a/contrib/gitian-downloader/luke-jr-key.pgp and /dev/null differ diff --git a/contrib/gitian-downloader/michagogo-key.pgp b/contrib/gitian-downloader/michagogo-key.pgp deleted file mode 100644 index 47bc40455..000000000 --- a/contrib/gitian-downloader/michagogo-key.pgp +++ /dev/null @@ -1,59 +0,0 @@ ------BEGIN PGP PUBLIC KEY BLOCK----- -Version: GnuPG v1.4.12 (GNU/Linux) - -mQENBFGeqJ4BCADb7SI3/+q93gIvN0AGRg9Mtz73OLIOzCHeeoyn+tp7JcYNzxkQ -9lfeXiEfn72Sh8gHkLtLIqr7HlIMo8DxSS8JPRVjlJGkNyAW4SeEwN2wNa5OV8k0 -N4jBa9a1csFyCyrEkPKvkUpBkQDvNXjNxyEhHwyZqPanKxy6NXIHOJji8ObOMQXI -T9HwJrpjRth3u4uKG968JBTEyAXAmkt0Zidl1Ykgzcedk4mJSE9uZCW8DjSv2wML -XcQz8+dYsoskT3KRdkowLHxAfj1BNyNc1+rKLghliM5vSQWi+Lbhi1Bxh4sY1UwA -lKnAGqrnAGyIvCtkwTq5QI6ufF2ZY44bvVgpABEBAAG0IU1pY2hhZ29nbyA8bWlj -aGFnb2dvQHNlcnZlci5mYWtlPokBOAQTAQIAIgUCUZ6ongIbAwYLCQgHAwIGFQgC -CQoLBBYCAwECHgECF4AACgkQgsXACWKOzwzMUAgAuqUmK10xE5C3lUym2f72z0t6 -a2NM5Wfjr9//Y1/okC36C5XAMEtN2UwckPzzJ5p5D5y5yzwfZq5Jd8Py29VQIMsV -7FbC1a0H3D+bCyX+JJ6FAmUbnWOQ/+mydYc74RvD8iwjePNT6kziZNv6dMGctJTl -0alwjtQYgyGkeYKnIxbcyjHX/IawLUrunb/6mSKun87T8+NM/omfFCTc3l8TakpM -0wyNYRiUkIfUBvB8sDUU3A80qKN/hqRKvlFu3+/kMiAc9ZYQrbmsB+sYWdmM+4zw -8NBw3yuYzWyPuoa4PR5ZmS9F11WLMR5vTRCdLudAqYsWu3LtV6vAIvlOUa2LMLRg -TWljaGFnb2dvIChSZWdpc3RlcmVkIG5pY2sgbWljaGFnb2dvIG9uIGZyZWVub2Rl -IGFzIG9mIE9jdG9iZXIgMTIsIDIwMTMpIDxtaWNoYWdvZ29Ac2VydmVyLmZha2U+ -iQE4BBMBAgAiBQJSWarzAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRCC -xcAJYo7PDA7nB/91wAiaMlU5nHLUu0anhNQbGvUdFgKK1zO90S5KzUdJcY438jcS -UJW1az8l9U9JBRIfPRYVhz/Z1TAJ+dCzD7D8BXHFeGEr0zNOh87ly9aB5du7dpN2 -oSBD6wLcJpqxt4h+XjSS2CX98/2ZIJxXENE2KySaTXP39Xl3eNwvJTUBA4XlcMey -J8KMp/IERli4H0O7vRyLgu3yYpUArTqAonzG1g2lfB35PQJfeInrRSniQ336otnZ -A8qwJ63kfUtWVDRz0g1fnvtiLGPivDJaI5hyIaUeJPaXU1+sg7YNroDu60o2NGZh -F+0IjHlvRfzzA+F9Vw38rpSqR3BmCdjf6Sv3iQEcBBABAgAGBQJSWa9/AAoJEH+r -EUJn5PoE/hgH/1T2dAthVucA/hzY0nl4SMjbg+dzNlYBq00Qwx8DRKVjk5et8+kY -oPI3DGILcr+ELnxNekeMv9WQBBtJanUh1K5ohZ6ohoR7lG18LXf5HCdspflB5Me6 -LMA6iMryEP6gIs9GFuoGe2YQavm58YrkqhcPu34dGN7kdurfEXLvDfVlh5ZbKCsP -Gyd7Pbz04SpqykgK1udiTsLVjc70Xhv+jAMqeaCugDX6TLEwjVmZH/xsyKk2Uh3V -Oib5FXADAtKH+vSqqhFpXrw7R/NaBzvCbas8l61DFHiUg1/bo8vsV8MtGcyZmzXJ -C5Gm0njtGOil/g7JF9siUrpxs9Yyt/h+T2W0W01pY2hhZ29nbyAoVXNlciBhY2Nv -dW50IG1pY2hhZ29nbyBvbiBHaXRodWIgYXMgb2YgT2N0b2JlciAxMiwgMjAxMykg -PG1pY2hhZ29nb0BzZXJ2ZXIuZmFrZT6JATcEEwECACIFAlJZqxkCGwMGCwkIBwMC -BhUIAgkKCwQWAgMBAh4BAheAAAoJEILFwAlijs8M+1AH+IU78ARblqTnJeSl0iWH -mEsg4IBK30Q6/exDAcqOEm1Yc171uw2WnGmIvPYOQqxrRTvj3LoQ816dU6jrj6vY -s+XX0R2hxy7ILh17D/3UKnHcddu7rmc7pNEqZeBXaMughqQaPOWkAIe52+qK5tsl -sWllzTYE4jo29uZ3dAtDcKEJjBo/pIXnu1GOslE1+V4X1H9WDlwrS/JXHzyDQAjt -maPR+3gNesDanhrRmrnT3ZXW2ZVd3vGBibhia8PWUhU1uwOH23ySWXncgsHH0Zad -UMjd4w3YliZP/mLn2ghAxHB70IO7lgAgN3HYZeFoufP3pcK440A+CezfQiRcjHl/ -oIkBHAQQAQIABgUCUlmvfwAKCRB/qxFCZ+T6BOq9CACItsrUZPKGeWSTkMHknMrV -K5vxIXJVCBb+Tppc0Q/J5p4EkW/RFhTwIP2zw8NLDKMh5oO9md4LXhvfIZkqQJFo -6ZtLa3Vf+Kj7uyxezBo4QHA+G7tDsRGaMKVrEMiyLCwS1+hg9VaNzsf7zmQW7mYE -vTLMHp3cVaSU7Mh2Dl8rnAaM/DpTUZQwZ+32Qrb/Z4HSa4f278iqoFpjEbBE2KCr -vT5yEVvpCZ4lwSgA2a+uTlRTvVV6NA/kpsxU64tmhuEOjy+ToDqJ8wv4mqvWZxMv -C6OhfVaXBy3U9gG8aQV0ffXGs+TbCtv8ApHd6E1/AVk0oyZGJaBVrEl688bBIWd/ -uQENBFGeqJ4BCADFmgR7oEGkFFB5qXnuNYFq1nUGDAh0dLNtAD3J6EMxUZEXdmp+ -DQHJw6/eDRQaG9EbjNZheycbVUoI8K2Y/Z268HQueGuIEIJv6cZYXoXdWCbDD4fn -HMNUX2wNlpDqWxb7PNUEtfU9hI3gmHGlr5OiEh3iV06uiZg4n2rbWPbj45m5LJzv -wpCrUA+pLcl9Xjw2cajaSTjdXHk9gvXTCo6s2ZS3/3Q4l+xuzZp1MGNzPQHASMKs -wecSJKkYg6W8I5WsVlPd9a8oQCc/Nfz7BPw31MRVR/SF5FAMqaXx5uLwghVdHB2i -cLURsOtJlCfP8W06gB7yS+MH45Jq/oxBRiJBABEBAAGJAR8EGAECAAkFAlGeqJ4C -GwwACgkQgsXACWKOzwwT4wgAy6ICcnBZ9l2jSu+ldy57F6jf5kpKZgB9NV8V2mMA -NeY1wMQ4VTVpU4t3s4E2LYtGNJNkPQVHbt1Pf4dGPasvMPaHMamgwgyqgYixqs0x -D5PdKzVrfnjwTTr/ZAFdccSPmvy5/hbY0geQ/+mzdbL07+xaT58JIoG5nySDKhmC -VeOvhDZtXMVAhEWBDPEgh/H9sEuBgMgZrzfE1j3q802qiXeQs6WtadWlQ1RN9Iq1 -ZzIi6u9/BifEIRI0pO/WwKOZdXLTemFUoakoe7uT3A74N96t0G9LZVihYbEoO+Pc -5IaHPBV5VLeR3TB1LnnjHVf/Fwi8cnGy50kNWjcbMyEDag== -=jyQ4 ------END PGP PUBLIC KEY BLOCK----- diff --git a/contrib/gitian-downloader/nathan.asc b/contrib/gitian-downloader/nathan.asc new file mode 100644 index 000000000..2a2be1ee9 --- /dev/null +++ b/contrib/gitian-downloader/nathan.asc @@ -0,0 +1,52 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1 + +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 +JfmuGLm2Czs= +=kUB4 +-----END PGP PUBLIC KEY BLOCK----- diff --git a/contrib/gitian-downloader/sean.asc b/contrib/gitian-downloader/sean.asc new file mode 100644 index 000000000..9b710ff5f --- /dev/null +++ b/contrib/gitian-downloader/sean.asc @@ -0,0 +1,51 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v2 + +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 +=0DUx +-----END PGP PUBLIC KEY BLOCK----- diff --git a/contrib/gitian-downloader/simon.asc b/contrib/gitian-downloader/simon.asc new file mode 100644 index 000000000..3cbf0f57c --- /dev/null +++ b/contrib/gitian-downloader/simon.asc @@ -0,0 +1,47 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: SKS 1.1.5 +Comment: Hostname: pgp.mit.edu + +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 +=nZf9 +-----END PGP PUBLIC KEY BLOCK----- diff --git a/contrib/gitian-downloader/sipa-key.pgp b/contrib/gitian-downloader/sipa-key.pgp deleted file mode 100644 index ffa09bb4a..000000000 Binary files a/contrib/gitian-downloader/sipa-key.pgp and /dev/null differ diff --git a/contrib/gitian-downloader/tcatm-key.pgp b/contrib/gitian-downloader/tcatm-key.pgp deleted file mode 100644 index baaec76b8..000000000 Binary files a/contrib/gitian-downloader/tcatm-key.pgp and /dev/null differ diff --git a/contrib/gitian-downloader/win32-download-config b/contrib/gitian-downloader/win32-download-config deleted file mode 100644 index 083bce5de..000000000 --- a/contrib/gitian-downloader/win32-download-config +++ /dev/null @@ -1,42 +0,0 @@ ---- -name: bitcoin -urls: -- http://bitcoin.org/bitcoin-latest-win32-gitian.zip -rss: -- url: - xpath: //item/link/text() - pattern: bitcoin-\d+.\d+.\d+-win32-gitian.zip -signers: - 0A82509767C7D4A5D14DA2301AE1D35043E08E54: - name: BlueMatt - key: bluematt - BF6273FAEF7CC0BA1F562E50989F6B3048A116B5: - name: Devrandom - key: devrandom - E463A93F5F3117EEDE6C7316BD02942421F4889F: - name: Luke-Jr - key: luke-jr - D762373D24904A3E42F33B08B9A408E71DAAC974: - name: "Pieter Wuille" - key: sipa - 77E72E69DA7EE0A148C06B21B34821D4944DE5F7: - name: tcatm - key: tcatm - 01CDF4627A3B88AAE4A571C87588242FBE38D3A8: - name: "Gavin Andresen" - key: gavinandresen - 71A3B16735405025D447E8F274810B012346C9A6: - name: "Wladimir J. van der Laan" - key: laanwj - AEC1884398647C47413C1C3FB1179EB7347DC10D: - name: "Warren Togami" - key: wtogami - 9692B91BBF0E8D34DFD33B1882C5C009628ECF0C: - name: michagogo - key: michagogo - E944AE667CF960B1004BC32FCA662BE18B877A60: - name: "Andreas Schildbach" - key: aschildbach - C060A6635913D98A3587D7DB1C2491FFEB0EF770: - name: "Cory Fields" - key: "cfields" diff --git a/contrib/gitian-downloader/wtogami-key.pgp b/contrib/gitian-downloader/wtogami-key.pgp deleted file mode 100644 index e0f6c4c5f..000000000 --- a/contrib/gitian-downloader/wtogami-key.pgp +++ /dev/null @@ -1,131 +0,0 @@ ------BEGIN PGP PUBLIC KEY BLOCK----- -Version: GnuPG v1.4.13 (GNU/Linux) - -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 -=icdI ------END PGP PUBLIC KEY BLOCK----- diff --git a/depends/Makefile b/depends/Makefile index 2b2538f95..3d8dd25ca 100644 --- a/depends/Makefile +++ b/depends/Makefile @@ -8,7 +8,7 @@ NO_WALLET ?= NO_UPNP ?= FALLBACK_DOWNLOAD_PATH ?= https://z.cash/depends-sources -BUILD = $(shell ./config.guess) +BUILD ?= $(shell ./config.guess) HOST ?= $(BUILD) PATCHES_PATH = $(BASEDIR)/patches BASEDIR = $(CURDIR) diff --git a/depends/packages/bdb.mk b/depends/packages/bdb.mk index d0565c880..df5df6bde 100644 --- a/depends/packages/bdb.mk +++ b/depends/packages/bdb.mk @@ -1,8 +1,8 @@ package=bdb -$(package)_version=5.3.28 +$(package)_version=6.2.23 $(package)_download_path=http://download.oracle.com/berkeley-db $(package)_file_name=db-$($(package)_version).tar.gz -$(package)_sha256_hash=e0a992d740709892e81f9d93f06daf305cf73fb81b545afe72478043172c3628 +$(package)_sha256_hash=47612c8991aa9ac2f6be721267c8d3cdccf5ac83105df8e50809daea24e95dc7 $(package)_build_subdir=build_unix define $(package)_set_vars @@ -16,7 +16,7 @@ define $(package)_config_cmds endef define $(package)_build_cmds - $(MAKE) libdb_cxx-5.3.a libdb-5.3.a + $(MAKE) libdb_cxx-6.2.a libdb-6.2.a endef define $(package)_stage_cmds diff --git a/depends/packages/boost.mk b/depends/packages/boost.mk index ee0095d40..7303821be 100644 --- a/depends/packages/boost.mk +++ b/depends/packages/boost.mk @@ -3,7 +3,7 @@ $(package)_version=1_62_0 $(package)_download_path=http://sourceforge.net/projects/boost/files/boost/1.62.0 $(package)_file_name=$(package)_$($(package)_version).tar.bz2 $(package)_sha256_hash=36c96b0f6155c98404091d8ceb48319a28279ca0333fba1ad8611eb90afb2ca0 -$(package)_patches=deprecated_auto_ptr.patch +$(package)_patches=deprecated_auto_ptr.patch include_poll.patch define $(package)_set_vars $(package)_config_opts_release=variant=release @@ -27,7 +27,8 @@ endef define $(package)_preprocess_cmds echo "using $(boost_toolset_$(host_os)) : : $($(package)_cxx) : \"$($(package)_cxxflags) $($(package)_cppflags)\" \"$($(package)_ldflags)\" \"$(boost_archiver_$(host_os))\" \"$(host_STRIP)\" \"$(host_RANLIB)\" \"$(host_WINDRES)\" : ;" > user-config.jam && \ - patch -p1 < $($(package)_patch_dir)/deprecated_auto_ptr.patch + patch -p1 < $($(package)_patch_dir)/deprecated_auto_ptr.patch && \ + patch -p1 < $($(package)_patch_dir)/include_poll.patch endef define $(package)_config_cmds diff --git a/depends/packages/libgmp.mk b/depends/packages/libgmp.mk index cf3dfc0f7..2e55b05f6 100644 --- a/depends/packages/libgmp.mk +++ b/depends/packages/libgmp.mk @@ -7,7 +7,7 @@ $(package)_dependencies= $(package)_config_opts=--enable-cxx --disable-shared define $(package)_config_cmds - $($(package)_autoconf) + $($(package)_autoconf) --host=$(host) --build=$(build) endef define $(package)_build_cmds diff --git a/depends/packages/libsnark.mk b/depends/packages/libsnark.mk index 15435739d..60e535b31 100644 --- a/depends/packages/libsnark.mk +++ b/depends/packages/libsnark.mk @@ -9,7 +9,7 @@ $(package)_git_commit=2e6314a9f7efcd9af1c77669d7d9a229df86a777 $(package)_dependencies=libgmp libsodium define $(package)_build_cmds - CXXFLAGS="-fPIC -DBINARY_OUTPUT -DNO_PT_COMPRESSION=1" $(MAKE) lib DEPINST=$(host_prefix) CURVE=ALT_BN128 MULTICORE=1 NO_PROCPS=1 NO_GTEST=1 NO_DOCS=1 STATIC=1 NO_SUPERCOP=1 FEATUREFLAGS=-DMONTGOMERY_OUTPUT + CXXFLAGS="-fPIC -DBINARY_OUTPUT -DNO_PT_COMPRESSION=1" $(MAKE) lib DEPINST=$(host_prefix) CURVE=ALT_BN128 MULTICORE=1 NO_PROCPS=1 NO_GTEST=1 NO_DOCS=1 STATIC=1 NO_SUPERCOP=1 FEATUREFLAGS=-DMONTGOMERY_OUTPUT OPTFLAGS="-O2 -march=x86-64" endef define $(package)_stage_cmds diff --git a/depends/patches/boost/include_poll.patch b/depends/patches/boost/include_poll.patch new file mode 100644 index 000000000..b7e544b5f --- /dev/null +++ b/depends/patches/boost/include_poll.patch @@ -0,0 +1,11 @@ +--- boost_1_62_0-orig/boost/asio/detail/socket_types.hpp 2016-09-21 15:33:21.000000000 +0100 ++++ boost_1_62_0/boost/asio/detail/socket_types.hpp 2016-10-18 03:08:41.712254217 +0100 +@@ -58,7 +58,7 @@ + #else + # include + # if !defined(__SYMBIAN32__) +-# include ++# include + # endif + # include + # include diff --git a/doc/README.md b/doc/README.md deleted file mode 100644 index 004348832..000000000 --- a/doc/README.md +++ /dev/null @@ -1,20 +0,0 @@ -Zcash Core 1.0.0-beta2 -==================== - -[Zcash](https://z.cash/) is the Zcash client. It downloads and stores the entire history of Zcash transactions; depending on the speed of your computer and network connection, the synchronization process could take a day or more once the blockchain has reached a significant size. - -### Need Help? - -* See the documentation at the [Zcash Wiki](https://github.com/zcash/zcash/wiki) for help and more information. NOTE: Other documentation in this directory may be out of date and inaccurate. -* Ask for help on the [Zcash](https://forum.z.cash/) forums. - -Building --------- - -Build Zcash along with most dependencies from source by running ./zcutil/build.sh. Currently only Linux is supported. - -License ---------------------- -Distributed under the [MIT software license](http://www.opensource.org/licenses/mit-license.php). -This product includes software developed by the OpenSSL Project for use in the [OpenSSL Toolkit](https://www.openssl.org/). This product includes -cryptographic software written by Eric Young ([eay@cryptsoft.com](mailto:eay@cryptsoft.com)), and UPnP software written by Thomas Bernard. diff --git a/doc/bips.md b/doc/bips.md deleted file mode 100644 index e8ed0f1de..000000000 --- a/doc/bips.md +++ /dev/null @@ -1,20 +0,0 @@ -*** Warning: This document has not been updated for Zcash and may be inaccurate. *** - -BIPs that are implemented by Bitcoin Core (up-to-date up to **v0.10.0**): - -* [`BIP 11`](https://github.com/bitcoin/bips/blob/master/bip-0011.mediawiki): Multisig outputs are standard since **v0.6.0** ([PR #669](https://github.com/bitcoin/bitcoin/pull/669)). -* [`BIP 13`](https://github.com/bitcoin/bips/blob/master/bip-0013.mediawiki): The address format for P2SH addresses has been implemented since **v0.6.0** ([PR #669](https://github.com/bitcoin/bitcoin/pull/669)). -* [`BIP 14`](https://github.com/bitcoin/bips/blob/master/bip-0014.mediawiki): The subversion string is being used as User Agent since **v0.6.0** ([PR #669](https://github.com/bitcoin/bitcoin/pull/669)). -* [`BIP 16`](https://github.com/bitcoin/bips/blob/master/bip-0016.mediawiki): The pay-to-script-hash evaluation rules have been implemented since **v0.6.0**, and took effect on *April 1st 2012* ([PR #748](https://github.com/bitcoin/bitcoin/pull/748)). -* [`BIP 21`](https://github.com/bitcoin/bips/blob/master/bip-0021.mediawiki): The URI format for Bitcoin payments has been implemented since **v0.6.0** ([PR #176](https://github.com/bitcoin/bitcoin/pull/176)). -* [`BIP 22`](https://github.com/bitcoin/bips/blob/master/bip-0022.mediawiki): The 'getblocktemplate' (GBT) RPC protocol for mining has been implemented since **v0.7.0** ([PR #936](https://github.com/bitcoin/bitcoin/pull/936)). -* [`BIP 23`](https://github.com/bitcoin/bips/blob/master/bip-0023.mediawiki): Some extensions to GBT have been implemented since **v0.10.0rc1**, including longpolling and block proposals ([PR #1816](https://github.com/bitcoin/bitcoin/pull/1816)). -* [`BIP 30`](https://github.com/bitcoin/bips/blob/master/bip-0030.mediawiki): The evaluation rules to forbid creating new transactions with the same txid as previous not-fully-spent transactions were implemented since **v0.6.0**, and the rule took effect on *March 15th 2012* ([PR #915](https://github.com/bitcoin/bitcoin/pull/915)). -* [`BIP 31`](https://github.com/bitcoin/bips/blob/master/bip-0031.mediawiki): The 'pong' protocol message (and the protocol version bump to 60001) has been implemented since **v0.6.1** ([PR #1081](https://github.com/bitcoin/bitcoin/pull/1081)). -* [`BIP 34`](https://github.com/bitcoin/bips/blob/master/bip-0034.mediawiki): The rule that requires blocks to contain their height (number) in the coinbase input, and the introduction of version 2 blocks has been implemented since **v0.7.0**. The rule took effect for version 2 blocks as of *block 224413* (March 5th 2013), and version 1 blocks are no longer allowed since *block 227931* (March 25th 2013) ([PR #1526](https://github.com/bitcoin/bitcoin/pull/1526)). -* [`BIP 35`](https://github.com/bitcoin/bips/blob/master/bip-0035.mediawiki): The 'mempool' protocol message (and the protocol version bump to 60002) has been implemented since **v0.7.0** ([PR #1641](https://github.com/bitcoin/bitcoin/pull/1641)). -* [`BIP 37`](https://github.com/bitcoin/bips/blob/master/bip-0037.mediawiki): The bloom filtering for transaction relaying, partial merkle trees for blocks, and the protocol version bump to 70001 (enabling low-bandwidth SPV clients) has been implemented since **v0.8.0** ([PR #1795](https://github.com/bitcoin/bitcoin/pull/1795)). -* [`BIP 42`](https://github.com/bitcoin/bips/blob/master/bip-0042.mediawiki): The bug that would have caused the subsidy schedule to resume after block 13440000 was fixed in **v0.9.2** ([PR #3842](https://github.com/bitcoin/bitcoin/pull/3842)). -* [`BIP 61`](https://github.com/bitcoin/bips/blob/master/bip-0061.mediawiki): The 'reject' protocol message (and the protocol version bump to 70002) was added in **v0.9.0** ([PR #3185](https://github.com/bitcoin/bitcoin/pull/3185)). -* [`BIP 66`](https://github.com/bitcoin/bips/blob/master/bip-0066.mediawiki): The strict DER rules and associated version 3 blocks have been implemented since **v0.10.0** ([PR #5713](https://github.com/bitcoin/bitcoin/pull/5713)). -* [`BIP 70`](https://github.com/bitcoin/bips/blob/master/bip-0070.mediawiki) [`71`](https://github.com/bitcoin/bips/blob/master/bip-0071.mediawiki) [`72`](https://github.com/bitcoin/bips/blob/master/bip-0072.mediawiki): Payment Protocol support has been available in Bitcoin Core GUI since **v0.9.0** ([PR #5216](https://github.com/bitcoin/bitcoin/pull/5216)). diff --git a/doc/developer-notes.md b/doc/developer-notes.md index 27e011f76..9cac27467 100644 --- a/doc/developer-notes.md +++ b/doc/developer-notes.md @@ -1,5 +1,3 @@ -*** Warning: This document has not been updated for Zcash and may be inaccurate. *** - Coding ==================== @@ -112,7 +110,7 @@ to see it. **testnet and regtest modes** -Run with the -testnet option to run with "play bitcoins" on the test network, if you +Run with the -testnet option to run with "play zcash" on the test network, if you are testing multi-machine code that needs to operate across the internet. If you are testing something that can run on one machine, run with the -regtest option. @@ -121,7 +119,7 @@ that run in -regtest mode. **DEBUG_LOCKORDER** -Bitcoin Core is a multithreaded application, and deadlocks or other multithreading bugs +Zcash is a multithreaded application, and deadlocks or other multithreading bugs can be very difficult to track down. Compiling with -DDEBUG_LOCKORDER (configure CXXFLAGS="-DDEBUG_LOCKORDER -g") inserts run-time checks to keep track of which locks are held, and adds warnings to the debug.log file if inconsistencies are detected. @@ -170,7 +168,7 @@ Threads - ThreadRPCServer : Remote procedure call handler, listens on port 8232 for connections and services them. -- BitcoinMiner : Generates bitcoins (if wallet is enabled). +- ZcashMiner : Generates zcash (if wallet is enabled). - Shutdown : Does an orderly shutdown of everything. diff --git a/doc/dnsseed-policy.md b/doc/dnsseed-policy.md index deafd0bf7..90fead217 100644 --- a/doc/dnsseed-policy.md +++ b/doc/dnsseed-policy.md @@ -1,16 +1,14 @@ -*** Warning: This document has not been updated for Zcash and may be inaccurate. *** - Expectations for DNS Seed operators ==================================== -Bitcoin Core attempts to minimize the level of trust in DNS seeds, +Zcash attempts to minimize the level of trust in DNS seeds, but DNS seeds still pose a small amount of risk for the network. As such, DNS seeds must be run by entities which have some minimum -level of trust within the Bitcoin community. +level of trust within the Zcash community. -Other implementations of Bitcoin software may also use the same +Other implementations of Zcash software may also use the same seeds and may be more exposed. In light of this exposure, this -document establishes some basic expectations for operating dnsseeds. +document establishes some basic expectations for operating DNS seeds. 0. A DNS seed operating organization or person is expected to follow good host security practices, maintain control of applicable infrastructure, @@ -18,17 +16,17 @@ and not sell or transfer control of the DNS seed. Any hosting services contracted by the operator are equally expected to uphold these expectations. 1. The DNS seed results must consist exclusively of fairly selected and -functioning Bitcoin nodes from the public network to the best of the +functioning Zcash nodes from the public network to the best of the operator's understanding and capability. 2. For the avoidance of doubt, the results may be randomized but must not -single-out any group of hosts to receive different results unless due to an +single out any group of hosts to receive different results unless due to an urgent technical necessity and disclosed. 3. The results may not be served with a DNS TTL of less than one minute. 4. Any logging of DNS queries should be only that which is necessary -for the operation of the service or urgent health of the Bitcoin +for the operation of the service or urgent health of the Zcash network and must not be retained longer than necessary nor disclosed to any third party. @@ -43,14 +41,14 @@ details of their operating practices. 7. A reachable email contact address must be published for inquiries related to the DNS seed operation. -If these expectations cannot be satisfied the operator should -discontinue providing services and contact the active Bitcoin -Core development team as well as posting on -[bitcoin-dev](https://lists.linuxfoundation.org/mailman/listinfo/bitcoin-dev). +If these expectations cannot be satisfied the operator should discontinue +providing services and contact the active Zcash development team as well as +creating an issue in the [Zcash repository](https://github.com/zcash/zcash). Behavior outside of these expectations may be reasonable in some situations but should be discussed in public in advance. See also ---------- -- [bitcoin-seeder](https://github.com/sipa/bitcoin-seeder) is a reference implementation of a DNS seed. +- [zcash-seeder](https://github.com/zcash/zcash-seeder) is a reference + implementation of a DNS seed. diff --git a/doc/files.md b/doc/files.md index 4cadbde04..260d36ef3 100644 --- a/doc/files.md +++ b/doc/files.md @@ -1,28 +1,12 @@ -*** Warning: This document has not been updated for Zcash and may be inaccurate. *** - -* bitcoin.conf: contains configuration settings for bitcoind or bitcoin-qt -* bitcoind.pid: stores the process id of bitcoind while running -* blocks/blk000??.dat: block data (custom, 128 MiB per file); since 0.8.0 -* blocks/rev000??.dat; block undo data (custom); since 0.8.0 (format changed since pre-0.8) -* blocks/index/*; block index (LevelDB); since 0.8.0 -* chainstate/*; block chain state database (LevelDB); since 0.8.0 -* database/*: BDB database environment; only used for wallet since 0.8.0 +* zcash.conf: contains configuration settings for zcashd +* zcashd.pid: stores the process id of zcashd while running +* blocks/blk000??.dat: block data (custom, 128 MiB per file) +* blocks/rev000??.dat; block undo data (custom) +* blocks/index/*; block index (LevelDB) +* chainstate/*; block chain state database (LevelDB) +* database/*: BDB database environment * db.log: wallet database log file -* debug.log: contains debug information and general logging generated by bitcoind or bitcoin-qt -* fee_estimates.dat: stores statistics used to estimate minimum transaction fees and priorities required for confirmation; since 0.10.0 -* peers.dat: peer IP address database (custom format); since 0.7.0 +* debug.log: contains debug information and general logging generated by zcashd +* fee_estimates.dat: stores statistics used to estimate minimum transaction fees and priorities required for confirmation +* peers.dat: peer IP address database (custom format) * wallet.dat: personal wallet (BDB) with keys and transactions - -Only used in pre-0.8.0 ---------------------- -* blktree/*; block chain index (LevelDB); since pre-0.8, replaced by blocks/index/* in 0.8.0 -* coins/*; unspent transaction output database (LevelDB); since pre-0.8, replaced by chainstate/* in 0.8.0 - -Only used before 0.8.0 ---------------------- -* blkindex.dat: block chain index database (BDB); replaced by {chainstate/*,blocks/index/*,blocks/rev000??.dat} in 0.8.0 -* blk000?.dat: block data (custom, 2 GiB per file); replaced by blocks/blk000??.dat in 0.8.0 - -Only used before 0.7.0 ---------------------- -* addr.dat: peer IP address database (BDB); replaced by peers.dat in 0.7.0 diff --git a/doc/payment-api.md b/doc/payment-api.md index 6fb7d4cac..dd10c3497 100644 --- a/doc/payment-api.md +++ b/doc/payment-api.md @@ -18,7 +18,7 @@ When a transfer involves zaddrs, you must use the new Zcash RPC calls. Zcash supports all commands in the Bitcoin Core API (as of version 0.11.2). Where applicable, Zcash will extend commands in a backwards-compatible way to enable additional functionality. -We do not recommend use of accounts which are now deprecated in Bitcoin Core. Where the account parameter exists in the API, please use “” as its value. +We do not recommend use of accounts which are now deprecated in Bitcoin Core. Where the account parameter exists in the API, please use “” as its value, otherwise an error will be returned. To support multiple users in a single node’s wallet, consider using getnewaddress or z_getnewaddress to obtain a new address for each user. Also consider mapping multiple addresses to each user. @@ -61,7 +61,7 @@ z_listaddresses | | Returns a list of all the zaddrs in this node’s wallet for Command | Parameters | Description --- | --- | --- z_exportkey | zaddr | _Requires an unlocked wallet or an unencrypted wallet._

Return a zkey for a given zaddr belonging to the node’s wallet.

The key will be returned as a string formatted using Base58Check as described in the Zcash protocol spec.

Output:AKWUAkypwQjhZ6LLNaMuuuLcmZ6gt5UFyo8m3jGutvALmwZKLdR5 -z_importkey | zkey [rescan=true] | _Wallet must be unlocked._

Add a zkey as returned by z_exportkey to a node's wallet.

The key should be formatted using Base58Check as described in the Zcash protocol spec.

Set rescan to true (the default) to rescan the entire local block database for transactions affecting any address or pubkey script in the wallet (including transactions affecting the newly-added address for this spending key).

**NOTE:** If funds for imported keys fail to display, try stopping the node and restarting it with a `-reindex` flag. (`./src/zcashd -reindex`) +z_importkey | zkey [rescan=true] | _Wallet must be unlocked._

Add a zkey as returned by z_exportkey to a node's wallet.

The key should be formatted using Base58Check as described in the Zcash protocol spec.

Set rescan to true (the default) to rescan the entire local block database for transactions affecting any address or pubkey script in the wallet (including transactions affecting the newly-added address for this spending key). z_exportwallet | filename | _Requires an unlocked wallet or an unencrypted wallet._

Creates or overwrites a file with taddr private keys and zaddr private keys in a human-readable format.

Filename is the file in which the wallet dump will be placed. May be prefaced by an absolute file path. An existing file with that name will be overwritten.

No value is returned but a JSON-RPC error will be reported if a failure occurred. z_importwallet | filename | _Requires an unlocked wallet or an unencrypted wallet._

Imports private keys from a file in wallet export file format (see z_exportwallet). These keys will be added to the keys currently in the wallet. This call may need to rescan all or parts of the block chain for transactions affecting the newly-added keys, which may take several minutes.

Filename is the file to import. The path is relative to zcashd’s working directory.

No value is returned but a JSON-RPC error will be reported if a failure occurred. @@ -70,7 +70,7 @@ z_importwallet | filename | _Requires an unlocked wallet or an unencrypted walle Command | Parameters | Description --- | --- | --- z_listreceivedbyaddress
| zaddr [minconf=1] | Return a list of amounts received by a zaddr belonging to the node’s wallet.

Optionally set the minimum number of confirmations which a received amount must have in order to be included in the result. Use 0 to count unconfirmed transactions.

Output:
[{
“txid”: “4a0f…”,
“amount”: 0.54,
“memo”:”F0FF…”,}, {...}, {...}
] -z_sendmany
| fromaddress amounts [minconf=1] | _This is an Asynchronous RPC call_

Send funds from an address to multiple outputs. The address can be either a taddr or a zaddr.

Amounts is a list containing key/value pairs corresponding to the addresses and amount to pay. Each output address can be in taddr or zaddr format.

When sending to a zaddr, you also have the option of attaching a memo in hexadecimal format.

Example of Outputs parameter:
[{“address”:”t123…”, “amount”:0.005},
,{“address”:”z010…”,”amount”:0.03, “memo”:”f508af…”}]

Optionally set the minimum number of confirmations which a private or transparent transaction must have in order to be used as an input.

The transaction fee will be determined by the node’s wallet. Any transparent change will be sent to a new transparent address. Any private change will be sent back to the zaddr being used as the source of funds.

Returns an operationid. You use the operationid value with z_getoperationstatus and z_getoperationresult to obtain the result of sending funds, which if successful, will be a txid. +z_sendmany
| fromaddress amounts [minconf=1] | _This is an Asynchronous RPC call_

Send funds from an address to multiple outputs. The address can be either a taddr or a zaddr.

Amounts is a list containing key/value pairs corresponding to the addresses and amount to pay. Each output address can be in taddr or zaddr format.

When sending to a zaddr, you also have the option of attaching a memo in hexadecimal format.

**NOTE:**When sending coinbase funds to a zaddr, the node's wallet does not allow any change. Put another way, spending a partial amount of a coinbase utxo is not allowed. This is not a consensus rule but a local wallet rule due to the current implementation of z_sendmany. In future, this rule may be removed.

Example of Outputs parameter:
[{“address”:”t123…”, “amount”:0.005},
,{“address”:”z010…”,”amount”:0.03, “memo”:”f508af…”}]

Optionally set the minimum number of confirmations which a private or transparent transaction must have in order to be used as an input.

The transaction fee will be determined by the node’s wallet. Any transparent change will be sent to a new transparent address. Any private change will be sent back to the zaddr being used as the source of funds.

Returns an operationid. You use the operationid value with z_getoperationstatus and z_getoperationresult to obtain the result of sending funds, which if successful, will be a txid. ### Operations diff --git a/doc/release-notes/release-notes-1.0.0-rc1.md b/doc/release-notes/release-notes-1.0.0-rc1.md new file mode 100644 index 000000000..4d9763ec7 --- /dev/null +++ b/doc/release-notes/release-notes-1.0.0-rc1.md @@ -0,0 +1,121 @@ +4ZEC (1): + Correct line swap + +Cory Fields (7): + release: add _IO_stdin_used to ignored exports + release: add check-symbols and check-security make targets + release: always link librt for glibc back-compat builds + release: add security/symbol checks to gitian + depends: allow for CONFIG_SITE to be used rather than stealing prefix + gitian: use CONFIG_SITE rather than hijacking the prefix + gitian: create debug packages for linux/windows + +Daira Hopwood (6): + Fix RPC tests to not rely on accounts. + Cosmetics in RPC tests. + Fix blank lines in DEBIAN/copyright license texts. + Move the increment of nWitnessCacheSize to make the later assertions correct. + Add another assertion to narrow down where the bug occurs. + Add another assertion about the witness cache. + +Jack Grigg (25): + Update release process to sign release tags + WriteWitnessCache: Catch errors and abort transaction + Throw an RPC error for all accounts except the default + Update tests for account deprecation + Deprecated -> Unsupported in RPC error + Correct docstring + Add unit tests for WriteWitnessCache + Document CWalletTx::FindMyNotes + Refactor test to clarify expectations + Add unit test that fails when calling FindMyNotes on a locked wallet + Add RPC test showing correct handling of JS txns from blockchain + Break the RPC test by encrypting the mirroring wallet + Delay caching of nullifiers when wallet is locked + Update comments + Only ignore runtime errors caused by failed note decryption + Remaining changes from bitcoin/bitcoin#6854 + [gitian] Don't call "make check-symbols" + Fix Makefiles so "make dist" will run + Render full version correctly in configure.ac + Update libsnark to include determinism fix + Address review comments + Add more asserts to track down the bug + Increment witnesses for new transactions on rescan + Add clear error message for upgrading users + Set CBlockIndex.hashAnchor correctly in ConnectBlock + +Jay Graber (17): + Document wallet reindexing for z_importkey description in payment-api.md + Rm beta 1 release note about encrypted wallets + Note that Coinbase maturity interval does not protect JoinSplits + Refer to Zcash wiki in INSTALL + Rm bitcoin logo + Rm build-unix.md, to keep single copy of build instructions for Zcash on github wiki + Rm Bitcoin-specific documentation + Add note that document is not updated for Zcash to translation policy + Rm doc for disabled REST interface + Change alpha to beta testnet, add zcash hidden service + Improve documentation on connecting to zcash hidden server + Improve documentation on connecting to zcash hidden server + Update tor.md + Distinguish between connecting to 1 vs multiple tor nodes + Revert "Rm Bitcoin-specific documentation" + Mv btc release notes to doc/bitcoin-release-notes + Reword joinsplit anchor paragraph + +Kevin Gallagher (24): + Set wget retry options for fetching parameters + Increases timeout to 30s, wait before retry to 3s + Initial packaging for Debian + Moves zcash-fetch-params to /usr/bin + Adds newline between source and package definition + Adds copyright file back to Debian package + Updates Linux gitian descriptor file for Zcash + Updates trusty -> jessie in Gitian Linux descriptor + Adds distro: debian to gitian-linux.yml + Updates Gitian descriptor for Zcash + Removes Windows and OSX packaging from EXTRA_DIST + Moves V=1 and NO_QT=1 to MAKEOPTS + Include contrib/devtools/split-debug.sh from upstream + Adds faketime to Gitian build dependencies + Inlude crypto/equihash.tcc in list of sources for dist + Adds zcash/Zcash.h to LIBZCASH sources + Adds zcash/Proof.hpp to LIBZCASH_H + Add alertkeys.h to libbitcoin_server_a_SOURCES + Adds files in src/zcash/circuit to libzcash_a_SOURCES + Adds zcbenchmarks.h to libbitcoin_wallet_a_SOURCES + Adds json_test_vectors.h to zcash_gtest_SOURCES + Adds additional licenses to Debian copyright file + Updates Zcash Core developers -> Zcash developers + Adds . to blank lines in Google license + +MarcoFalke (3): + [gitian] Set reference date to something more recent + [gitian] Default reference_datetime to commit author date + [gitian] hardcode datetime for depends + +Sean Bowe (1): + Make 100KB transaction size limit a consensus rule, rather than a standard rule. + +Simon (11): + Add vjoinsplit to JSON output of RPC call gettransaction + Fixes #1478 by ensuring wallet tests have the -datadir environment set appropriately. + Fixes #1491 by updating help message for rpc call z_importkey + Fix incorrect check of number of parameters for z_getnewaddress. + Add tests to verify that all z_* rpc calls return an error if there are too many input parameters. + Rename client identifier from Satoshi to MagicBean (closes #1481) + Use -debug=zrpc for z_* rpc calls (#1504) + Document CWallet::GetFilteredNotes and fix return type which should be void. + Fix test so that the encrypted wallet is output to the test_bitcoin -datadir folder. + Reorder gtests in zcash-gtest. + Return improved error message when trying to spend Coinbase coins (#1373). + +Wladimir J. van der Laan (6): + devtools: add libraries for bitcoin-qt to symbol check + gitian: use trusty for building + gitian: make windows build deterministic + gitian: Need `ca-certificates` and `python` for LXC builds + build: Remove unnecessary executables from gitian release + gitian: Add --disable-bench to config flags for windows + diff --git a/doc/release-notes/release-notes-1.0.0-rc2.md b/doc/release-notes/release-notes-1.0.0-rc2.md new file mode 100644 index 000000000..27f115a75 --- /dev/null +++ b/doc/release-notes/release-notes-1.0.0-rc2.md @@ -0,0 +1,106 @@ +Daira Hopwood (22): + Add link to protocol specification. + Add tests for IsStandardTx applied to v2 transactions. + Make v2 transactions standard. This also corrects a rule about admitting large orphan transactions into the mempool, to account for v2-specific fields. + Changes to build on Alpine Linux. + Add Tromp's implementation of Equihash solver (as of tromp/equihash commit 690fc5eff453bc0c1ec66b283395c9df87701e93). + Integrate Tromp solver into miner code and remove its dependency on extra BLAKE2b implementation. + Minor edits to dnsseed-policy.md. + Avoid boost::posix_time functions that have potential out-of-bounds read bugs. ref #1459 + Add help for -equihashsolver= option. + Assert that the Equihash solver is a supported option. + Repair check-security-hardening.sh. + Revert "Avoid boost::posix_time functions that have potential out-of-bounds read bugs. ref #1459" + Fix race condition in rpc-tests/wallet_protectcoinbase.py. closes #1597 + Fix other potential race conditions similar to ref #1597 in RPC tests. + Update the error message string for tx version too low. ref #1600 + Static assertion that standard and network min tx versions are consistent. + Update comments in chainparams.cpp. + Update unit-tests documentation. closes #1530 + Address @str4d's comments on unit-tests doc. ref #1530 + Remove copyright entries for some files we deleted. + Update license text in README.md. closes #38 + Bump version numbers to 1.0.0-rc2. + +David Mercer (4): + explicitly pass HOST and BUILD to ./configure + allow both HOST and BUILD to be passed in from the zcutil/build.sh + pass in both HOST and BUILD to depends system, needed for deterministic builds + explicitly pass HOST and BUILD to libgmp ./configure + +Gregory Maxwell (1): + Only send one GetAddr response per connection. + +Jack Grigg (31): + Implement MappedShuffle for tracking the permutation of an array + Implement static method for creating a randomized JSDescription + Randomize JoinSplits in z_sendmany + Refactor test code to better test JSDescription::Randomized() + Remove stale comment + Rename libbitcoinconsensus to libzcashconsensus + Rename bitcoin-tx to zcash-tx + Remove the RC 1 block index error message + Disable wallet encryption + Add more assertions, throw if find_output params are invalid + Clear witness cache when re-witnessing notes + Add heights to log output + Throw an error when encryptwallet is disabled + Document that wallet encryption is disabled + Document another wallet encryption concern + Improve security documentation + Fix RPC tests that require wallet encryption + Add test that encryptwallet is disabled + Revert "Revert "Avoid boost::posix_time functions that have potential out-of-bounds read bugs. ref #1459"" + GBT: Support coinbasetxn instead of coinbasevalue + GBT: Add informational founders' reward value to coinbasetxn + GBT: Correct block header in proposals RPC test + GBT: Add RPC tests + Disallow v0 transactions as a consensus rule + Reject block versions lower than 4 + Regenerate genesis blocks with nVersion = 4 + Use tromp's solver to regenerate miner tests + Update tests for new genesis blocks + Enforce standard transaction rules on testnet + Update sighash tests for new consensus rule + Fix RPC test + +Jay Graber (7): + Rm bitcoin dev keys from gitian-downloader, add zcash dev keys + Rm bips.md + Update files.md for zcash + Update dnsseed-policy.md + Developer notes still relevant + Document RPC interface security assumptions in security-warnings.md + Update RPC interfaces warnings language + +Patrick Strateman (1): + CDataStream::ignore Throw exception instead of assert on negative nSize. + +Pieter Wuille (4): + Introduce constant for maximum CScript length + Treat overly long scriptPubKeys as unspendable + Fix OOM bug: UTXO entries with invalid script length + Add tests for CCoins deserialization + +Simon (17): + Fixes CID 1147436 uninitialized scalar field. + Fixes CID 1352706 uninitialized scalar field. + Fixes CID 1352698 uninitialized scalar field. + Fixes CID 1352687 uninitialized scalar field. + Fixes CID 1352715 uninitialized scalar field. + Fixes CID 1352686 uninitialized scalar variable. + Fixes CID 1352599 unitialized scalar variable + Fixes CID 1352727 uninitialized scalar variable. + Fixes CID 1352714 uninitialized scalar variable. + Add security warning about logging of z_* calls. + Add debug option "zrpcunsafe" to be used when logging more sensitive information such as the memo field of a note. + Closes #1583 by setting up the datadir for the wallet gtest. + Fix issue where z_sendmany is too strict and does not allow integer based amount e.g. 1 which is the same as 1.0 + Update test to use integer amount as well as decimal amount when calling z_sendmany + Fix build problem with coins_tests + Workaround g++ 5.x bug with brace enclosed initializer. + Patch backport of upstream 1588 as we don't (yet) use the NetMsgType namespace + +Wladimir J. van der Laan (1): + net: Ignore `notfound` P2P messages + diff --git a/doc/release-notes/release-notes-1.0.0-rc3.md b/doc/release-notes/release-notes-1.0.0-rc3.md new file mode 100644 index 000000000..863df2000 --- /dev/null +++ b/doc/release-notes/release-notes-1.0.0-rc3.md @@ -0,0 +1,51 @@ +Chirag Davé (1): + fReopenDebugLog and fRequestShutdown should be type sig_atomic_t + +Daira Hopwood (9): + Refactor README docs to avoid duplication. + Fix licensing to comply with OpenSSL and Berkeley DB licenses. + Changes to upgrade bdb to 6.2.23 + util: Update tinyformat + Tweak descriptions of mining parameters for example zcash.conf. + Update dnsseeds for mainnet. closes #1369 + Minor update to release process. + Remove the override of nMaxTipAge that effectively disables it on testnet. + Update version numbers for rc3. + +Jack Grigg (2): + Disable metrics screen in performance-measurements.sh + Link to #826 in doc/security-warnings.md, link to new Security website page + +Joe Turgeon (2): + Fixing floating point exception caused by metrics. Using default column width unless in a TTY. + Adding handling for ioctl failure. Updates from code review in PR #1615. + +Kevin Gallagher (2): + Prefer sha256sum but fall back to shasum if not available + Adds libgomp1 to Debian package depends + +Louis Nyffenegger (1): + Fix typo in README.md + +Paige Peterson (3): + add zcash.config + fix per Jack's mod suggestions + fix per Daira's suggestions + +Pieter Wuille (3): + Include signal.h for sig_atomic_t in WIN32 + Revert "Include signal.h for sig_atomic_t in WIN32" + Use std::atomic for fRequestShutdown and fReopenDebugLog + +Sean Bowe (1): + Add manpages for zcashd and zcash-cli binaries for debian. + +Simon (4): + Fix incorrect error message in z_sendmany + Add z_sendmany rule that when sending coinbase utxos to a zaddr they must be consumed entirely, without any change, since there is currently no way to specify a change address in z_sendmany. + Add assert to AsyncRPCOperation_sendmany + Bump version number in sendalert.cpp + +bitcartel (1): + Update payment-api.md + diff --git a/doc/release-notes/release-notes-1.0.0-rc4.md b/doc/release-notes/release-notes-1.0.0-rc4.md new file mode 100644 index 000000000..0a51dfb92 --- /dev/null +++ b/doc/release-notes/release-notes-1.0.0-rc4.md @@ -0,0 +1,14 @@ +Daira Hopwood (3): + Update pchMessageStart for mainnet and testnet. + Update version numbers for 1.0.0-rc4. + Add release notes for 1.0.0-rc4. + +Jack Grigg (4): + Integrate production Founders' Reward keys + Remove Founders' Reward override from #1398 + Regenerate mainnet and testnet genesis blocks for nMaxTipAge change + Update tests for new genesis blocks + +Sean Bowe (1): + Zcash zk-SNARK public parameters for 1.0 "Sprout". + diff --git a/doc/release-notes/release-notes-1.0.0.md b/doc/release-notes/release-notes-1.0.0.md new file mode 100644 index 000000000..f95d53d4e --- /dev/null +++ b/doc/release-notes/release-notes-1.0.0.md @@ -0,0 +1,18 @@ +Jack Grigg (8): + Rework zcutil/build-debian-package.sh to place files correctly + Add lintian check to zcutil/build-debian-package.sh + Fix DEBIAN/control errors raised by lintian + Build libsnark with -march=x86-64 instead of -march=native + Disable the metrics screen on regtest + Add the Zcash genesis blocks + Update tests for new genesis blocks + Update version strings to 1.0.0 + +Kevin Gallagher (6): + Use fakeroot to build Debian package + Update Debian package maintainer scripts + Fixes executable mode of maintainer scripts + Add DEBIAN/rules file (required by policy) + Adds zcash.examples and zcash.manpages + Run Lintian after built package is copied to $SRC_PATH + diff --git a/doc/release-process.md b/doc/release-process.md index 8f5e04b82..5ba8763d4 100644 --- a/doc/release-process.md +++ b/doc/release-process.md @@ -29,15 +29,18 @@ previous release: $ ZCASH_RELEASE_PREV=1.0.0-beta1 -## B. create a new release branch / github PR -### B1. update (commit) version in sources +## B. Create a new release branch / github PR +### B1. Update (commit) version in sources - doc/README.md + README.md src/clientversion.h configure.ac contrib/DEBIAN/control contrib/gitian-descriptors/gitian-linux.yml + help2man -n "RPC client for the Zcash daemon" src/zcash-cli > contrib/DEBIAN/manpages/zcash-cli.1 + help2man -n "Network daemon for interacting with the Zcash blockchain" src/zcashd > contrib/DEBIAN/manpages/zcashd.1 + In `configure.ac` and `clientversion.h`: @@ -52,7 +55,7 @@ In `configure.ac` and `clientversion.h`: - Change `CLIENT_VERSION_IS_RELEASE` to false while Zcash is in beta-test phase. -### B2. write release notes +### B2. Write release notes git shortlog helps a lot, for example: @@ -61,19 +64,21 @@ git shortlog helps a lot, for example: Update the Debian package changelog: - export DEBVERSION='1.0.0-rc1' + export DEBVERSION="${ZCASH_RELEASE}" export DEBEMAIL="${DEBEMAIL:-team@z.cash}" export DEBFULLNAME="${DEBFULLNAME:-Zcash Company}" dch -v $DEBVERSION -D jessie -c contrib/DEBIAN/changelog -### B3. change the network magics +(`dch` comes from the devscripts package.) + +### B3. Change the network magics If this release breaks backwards compatibility, change the network magic numbers. Set the four `pchMessageStart` in `CTestNetParams` in `chainparams.cpp` to random values. -### B4. merge the previous changes +### B4. Merge the previous changes Do the normal pull-request, review, testing process for this release PR. @@ -87,7 +92,7 @@ https://ci.z.cash/builders/depends-sources Run `./fetch-params.sh`. -## D. make tag for the newly merged result +## D. Make tag for the newly merged result In this example, we ensure master is up to date with the previous merged PR, then: @@ -95,7 +100,7 @@ previous merged PR, then: $ git tag -s v${ZCASH_RELEASE} $ git push origin v${ZCASH_RELEASE} -## E. deploy testnet +## E. Deploy testnet Notify the Zcash DevOps engineer/sysadmin that the release has been tagged. They update some variables in the company's automation code and then run an Ansible playbook, which: @@ -106,15 +111,20 @@ Notify the Zcash DevOps engineer/sysadmin that the release has been tagged. They Then, verify that nodes can connect to the testnet server, and update the guide on the wiki to ensure the correct hostname is listed in the recommended zcash.conf. -## F. publish the release announcement (blog, zcash-dev, slack) -## G. celebrate +## F. Update the Beta Guide +## G. Publish the release announcement (blog, zcash-dev, slack) +## H. Make and deploy deterministic builds + +- Run the [Gitian deterministic build environment](https://github.com/zcash/zcash-gitian) +- Compare the uploaded [build manifests on gitian.sigs](https://github.com/zcash/gitian.sigs) +- If all is well, the DevOps engineer will build the Debian packages and update the + [apt.z.cash package repository](https://apt.z.cash). + +## I. Celebrate + ## missing steps Zcash still needs: -* deterministic or reproducible builds - * thorough pre-release testing (presumably more thorough than standard PR tests) -* release deployment steps (eg: updating build-depends mirror, deploying testnet, etc...) - -* proper Zcash-specific versions and names in software and documentation. +* automated release deployment (e.g.: updating build-depends mirror, deploying testnet, etc...) diff --git a/doc/security-warnings.md b/doc/security-warnings.md index c5c340854..b43eed1f7 100644 --- a/doc/security-warnings.md +++ b/doc/security-warnings.md @@ -4,7 +4,9 @@ Security Warnings Security Audit -------------- -Zcash has been subjected to a formal third-party security review. For high priority security announcements, check https://z.cash. +Zcash has been subjected to a formal third-party security review. For security +announcements, audit results and other general security information, see +https://z.cash/support/security.html x86-64 Linux Only ----------------------- @@ -14,6 +16,34 @@ make proving keys generated on 64-bit systems unusable on 32-bit and big-endian systems. It's unclear if a warning will be issued in this case, or if the proving system will be silently compromised. +Wallet Encryption +----------------- + +Wallet encryption is disabled, for several reasons: + +- Encrypted wallets are unable to correctly detect shielded spends (due to the + nature of unlinkability of JoinSplits) and can incorrectly show larger + available shielded balances until the next time the wallet is unlocked. This + problem was not limited to failing to recognize the spend; it was possible for + the shown balance to increase by the amount of change from a spend, without + deducting the spent amount. + +- While encrypted wallets prevent spending of funds, they do not maintain the + shielding properties of JoinSplits (due to the need to detect spends). That + is, someone with access to an encrypted wallet.dat has full visibility of + your entire transaction graph (other than newly-detected spends, which suffer + from the earlier issue). + +- We were concerned about the resistance of the algorithm used to derive wallet + encryption keys (inherited from Bitcoin) to dictionary attacks by a powerful + attacker. If and when we re-enable wallet encryption, it is likely to be with + a modern passphrase-based key derivation algorithm designed for greater + resistance to dictionary attack, such as Argon2i. + +You should use full-disk encryption (or encryption of your home directory) to +protect your wallet at rest, and should assume (even unprivileged) users who are +runnng on your OS can read your wallet.dat file. + Side-Channel Attacks -------------------- @@ -44,9 +74,37 @@ The REST interface is a feature inherited from upstream Bitcoin. By default, it is disabled. We do not recommend you enable it until it has undergone a security review. +RPC Interface +--------------- + +Users should choose a strong RPC password. If no RPC username and password are set, zcashd will not start and will print an error message with a suggestion for a strong random password. If the client knows the RPC password, they have at least full access to the node. In addition, certain RPC commands can be misused to overwrite files and/or take over the account that is running zcashd. (In the future we may restrict these commands, but full node access – including the ability to spend from and export keys held by the wallet – would still be possible unless wallet methods are disabled.) + +Users should also refrain from changing the default setting that only allows RPC connections from localhost. Allowing connections from remote hosts would enable a MITM to execute arbitrary RPC commands, which could lead to compromise of the account running zcashd and loss of funds. For multi-user services that use one or more zcashd instances on the backend, the parameters passed in by users should be controlled to prevent confused-deputy attacks which could spend from any keys held by that zcashd. + Block Chain Reorganization: Major Differences ---------------------------------------------------- +------------------------------------------------- Users should be aware of new behavior in Zcash that differs significantly from Bitcoin: in the case of a block chain reorganization, Bitcoin's coinbase maturity rule helps to ensure that any reorganization shorter than the maturity interval will not invalidate any of the rolled-back transactions. Zcash keeps Bitcoin's 100-block maturity interval for generation transactions, but because JoinSplits must be anchored within a block, this provides more limited protection against transactions becoming invalidated. In the case of a block chain reorganization for Zcash, all JoinSplits which were anchored within the reorganization interval and any transactions that depend on them will become invalid, rolling back transactions and reverting funds to the original owner. The transaction rebroadcast mechanism inherited from Bitcoin will not successfully rebroadcast transactions depending on invalidated JoinSplits if the anchor needs to change. The creator of an invalidated JoinSplit, as well as the creators of all transactions dependent on it, must rebroadcast the transactions themselves. Receivers of funds from a JoinSplit can mitigate the risk of relying on funds received from transactions that may be rolled back by using a higher minconf (minimum number of confirmations). + +Logging z_* RPC calls +--------------------- + +The option `-debug=zrpc` covers logging of the z_* calls. This will reveal information about private notes which you might prefer not to disclose. For example, when calling `z_sendmany` to create a shielded transaction, input notes are consumed and new output notes are created. + +The option `-debug=zrpcunsafe` covers logging of sensitive information in z_* calls which you would only need for debugging and audit purposes. For example, if you want to examine the memo field of a note being spent. + +Private spending keys for z addresses are never logged. + +Potentially-Missing Required Modifications +------------------------------------------ + +In addition to potential mistakes in code we added to Bitcoin Core, and +potential mistakes in our modifications to Bitcoin Core, it is also possible +that there were potential changes we were supposed to make to Bitcoin Core but +didn't, either because we didn't even consider making those changes, or we ran +out of time. We have brainstormed and documented a variety of such possibilities +in [issue #826](https://github.com/zcash/zcash/issues/826), and believe that we +have changed or done everything that was necessary for the 1.0.0 launch. Users +may want to review this list themselves. diff --git a/doc/unit-tests.md b/doc/unit-tests.md index 687040623..97dcd701e 100644 --- a/doc/unit-tests.md +++ b/doc/unit-tests.md @@ -1,20 +1,17 @@ -*** Warning: This document has not been updated for Zcash and may be inaccurate. *** +Compiling/running automated tests +--------------------------------- -Compiling/running unit tests ------------------------------------- - -Unit tests will be automatically compiled if dependencies were met in configure +Automated tests will be automatically compiled if dependencies were met in configure and tests weren't explicitly disabled. -After configuring, they can be run with 'make check'. +There are two scripts for running tests: -To run the bitcoind tests manually, launch src/test/test_bitcoin . +* ``qa/zcash/full-test-suite.sh``, to run the main test suite +* ``qa/pull-tester/rpc-tests.sh``, to run the RPC tests. -To add more bitcoind tests, add `BOOST_AUTO_TEST_CASE` functions to the existing -.cpp files in the test/ directory or add new .cpp files that -implement new BOOST_AUTO_TEST_SUITE sections. +The main test suite uses two different testing frameworks. Tests using the Boost +framework are under ``src/test/``; tests using the Google Test/Google Mock +framework are under ``src/gtest/`` and ``src/wallet/gtest/``. The latter framework +is preferred for new Zcash unit tests. -To run the bitcoin-qt tests manually, launch src/qt/test/test_bitcoin-qt - -To add more bitcoin-qt tests, add them to the `src/qt/test/` directory and -the `src/qt/test/test_main.cpp` file. +RPC tests are implemented in Python under the ``qa/rpc-tests/`` directory. diff --git a/libbitcoinconsensus.pc.in b/libzcashconsensus.pc.in similarity index 55% rename from libbitcoinconsensus.pc.in rename to libzcashconsensus.pc.in index 3ca1696a3..5cb2d05e3 100644 --- a/libbitcoinconsensus.pc.in +++ b/libzcashconsensus.pc.in @@ -3,9 +3,9 @@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ -Name: Bitcoin Core consensus library -Description: Library for the Bitcoin consensus protocol. +Name: Zcash consensus library +Description: Library for the Zcash consensus protocol. Version: @PACKAGE_VERSION@ -Libs: -L${libdir} -lbitcoinconsensus +Libs: -L${libdir} -lzcashconsensus Cflags: -I${includedir} Requires.private: libcrypto diff --git a/qa/pull-tester/rpc-tests.sh b/qa/pull-tester/rpc-tests.sh index b44df9d7b..13ddc461f 100755 --- a/qa/pull-tester/rpc-tests.sh +++ b/qa/pull-tester/rpc-tests.sh @@ -31,6 +31,7 @@ testScripts=( 'walletbackup.py' 'zcjoinsplit.py' 'zcjoinsplitdoublespend.py' + 'getblocktemplate.py' ); testScriptsExt=( 'bipdersig-p2p.py' diff --git a/qa/rpc-tests/getblocktemplate.py b/qa/rpc-tests/getblocktemplate.py new file mode 100755 index 000000000..c9777c0c7 --- /dev/null +++ b/qa/rpc-tests/getblocktemplate.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python2 +# Copyright (c) 2016 The Zcash developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +from test_framework.test_framework import BitcoinTestFramework +from test_framework.util import * + + +class GetBlockTemplateTest(BitcoinTestFramework): + ''' + Test getblocktemplate. + ''' + + def setup_chain(self): + print("Initializing test directory "+self.options.tmpdir) + initialize_chain_clean(self.options.tmpdir, 4) + + def setup_network(self, split=False): + self.nodes = start_nodes(2, self.options.tmpdir) + connect_nodes_bi(self.nodes,0,1) + self.is_network_split=False + self.sync_all() + + def run_test(self): + node = self.nodes[0] + node.generate(1) # Mine a block to leave initial block download + + # Test 1: Default to coinbasetxn + tmpl = node.getblocktemplate() + assert('coinbasetxn' in tmpl) + assert('coinbasevalue' not in tmpl) + + # Test 2: Get coinbasetxn if requested + tmpl = node.getblocktemplate({'capabilities': ['coinbasetxn']}) + assert('coinbasetxn' in tmpl) + assert('coinbasevalue' not in tmpl) + + # Test 3: coinbasevalue not supported if requested + tmpl = node.getblocktemplate({'capabilities': ['coinbasevalue']}) + assert('coinbasetxn' in tmpl) + assert('coinbasevalue' not in tmpl) + + # Test 4: coinbasevalue not supported if both requested + tmpl = node.getblocktemplate({'capabilities': ['coinbasetxn', 'coinbasevalue']}) + assert('coinbasetxn' in tmpl) + assert('coinbasevalue' not in tmpl) + + # Test 5: General checks + tmpl = node.getblocktemplate() + assert(len(tmpl['noncerange']) == 16) + + # Test 6: coinbasetxn checks + assert('foundersreward' in tmpl['coinbasetxn']) + assert(tmpl['coinbasetxn']['required']) + +if __name__ == '__main__': + GetBlockTemplateTest().main() diff --git a/qa/rpc-tests/getblocktemplate_proposals.py b/qa/rpc-tests/getblocktemplate_proposals.py index aca0cd749..0c9e7e4cc 100755 --- a/qa/rpc-tests/getblocktemplate_proposals.py +++ b/qa/rpc-tests/getblocktemplate_proposals.py @@ -71,9 +71,11 @@ def genmrklroot(leaflist): def template_to_bytes(tmpl, txlist): blkver = pack('zaddr mytaddr = self.nodes[0].getnewaddress() myzaddr = self.nodes[0].z_getnewaddress() + + # This send will fail because our wallet does not allow any change when protecting a coinbase utxo, + # as it's currently not possible to specify a change address in z_sendmany. recipients = [] - recipients.append({"address":myzaddr, "amount":20.0}) + recipients.append({"address":myzaddr, "amount":Decimal('1.23456789')}) + errorString = "" + myopid = self.nodes[0].z_sendmany(mytaddr, recipients) + opids = [] + opids.append(myopid) + timeout = 10 + status = None + for x in xrange(1, timeout): + results = self.nodes[0].z_getoperationresult(opids) + if len(results)==0: + sleep(1) + else: + status = results[0]["status"] + errorString = results[0]["error"]["message"] + break + assert_equal("failed", status) + assert_equal("wallet does not allow any change" in errorString, True) + + # This send will succeed. We send two coinbase utxos totalling 20.0 less a fee of 0.00010000, with no change. + recipients = [] + recipients.append({"address":myzaddr, "amount": Decimal('20.0') - Decimal('0.0001')}) myopid = self.nodes[0].z_sendmany(mytaddr, recipients) self.wait_for_operationd_success(myopid) + self.sync_all() self.nodes[1].generate(1) self.sync_all() # check balances (the z_sendmany consumes 3 coinbase utxos) resp = self.nodes[0].z_gettotalbalance() - assert_equal(Decimal(resp["transparent"]), Decimal('10.0')) - assert_equal(Decimal(resp["private"]), Decimal('29.9999')) + assert_equal(Decimal(resp["transparent"]), Decimal('20.0')) + assert_equal(Decimal(resp["private"]), Decimal('19.9999')) assert_equal(Decimal(resp["total"]), Decimal('39.9999')) # convert note to transparent funds recipients = [] - recipients.append({"address":mytaddr, "amount":20.0}) + recipients.append({"address":mytaddr, "amount":Decimal('10.0')}) myopid = self.nodes[0].z_sendmany(myzaddr, recipients) self.wait_for_operationd_success(myopid) + self.sync_all() self.nodes[1].generate(1) self.sync_all() @@ -98,29 +123,30 @@ class Wallet2Test (BitcoinTestFramework): # Send will fail because send amount is too big, even when including coinbase utxos errorString = "" try: - self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 99999.0) + self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 99999) except JSONRPCException,e: errorString = e.error['message'] assert_equal("Insufficient funds" in errorString, True) # Send will fail because of insufficient funds unless sender uses coinbase utxos try: - self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 21.0) + self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 21) except JSONRPCException,e: errorString = e.error['message'] assert_equal("Insufficient funds, coinbase funds can only be spent after they have been sent to a zaddr" in errorString, True) - # Send will succeed because the balance of non-coinbase utxos is 20.0 + # Send will succeed because the balance of non-coinbase utxos is 10.0 try: - self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 19.0) + self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 9) except JSONRPCException: assert(False) - self.nodes[1].generate(10) + self.sync_all() + self.nodes[1].generate(1) self.sync_all() # check balance - assert_equal(self.nodes[2].getbalance(), Decimal('19')) + assert_equal(self.nodes[2].getbalance(), 9) if __name__ == '__main__': Wallet2Test ().main () diff --git a/qa/zcash/check-security-hardening.sh b/qa/zcash/check-security-hardening.sh index 8e36cd84d..94a87fea3 100755 --- a/qa/zcash/check-security-hardening.sh +++ b/qa/zcash/check-security-hardening.sh @@ -32,7 +32,7 @@ make -C "$REPOROOT/src" check-security test_rpath_runpath "${REPOROOT}/src/zcashd" test_rpath_runpath "${REPOROOT}/src/zcash-cli" test_rpath_runpath "${REPOROOT}/src/zcash-gtest" -test_rpath_runpath "${REPOROOT}/src/bitcoin-tx" +test_rpath_runpath "${REPOROOT}/src/zcash-tx" test_rpath_runpath "${REPOROOT}/src/test/test_bitcoin" test_rpath_runpath "${REPOROOT}/src/zcash/GenerateParams" @@ -41,6 +41,6 @@ test_rpath_runpath "${REPOROOT}/src/zcash/GenerateParams" test_fortify_source "${REPOROOT}/src/zcashd" test_fortify_source "${REPOROOT}/src/zcash-cli" test_fortify_source "${REPOROOT}/src/zcash-gtest" -test_fortify_source "${REPOROOT}/src/bitcoin-tx" +test_fortify_source "${REPOROOT}/src/zcash-tx" test_fortify_source "${REPOROOT}/src/test/test_bitcoin" test_fortify_source "${REPOROOT}/src/zcash/GenerateParams" diff --git a/qa/zcash/performance-measurements.sh b/qa/zcash/performance-measurements.sh index 1ad35b65c..2e99ab2d6 100755 --- a/qa/zcash/performance-measurements.sh +++ b/qa/zcash/performance-measurements.sh @@ -15,7 +15,7 @@ function zcashd_generate { function zcashd_start { rm -rf "$DATADIR" mkdir -p "$DATADIR" - ./src/zcashd -regtest -datadir="$DATADIR" -rpcuser=user -rpcpassword=password -rpcport=5983 & + ./src/zcashd -regtest -datadir="$DATADIR" -rpcuser=user -rpcpassword=password -rpcport=5983 -showmetrics=0 & ZCASHD_PID=$! } @@ -28,7 +28,7 @@ function zcashd_massif_start { rm -rf "$DATADIR" mkdir -p "$DATADIR" rm -f massif.out - valgrind --tool=massif --time-unit=ms --massif-out-file=massif.out ./src/zcashd -regtest -datadir="$DATADIR" -rpcuser=user -rpcpassword=password -rpcport=5983 & + valgrind --tool=massif --time-unit=ms --massif-out-file=massif.out ./src/zcashd -regtest -datadir="$DATADIR" -rpcuser=user -rpcpassword=password -rpcport=5983 -showmetrics=0 & ZCASHD_PID=$! } @@ -42,7 +42,7 @@ function zcashd_valgrind_start { rm -rf "$DATADIR" mkdir -p "$DATADIR" rm -f valgrind.out - valgrind --leak-check=yes -v --error-limit=no --log-file="valgrind.out" ./src/zcashd -regtest -datadir="$DATADIR" -rpcuser=user -rpcpassword=password -rpcport=5983 & + valgrind --leak-check=yes -v --error-limit=no --log-file="valgrind.out" ./src/zcashd -regtest -datadir="$DATADIR" -rpcuser=user -rpcpassword=password -rpcport=5983 -showmetrics=0 & ZCASHD_PID=$! } diff --git a/src/Makefile.am b/src/Makefile.am index 6152ffb40..cc6616622 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -52,10 +52,10 @@ EXTRA_LIBRARIES += libbitcoin_wallet.a endif if BUILD_BITCOIN_LIBS -lib_LTLIBRARIES = libbitcoinconsensus.la -LIBBITCOIN_CONSENSUS=libbitcoinconsensus.la +lib_LTLIBRARIES = libzcashconsensus.la +LIBZCASH_CONSENSUS=libzcashconsensus.la else -LIBBITCOIN_CONSENSUS= +LIBZCASH_CONSENSUS= endif bin_PROGRAMS = @@ -120,6 +120,7 @@ BITCOIN_CORE_H = \ main.h \ memusage.h \ merkleblock.h \ + metrics.h \ miner.h \ mruset.h \ net.h \ @@ -205,6 +206,7 @@ libbitcoin_server_a_SOURCES = \ leveldbwrapper.cpp \ main.cpp \ merkleblock.cpp \ + metrics.cpp \ miner.cpp \ net.cpp \ noui.cpp \ @@ -243,8 +245,13 @@ libbitcoin_wallet_a_SOURCES = \ $(BITCOIN_CORE_H) \ $(LIBZCASH_H) +EQUIHASH_TROMP_SOURCES = \ + pow/tromp/equi_miner.h \ + pow/tromp/equi.h \ + pow/tromp/osx_barrier.h + # crypto primitives library -crypto_libbitcoin_crypto_a_CPPFLAGS = $(BITCOIN_CONFIG_INCLUDES) +crypto_libbitcoin_crypto_a_CPPFLAGS = $(BITCOIN_CONFIG_INCLUDES) -DEQUIHASH_TROMP_ATOMIC crypto_libbitcoin_crypto_a_SOURCES = \ crypto/common.h \ crypto/equihash.cpp \ @@ -261,7 +268,8 @@ crypto_libbitcoin_crypto_a_SOURCES = \ crypto/sha256.cpp \ crypto/sha256.h \ crypto/sha512.cpp \ - crypto/sha512.h + crypto/sha512.h \ + ${EQUIHASH_TROMP_SOURCES} # univalue JSON library univalue_libbitcoin_univalue_a_SOURCES = \ @@ -393,17 +401,17 @@ komodo_cli_LDADD = \ $(LIBZCASH_LIBS) # -# bitcoin-tx binary # -bitcoin_tx_SOURCES = bitcoin-tx.cpp -bitcoin_tx_CPPFLAGS = $(BITCOIN_INCLUDES) -bitcoin_tx_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) +# zcash-tx binary # +zcash_tx_SOURCES = bitcoin-tx.cpp +zcash_tx_CPPFLAGS = $(BITCOIN_INCLUDES) +zcash_tx_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) if TARGET_WINDOWS -bitcoin_tx_SOURCES += bitcoin-tx-res.rc +zcash_tx_SOURCES += bitcoin-tx-res.rc endif -# FIXME: Is libzcash needed for bitcoin_tx? -bitcoin_tx_LDADD = \ +# FIXME: Is libzcash needed for zcash_tx? +zcash_tx_LDADD = \ $(LIBBITCOIN_UNIVALUE) \ $(LIBBITCOIN_COMMON) \ $(LIBBITCOIN_UTIL) \ @@ -412,7 +420,7 @@ bitcoin_tx_LDADD = \ $(LIBBITCOIN_CRYPTO) \ $(LIBZCASH_LIBS) -bitcoin_tx_LDADD += $(BOOST_LIBS) $(CRYPTO_LIBS) +zcash_tx_LDADD += $(BOOST_LIBS) $(CRYPTO_LIBS) # # zcash protocol primitives # @@ -440,10 +448,10 @@ libzcash_a_LDFLAGS = $(HARDENED_LDFLAGS) libzcash_a_CPPFLAGS += -DMONTGOMERY_OUTPUT -# bitcoinconsensus library # +# zcashconsensus library # if BUILD_BITCOIN_LIBS -include_HEADERS = script/bitcoinconsensus.h -libbitcoinconsensus_la_SOURCES = \ +include_HEADERS = script/zcashconsensus.h +libzcashconsensus_la_SOURCES = \ crypto/equihash.cpp \ crypto/hmac_sha512.cpp \ crypto/ripemd160.cpp \ @@ -455,19 +463,19 @@ libbitcoinconsensus_la_SOURCES = \ hash.cpp \ primitives/transaction.cpp \ pubkey.cpp \ - script/bitcoinconsensus.cpp \ + script/zcashconsensus.cpp \ script/interpreter.cpp \ script/script.cpp \ uint256.cpp \ utilstrencodings.cpp if GLIBC_BACK_COMPAT - libbitcoinconsensus_la_SOURCES += compat/glibc_compat.cpp + libzcashconsensus_la_SOURCES += compat/glibc_compat.cpp endif -libbitcoinconsensus_la_LDFLAGS = -no-undefined $(RELDFLAGS) -libbitcoinconsensus_la_LIBADD = $(CRYPTO_LIBS) -libbitcoinconsensus_la_CPPFLAGS = $(CRYPTO_CFLAGS) -I$(builddir)/obj -DBUILD_BITCOIN_INTERNAL +libzcashconsensus_la_LDFLAGS = -no-undefined $(RELDFLAGS) +libzcashconsensus_la_LIBADD = $(CRYPTO_LIBS) +libzcashconsensus_la_CPPFLAGS = $(CRYPTO_CFLAGS) -I$(builddir)/obj -DBUILD_BITCOIN_INTERNAL endif # diff --git a/src/Makefile.gtest.include b/src/Makefile.gtest.include index 531cab7a6..cee085b59 100644 --- a/src/Makefile.gtest.include +++ b/src/Makefile.gtest.include @@ -4,6 +4,8 @@ bin_PROGRAMS += komodo-gtest # tool for generating our public parameters komodo_gtest_SOURCES = \ gtest/main.cpp \ + gtest/utils.cpp \ + gtest/test_checkblock.cpp \ gtest/test_checktransaction.cpp \ gtest/json_test_vectors.cpp \ gtest/json_test_vectors.h \ @@ -17,7 +19,9 @@ komodo_gtest_SOURCES = \ gtest/test_noteencryption.cpp \ gtest/test_merkletree.cpp \ gtest/test_pow.cpp \ + gtest/test_random.cpp \ gtest/test_rpc.cpp \ + gtest/test_transaction.cpp \ gtest/test_circuit.cpp \ gtest/test_txid.cpp \ gtest/test_libzcash_utils.cpp \ diff --git a/src/Makefile.test.include b/src/Makefile.test.include index f8fd7a334..e29642805 100644 --- a/src/Makefile.test.include +++ b/src/Makefile.test.include @@ -103,7 +103,7 @@ if ENABLE_WALLET test_test_bitcoin_LDADD += $(LIBBITCOIN_WALLET) endif -test_test_bitcoin_LDADD += $(LIBBITCOIN_CONSENSUS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) $(LIBZCASH) $(LIBZCASH_LIBS) +test_test_bitcoin_LDADD += $(LIBZCASH_CONSENSUS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) $(LIBZCASH) $(LIBZCASH_LIBS) test_test_bitcoin_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) -static nodist_test_test_bitcoin_SOURCES = $(GENERATED_TEST_FILES) diff --git a/src/bitcoin-tx-res.rc b/src/bitcoin-tx-res.rc index 3e49b820b..bc8d57134 100644 --- 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", "Zcash" + VALUE "FileDescription", "zcash-tx (CLI Zcash transaction editor utility)" VALUE "FileVersion", VER_FILEVERSION_STR - VALUE "InternalName", "bitcoin-tx" + VALUE "InternalName", "zcash-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", "zcash-tx.exe" + VALUE "ProductName", "zcash-tx" VALUE "ProductVersion", VER_PRODUCTVERSION_STR END END diff --git a/src/bitcoin-tx.cpp b/src/bitcoin-tx.cpp index 19f838908..a59b95eb8 100644 --- a/src/bitcoin-tx.cpp +++ b/src/bitcoin-tx.cpp @@ -46,10 +46,10 @@ static bool AppInitRawTx(int argc, char* argv[]) if (argc<2 || mapArgs.count("-?") || mapArgs.count("-h") || mapArgs.count("-help")) { // First part of help message is specific to this utility - std::string strUsage = _("Bitcoin Core bitcoin-tx utility version") + " " + FormatFullVersion() + "\n\n" + + std::string strUsage = _("Zcash zcash-tx utility version") + " " + FormatFullVersion() + "\n\n" + _("Usage:") + "\n" + - " bitcoin-tx [options] [commands] " + _("Update hex-encoded bitcoin transaction") + "\n" + - " bitcoin-tx [options] -create [commands] " + _("Create hex-encoded bitcoin transaction") + "\n" + + " zcash-tx [options] [commands] " + _("Update hex-encoded zcash transaction") + "\n" + + " zcash-tx [options] -create [commands] " + _("Create hex-encoded zcash transaction") + "\n" + "\n"; fprintf(stdout, "%s", strUsage.c_str()); @@ -159,7 +159,7 @@ static void RegisterLoad(const string& strInput) static void MutateTxVersion(CMutableTransaction& tx, const string& cmdVal) { int64_t newVersion = atoi64(cmdVal); - if (newVersion < 1 || newVersion > CTransaction::CURRENT_VERSION) + if (newVersion < CTransaction::MIN_CURRENT_VERSION || newVersion > CTransaction::MAX_CURRENT_VERSION) throw runtime_error("Invalid TX version requested"); tx.nVersion = (int) newVersion; diff --git a/src/chain.h b/src/chain.h index e47b38568..2abb23c5a 100644 --- a/src/chain.h +++ b/src/chain.h @@ -324,11 +324,6 @@ public: READWRITE(VARINT(nDataPos)); if (nStatus & BLOCK_HAVE_UNDO) READWRITE(VARINT(nUndoPos)); - uint8_t tag = 0; - READWRITE(tag); - if (ser_action.ForRead() && tag != 0) { - assert(!"For the first time running zcashd after upgrading to v1.0.0-rc1, please use the -reindex option."); - } READWRITE(hashAnchor); // block header diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 5f71c8259..3890b2952 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -42,9 +42,7 @@ public: consensus.nMajorityEnforceBlockUpgrade = 750; consensus.nMajorityRejectBlockOutdated = 950; consensus.nMajorityWindow = 4000; - // TODO generate harder genesis block - //consensus.powLimit = uint256S("00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); - consensus.powLimit = uint256S("0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f"); + consensus.powLimit = uint256S("0007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); consensus.nPowAveragingWindow = 17; assert(maxUint/UintToArith256(consensus.powLimit) >= consensus.nPowAveragingWindow); consensus.nPowMaxAdjustDown = 32; // 32% adjustment down @@ -62,6 +60,7 @@ public: pchMessageStart[3] = 0x8d; vAlertPubKey = ParseHex("020e46e79a2a8d12b9b5d12c7a91adb4e454edfae43c0a0cb805427d2ac7613fd9"); nDefaultPort = 7770; + nMinerThreads = 0; nMaxTipAge = 24 * 60 * 60; nPruneAfterHeight = 100000; @@ -73,24 +72,22 @@ public: /** * Build the genesis block. Note that the output of its generation * transaction cannot be spent since it did not originally exist in the - * database. + * database (and is in any case of zero value). * - * CBlock(hash=000000000019d6, ver=1, hashPrevBlock=00000000000000, hashMerkleRoot=4a5e1e, nTime=1231006505, nBits=1d00ffff, nNonce=2083236893, vtx=1) - * CTransaction(hash=4a5e1e, ver=1, vin.size=1, vout.size=1, nLockTime=0) - * CTxIn(COutPoint(000000, -1), coinbase 04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73) - * CTxOut(nValue=50.00000000, scriptPubKey=0x5F1DF16B2B704C8A578D0B) - * vMerkleTree: 4a5e1e + * >>> from pyblake2 import blake2s + * >>> 'Zcash' + blake2s(b'The Economist 2016-10-29 Known unknown: Another crypto-currency is born. BTC#436254 0000000000000000044f321997f336d2908cf8c8d6893e88dbf067e2d949487d ETH#2521903 483039a6b6bd8bd05f0584f9a078d075e454925eb71c1f13eaff59b405a721bb DJIA close on 27 Oct 2016: 18,169.68').hexdigest() */ - const char* pszTimestamp = "The Times 03/Jan/2009 Chancellor on brink of second bailout for banks"; + const char* pszTimestamp = "Zcash0b9c4eef8b7cc417ee5001e3500984b6fea35683a7cac141a043c42064835d34"; CMutableTransaction txNew; txNew.vin.resize(1); txNew.vout.resize(1); - txNew.vin[0].scriptSig = CScript() << 486604799 << CScriptNum(4) << vector((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp)); - txNew.vout[0].nValue = 50 * COIN; + txNew.vin[0].scriptSig = CScript() << 520617983 << CScriptNum(4) << vector((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp)); + txNew.vout[0].nValue = 0; txNew.vout[0].scriptPubKey = CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG; genesis.vtx.push_back(txNew); genesis.hashPrevBlock.SetNull(); genesis.hashMerkleRoot = genesis.BuildMerkleTree(); + genesis.nVersion = 1; genesis.nTime = 1231006505; // TODO generate harder genesis block @@ -100,11 +97,12 @@ public: genesis.nSolution = ParseHex("000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2"); consensus.hashGenesisBlock = genesis.GetHash(); - assert(consensus.hashGenesisBlock == uint256S("0x027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71")); - assert(genesis.hashMerkleRoot == uint256S("0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b")); + assert(consensus.hashGenesisBlock == uint256S("0x00040fe8ec8471911baa1db1266ea15dd06b4a8a5c453883c000b031973dce08")); + assert(genesis.hashMerkleRoot == uint256S("0xc4eaa58879081de3c24a7b117ed2b28300e7ec4c4c1dff1d3f1268b7857a4ddb")); vFixedSeeds.clear(); vSeeds.clear(); + // TODO: set up bootstrapping for mainnet base58Prefixes[PUBKEY_ADDRESS] = std::vector(1,60); base58Prefixes[SCRIPT_ADDRESS] = std::vector(1,85); @@ -162,7 +160,7 @@ public: consensus.nMajorityEnforceBlockUpgrade = 51; consensus.nMajorityRejectBlockOutdated = 75; consensus.nMajorityWindow = 400; - consensus.powLimit = uint256S("0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f"); + consensus.powLimit = uint256S("07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); assert(maxUint/UintToArith256(consensus.powLimit) >= consensus.nPowAveragingWindow); consensus.fPowAllowMinDifficultyBlocks = true; pchMessageStart[0] = 0x5A; @@ -172,7 +170,6 @@ public: vAlertPubKey = ParseHex("00"); nDefaultPort = 17770; nMinerThreads = 0; - nMaxTipAge = 0x7fffffff; nPruneAfterHeight = 1000; //! Modify the testnet genesis block so the timestamp is valid for a later start. @@ -181,7 +178,7 @@ public: genesis.nNonce = uint256S("0x0000000000000000000000000000000000000000000000000000000000000009"); genesis.nSolution = ParseHex("003423da3e41f916bf3ff0ee770eb844a240361abe08a8c9d46bd30226e2ad411a4047b6ddc230d173c60537e470e24f764120f5a2778b2a1285b0727bf79a0b085ad67e6266fb38fd72ef17f827315c42f921720248c983d4100e6ebd1c4b5e8762a973bac3bec7f7153b93752ebbb465f0fc9520bcfc30f9abfe303627338fed6ede9cf1b9173a736cf270cf4d9c6999ff4c3a301a78fd50dab6ccca67a0c5c2e41f216a1f3efd049a74bbe6252f9773bc309d3f9e554d996913ce8e1cec672a1fa4ea59726b61ea9e75d5ce9aa5dbfa96179a293810e02787f26de324fe7c88376ff57e29574a55faff7c2946f3e40e451861c32bf67da7377de3136858a18f34fab1bc8da37726ca2c25fc7b312a5427554ec944da81c7e27255d6c94ade9987ff7daedc2d1cc63d7d4cf93e691d13326fb1c7ee72ccdc0b134eb665fc6a9821e6fef6a6d45e4aac6dca6b505a0100ad56ea4f6fa4cdc2f0d1b65f730104a515172e34163bdb422f99d083e6eb860cf6b3f66642c4dbaf0d0fa1dca1b6166f1d1ffaa55a9d6d6df628afbdd14f1622c1c8303259299521a253bc28fcc93676723158067270fc710a09155a1e50c533e9b79ed5edba4ab70a08a9a2fc0eef0ddae050d75776a9804f8d6ad7e30ccb66c6a98d86710ca7a4dfb4feb159484796b9a015c5764aa3509051c87f729b9877ea41f8b470898c01388ed9098b1e006d3c30fc6e7c781072fa3f75d918505ee8ca75840fc62f67c57060666aa42578a2dd022eda62e3f1e447d7364074d34fd60ad9b138f60422afa6cfcb913fd6c213b496144dbfda7bfc7c24540cfe40ad0c0fd5a8c0902127f53d3178ba1b2a87bf1224d53d3a15e49ccdf121ae872a011c996d1b9793153cdcd4c0a7e99f8a35669788551cca2b62769eda24b6b55e2f4e0ac0d30aa50ecf33c6cdb24adfc922006a7bf434ced800fefe814c94c6fc8caa37b372d5088bb31d2f6b11a7a67ad3f70abbac0d5c256b637828de6cc525978cf151a2e50798e0c591787639a030291272c9ced3ab7d682e03f8c7db51f60163baa85315789666ea8c5cd6f789a7f4a5de4f8a9dfefce20f353cec606492fde8eab3e3b487b3a3a57434f8cf252a4b643fc125c8a5948b06744f5dc306aa587bdc85364c7488235c6edddd78763675e50a9637181519be06dd30c4ba0d845f9ba320d01706fd6dd64d1aa3cd4211a4a7d1d3f2c1ef2766d27d5d2cdf8e7f5e3ea309d4f149bb737305df1373a7f5313abe5986f4aa620bec4b0065d48aafac3631de3771f5c4d2f6eec67b09d9c70a3c1969fecdb014cb3c69832b63cc9d6efa378bff0ef95ffacdeb1675bb326e698f022c1a3a2e1c2b0f05e1492a6d2b7552388eca7ee8a2467ef5d4207f65d4e2ae7e33f13eb473954f249d7c20158ae703e1accddd4ea899f026618695ed2949715678a32a153df32c08922fafad68b1895e3b10e143e712940104b3b352369f4fe79bd1f1dbe03ea9909dbcf5862d1f15b3d1557a6191f54c891513cdb3c729bb9ab08c0d4c35a3ed67d517ffe1e2b7a798521aed15ff9822169c0ec860d7b897340bc2ef4c37f7eb73bd7dafef12c4fd4e6f5dd3690305257ae14ed03df5e3327b68467775a90993e613173fa6650ffa2a26e84b3ce79606bf234eda9f4053307f344099e3b10308d3785b8726fd02d8e94c2759bebd05748c3fe7d5fe087dc63608fb77f29708ab167a13f32da251e249a544124ed50c270cfc6986d9d1814273d2f0510d0d2ea335817207db6a4a23ae9b079967b63b25cb3ceea7001b65b879263f5009ac84ab89738a5b8b71fd032beb9f297326f1f5afa630a5198d684514e242f315a4d95fa6802e82799a525bb653b80b4518ec610a5996403b1391"); consensus.hashGenesisBlock = genesis.GetHash(); - assert(consensus.hashGenesisBlock == uint256S("0x0cdf00b25a93ded11d73ebe1728cf7867f18e1f62aca9554b95e0f3026174e33")); + assert(consensus.hashGenesisBlock == uint256S("0x05a60a92d99d85997cce3b87616c089f6124d7342af37106edc76126334a2c38")); vFixedSeeds.clear(); vSeeds.clear(); @@ -200,7 +197,7 @@ public: fRequireRPCPassword = true; fMiningRequiresPeers = false;//true; fDefaultConsistencyChecks = false; - fRequireStandard = false; + fRequireStandard = true; fMineBlocksOnDemand = false; fTestnetToBeDeprecatedFieldRPC = true; @@ -351,14 +348,6 @@ std::string CChainParams::GetFoundersRewardAddressAtHeight(int nHeight) const { CScript CChainParams::GetFoundersRewardScriptAtHeight(int nHeight) const { assert(nHeight > 0 && nHeight <= consensus.GetLastFoundersRewardBlockHeight()); - // #1398 START - // We can remove this code when miner_tests no longer expect this script - if (fMinerTestModeForFoundersRewardScript) { - auto rewardScript = ParseHex("a9146708e6670db0b950dac68031025cc5b63213a49187"); - return CScript(rewardScript.begin(), rewardScript.end()); - } - // #1398 END - CBitcoinAddress address(GetFoundersRewardAddressAtHeight(nHeight).c_str()); assert(address.IsValid()); assert(address.IsScript()); diff --git a/src/chainparams.h b/src/chainparams.h index 48062e0ac..ae125d91c 100644 --- a/src/chainparams.h +++ b/src/chainparams.h @@ -83,8 +83,6 @@ public: std::string GetFoundersRewardAddressAtHeight(int height) const; CScript GetFoundersRewardScriptAtHeight(int height) const; std::string GetFoundersRewardAddressAtIndex(int i) const; - /** #1398 to return a fixed founders reward script for miner_tests */ - bool fMinerTestModeForFoundersRewardScript = false; /** Enforce coinbase consensus rule in regtest mode */ void SetRegTestCoinbaseMustBeProtected() { consensus.fCoinbaseMustBeProtected = true; } protected: @@ -94,23 +92,23 @@ protected: CMessageHeader::MessageStartChars pchMessageStart; //! Raw pub key bytes for the broadcast alert signing key. std::vector vAlertPubKey; - int nDefaultPort; - int nMinerThreads; - long nMaxTipAge; - uint64_t nPruneAfterHeight; - unsigned int nEquihashN; - unsigned int nEquihashK; + int nDefaultPort = 0; + int nMinerThreads = 0; + long nMaxTipAge = 0; + uint64_t nPruneAfterHeight = 0; + unsigned int nEquihashN = 0; + unsigned int nEquihashK = 0; std::vector vSeeds; std::vector base58Prefixes[MAX_BASE58_TYPES]; std::string strNetworkID; CBlock genesis; std::vector vFixedSeeds; - bool fRequireRPCPassword; - bool fMiningRequiresPeers; - bool fDefaultConsistencyChecks; - bool fRequireStandard; - bool fMineBlocksOnDemand; - bool fTestnetToBeDeprecatedFieldRPC; + bool fRequireRPCPassword = false; + bool fMiningRequiresPeers = false; + bool fDefaultConsistencyChecks = false; + bool fRequireStandard = false; + bool fMineBlocksOnDemand = false; + bool fTestnetToBeDeprecatedFieldRPC = false; Checkpoints::CCheckpointData checkpointData; std::vector vFoundersRewardAddress; }; diff --git a/src/chainparamsbase.h b/src/chainparamsbase.h index 4369d0aef..33765f0fc 100644 --- a/src/chainparamsbase.h +++ b/src/chainparamsbase.h @@ -29,7 +29,7 @@ public: protected: CBaseChainParams() {} - int nRPCPort; + int nRPCPort = 0; std::string strDataDir; }; diff --git a/src/clientversion.h b/src/clientversion.h index 30059987e..d58fc64db 100644 --- a/src/clientversion.h +++ b/src/clientversion.h @@ -17,10 +17,10 @@ #define CLIENT_VERSION_MAJOR 1 #define CLIENT_VERSION_MINOR 0 #define CLIENT_VERSION_REVISION 0 -#define CLIENT_VERSION_BUILD 1 +#define CLIENT_VERSION_BUILD 50 //! Set to true for release, false for prerelease or test build -#define CLIENT_VERSION_IS_RELEASE false +#define CLIENT_VERSION_IS_RELEASE true /** * Copyright year (2009-this) @@ -38,7 +38,7 @@ #define DO_STRINGIZE(X) #X //! Copyright string used in Windows .rc files -#define COPYRIGHT_STR "2009-" STRINGIZE(COPYRIGHT_YEAR) " The Bitcoin Core Developers" +#define COPYRIGHT_STR "2009-" STRINGIZE(COPYRIGHT_YEAR) " The Bitcoin Core Developers and The Zcash developers" /** * bitcoind-res.rc includes this file, but it cannot cope with real c++ code. diff --git a/src/compat.h b/src/compat.h index 20c2a2514..feaa544e2 100644 --- a/src/compat.h +++ b/src/compat.h @@ -32,7 +32,7 @@ #include #include #else -#include +#include #include #include #include diff --git a/src/compressor.h b/src/compressor.h index 4a7209083..fa702f0df 100644 --- a/src/compressor.h +++ b/src/compressor.h @@ -86,8 +86,14 @@ public: return; } nSize -= nSpecialScripts; - script.resize(nSize); - s >> REF(CFlatData(script)); + if (nSize > MAX_SCRIPT_SIZE) { + // Overly long script, replace with a short invalid one + script << OP_RETURN; + s.ignore(nSize); + } else { + script.resize(nSize); + s >> REF(CFlatData(script)); + } } }; diff --git a/src/consensus/consensus.h b/src/consensus/consensus.h index 0d1a3fdde..d700666bc 100644 --- a/src/consensus/consensus.h +++ b/src/consensus/consensus.h @@ -6,6 +6,10 @@ #ifndef BITCOIN_CONSENSUS_CONSENSUS_H #define BITCOIN_CONSENSUS_CONSENSUS_H +/** The minimum allowed block version (network rule) */ +static const int32_t MIN_BLOCK_VERSION = 4; +/** The minimum allowed transaction version (network rule) */ +static const int32_t MIN_TX_VERSION = 1; /** The maximum allowed size for a serialized block, in bytes (network rule) */ static const unsigned int MAX_BLOCK_SIZE = 2000000; /** The maximum allowed number of signature check operations in a block (network rule) */ diff --git a/src/gtest/test_checkblock.cpp b/src/gtest/test_checkblock.cpp new file mode 100644 index 000000000..be6fde35e --- /dev/null +++ b/src/gtest/test_checkblock.cpp @@ -0,0 +1,31 @@ +#include +#include + +#include "consensus/validation.h" +#include "main.h" + +class MockCValidationState : public CValidationState { +public: + MOCK_METHOD5(DoS, bool(int level, bool ret, + unsigned char chRejectCodeIn, std::string strRejectReasonIn, + bool corruptionIn)); + MOCK_METHOD3(Invalid, bool(bool ret, + unsigned char _chRejectCode, std::string _strRejectReason)); + MOCK_METHOD1(Error, bool(std::string strRejectReasonIn)); + MOCK_CONST_METHOD0(IsValid, bool()); + MOCK_CONST_METHOD0(IsInvalid, bool()); + MOCK_CONST_METHOD0(IsError, bool()); + MOCK_CONST_METHOD1(IsInvalid, bool(int &nDoSOut)); + MOCK_CONST_METHOD0(CorruptionPossible, bool()); + MOCK_CONST_METHOD0(GetRejectCode, unsigned char()); + MOCK_CONST_METHOD0(GetRejectReason, std::string()); +}; + +TEST(CheckBlock, VersionTooLow) { + CBlock block; + block.nVersion = 1; + + MockCValidationState state; + EXPECT_CALL(state, DoS(100, false, REJECT_INVALID, "version-too-low", false)).Times(1); + EXPECT_FALSE(CheckBlock(block, state, false, false)); +} diff --git a/src/gtest/test_checktransaction.cpp b/src/gtest/test_checktransaction.cpp index 7dd1b86d2..305977103 100644 --- a/src/gtest/test_checktransaction.cpp +++ b/src/gtest/test_checktransaction.cpp @@ -94,6 +94,16 @@ TEST(checktransaction_tests, valid_transaction) { EXPECT_TRUE(CheckTransactionWithoutProofVerification(tx, state)); } +TEST(checktransaction_tests, BadVersionTooLow) { + CMutableTransaction mtx = GetValidTransaction(); + mtx.nVersion = 0; + + CTransaction tx(mtx); + MockCValidationState state; + EXPECT_CALL(state, DoS(100, false, REJECT_INVALID, "bad-txns-version-too-low", false)).Times(1); + CheckTransactionWithoutProofVerification(tx, state); +} + TEST(checktransaction_tests, bad_txns_vin_empty) { CMutableTransaction mtx = GetValidTransaction(); mtx.vjoinsplit.resize(0); diff --git a/src/gtest/test_random.cpp b/src/gtest/test_random.cpp new file mode 100644 index 000000000..61f81c331 --- /dev/null +++ b/src/gtest/test_random.cpp @@ -0,0 +1,27 @@ +#include + +#include "random.h" + +extern int GenZero(int n); +extern int GenMax(int n); + +TEST(Random, MappedShuffle) { + std::vector a {8, 4, 6, 3, 5}; + std::vector m {0, 1, 2, 3, 4}; + + auto a1 = a; + auto m1 = m; + MappedShuffle(a1.begin(), m1.begin(), a1.size(), GenZero); + std::vector ea1 {4, 6, 3, 5, 8}; + std::vector em1 {1, 2, 3, 4, 0}; + EXPECT_EQ(ea1, a1); + EXPECT_EQ(em1, m1); + + auto a2 = a; + auto m2 = m; + MappedShuffle(a2.begin(), m2.begin(), a2.size(), GenMax); + std::vector ea2 {8, 4, 6, 3, 5}; + std::vector em2 {0, 1, 2, 3, 4}; + EXPECT_EQ(ea2, a2); + EXPECT_EQ(em2, m2); +} diff --git a/src/gtest/test_transaction.cpp b/src/gtest/test_transaction.cpp new file mode 100644 index 000000000..a339f7652 --- /dev/null +++ b/src/gtest/test_transaction.cpp @@ -0,0 +1,85 @@ +#include + +#include "primitives/transaction.h" +#include "zcash/Note.hpp" +#include "zcash/Address.hpp" + +extern ZCJoinSplit* params; +extern int GenZero(int n); +extern int GenMax(int n); + +TEST(Transaction, JSDescriptionRandomized) { + // construct a merkle tree + ZCIncrementalMerkleTree merkleTree; + + libzcash::SpendingKey k = libzcash::SpendingKey::random(); + libzcash::PaymentAddress addr = k.address(); + + libzcash::Note note(addr.a_pk, 100, uint256(), uint256()); + + // commitment from coin + uint256 commitment = note.cm(); + + // insert commitment into the merkle tree + merkleTree.append(commitment); + + // compute the merkle root we will be working with + uint256 rt = merkleTree.root(); + + auto witness = merkleTree.witness(); + + // create JSDescription + uint256 pubKeyHash; + boost::array inputs = { + libzcash::JSInput(witness, note, k), + libzcash::JSInput() // dummy input of zero value + }; + boost::array outputs = { + libzcash::JSOutput(addr, 50), + libzcash::JSOutput(addr, 50) + }; + boost::array inputMap; + boost::array outputMap; + + { + auto jsdesc = JSDescription::Randomized( + *params, pubKeyHash, rt, + inputs, outputs, + inputMap, outputMap, + 0, 0, false); + + std::set inputSet(inputMap.begin(), inputMap.end()); + std::set expectedInputSet {0, 1}; + EXPECT_EQ(expectedInputSet, inputSet); + + std::set outputSet(outputMap.begin(), outputMap.end()); + std::set expectedOutputSet {0, 1}; + EXPECT_EQ(expectedOutputSet, outputSet); + } + + { + auto jsdesc = JSDescription::Randomized( + *params, pubKeyHash, rt, + inputs, outputs, + inputMap, outputMap, + 0, 0, false, GenZero); + + boost::array expectedInputMap {1, 0}; + boost::array expectedOutputMap {1, 0}; + EXPECT_EQ(expectedInputMap, inputMap); + EXPECT_EQ(expectedOutputMap, outputMap); + } + + { + auto jsdesc = JSDescription::Randomized( + *params, pubKeyHash, rt, + inputs, outputs, + inputMap, outputMap, + 0, 0, false, GenMax); + + boost::array expectedInputMap {0, 1}; + boost::array expectedOutputMap {0, 1}; + EXPECT_EQ(expectedInputMap, inputMap); + EXPECT_EQ(expectedOutputMap, outputMap); + } +} diff --git a/src/gtest/utils.cpp b/src/gtest/utils.cpp new file mode 100644 index 000000000..cf025162c --- /dev/null +++ b/src/gtest/utils.cpp @@ -0,0 +1,13 @@ +#include "zcash/JoinSplit.hpp" + +ZCJoinSplit* params = ZCJoinSplit::Unopened(); + +int GenZero(int n) +{ + return 0; +} + +int GenMax(int n) +{ + return n-1; +} diff --git a/src/init.cpp b/src/init.cpp index ac9837727..aa87f3fc5 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -16,6 +16,7 @@ #include "consensus/validation.h" #include "key.h" #include "main.h" +#include "metrics.h" #include "miner.h" #include "net.h" #include "rpcserver.h" @@ -110,7 +111,7 @@ CClientUIInterface uiInterface; // Declared but not defined in ui_interface.h // shutdown thing. // -volatile bool fRequestShutdown = false; +std::atomic fRequestShutdown(false); void StartShutdown() { @@ -156,7 +157,7 @@ void Shutdown() /// for example if the data directory was found to be locked. /// Be sure that anything that writes files or flushes caches only does this if the respective /// module was initialized. - RenameThread("bitcoin-shutoff"); + RenameThread("zcash-shutoff"); mempool.AddTransactionsUpdated(1); StopRPCThreads(); #ifdef ENABLE_WALLET @@ -383,6 +384,7 @@ std::string HelpMessage(HelpMessageMode mode) #ifdef ENABLE_WALLET strUsage += HelpMessageOpt("-gen", strprintf(_("Generate coins (default: %u)"), 0)); strUsage += HelpMessageOpt("-genproclimit=", strprintf(_("Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)"), 1)); + strUsage += HelpMessageOpt("-equihashsolver=", _("Specify the Equihash solver to be used if enabled (default: \"default\")")); #endif strUsage += HelpMessageOpt("-help-debug", _("Show all debugging options (usage: --help -help-debug)")); strUsage += HelpMessageOpt("-logips", strprintf(_("Include IP addresses in debug output (default: %u)"), 0)); @@ -529,7 +531,7 @@ void CleanupBlockRevFiles() void ThreadImport(std::vector vImportFiles) { - RenameThread("bitcoin-loadblk"); + RenameThread("zcash-loadblk"); // -reindex if (fReindex) { #ifdef ENABLE_WALLET @@ -613,8 +615,8 @@ static void ZC_LoadParams() struct timeval tv_start, tv_end; float elapsed; - boost::filesystem::path pk_path = ZC_GetParamsDir() / "beta2-proving.key"; - boost::filesystem::path vk_path = ZC_GetParamsDir() / "beta2-verifying.key"; + boost::filesystem::path pk_path = ZC_GetParamsDir() / "sprout-proving.key"; + boost::filesystem::path vk_path = ZC_GetParamsDir() / "sprout-verifying.key"; pzcashParams = ZCJoinSplit::Unopened(); @@ -924,7 +926,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) // Sanity check if (!InitSanityCheck()) - return InitError(_("Initialization sanity check failed. Bitcoin Core is shutting down.")); + return InitError(_("Initialization sanity check failed. Zcash is shutting down.")); std::string strDataDir = GetDataDir().string(); #ifdef ENABLE_WALLET @@ -940,9 +942,9 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) try { static boost::interprocess::file_lock lock(pathLockFile.string().c_str()); if (!lock.try_lock()) - return InitError(strprintf(_("Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running."), strDataDir)); + return InitError(strprintf(_("Cannot obtain a lock on data directory %s. Zcash is probably already running."), strDataDir)); } catch(const boost::interprocess::interprocess_exception& e) { - return InitError(strprintf(_("Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.") + " %s.", strDataDir, e.what())); + return InitError(strprintf(_("Cannot obtain a lock on data directory %s. Zcash is probably already running.") + " %s.", strDataDir, e.what())); } #ifndef WIN32 @@ -951,7 +953,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) if (GetBoolArg("-shrinkdebugfile", !fDebug)) ShrinkDebugFile(); 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 (%s)\n", FormatFullVersion(), CLIENT_DATE); + LogPrintf("Zcash version %s (%s)\n", FormatFullVersion(), CLIENT_DATE); LogPrintf("Using OpenSSL version %s\n", SSLeay_version(SSLEAY_VERSION)); #ifdef ENABLE_WALLET LogPrintf("Using BerkeleyDB version %s\n", DbEnv::version(0, 0, 0)); @@ -974,6 +976,14 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) CScheduler::Function serviceLoop = boost::bind(&CScheduler::serviceQueue, &scheduler); threadGroup.create_thread(boost::bind(&TraceThread, "scheduler", serviceLoop)); + if ((chainparams.NetworkIDString() != "regtest") && + GetBoolArg("-showmetrics", true) && + !fPrintToConsole && !GetBoolArg("-daemon", false)) { + // Start the persistent metrics interface + ConnectMetricsScreen(); + threadGroup.create_thread(&ThreadShowMetricsScreen); + } + // Initialize Zcash circuit parameters ZC_LoadParams(); // These must be disabled for now, they are buggy and we probably don't diff --git a/src/main.cpp b/src/main.cpp index e5fcc4736..b195e5c13 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -16,6 +16,7 @@ #include "consensus/validation.h" #include "init.h" #include "merkleblock.h" +#include "metrics.h" #include "net.h" #include "pow.h" #include "txdb.h" @@ -38,7 +39,7 @@ using namespace std; #if defined(NDEBUG) -# error "Bitcoin cannot be compiled without assertions." +# error "Zcash cannot be compiled without assertions." #endif @@ -577,7 +578,7 @@ bool AddOrphanTx(const CTransaction& tx, NodeId peer) // have been mined or received. // 10,000 orphans, each of which is at most 5,000 bytes big is // at most 500 megabytes of orphans: - unsigned int sz = tx.GetSerializeSize(SER_NETWORK, CTransaction::CURRENT_VERSION); + unsigned int sz = tx.GetSerializeSize(SER_NETWORK, tx.nVersion); if (sz > 5000) { LogPrint("mempool", "ignoring large orphan tx (size: %u, hash: %s)\n", sz, hash.ToString()); @@ -652,7 +653,7 @@ unsigned int LimitOrphanTxSize(unsigned int nMaxOrphans) bool IsStandardTx(const CTransaction& tx, string& reason) { - if (tx.nVersion > CTransaction::CURRENT_VERSION || tx.nVersion < 1) { + if (tx.nVersion > CTransaction::MAX_CURRENT_VERSION || tx.nVersion < CTransaction::MIN_CURRENT_VERSION) { reason = "version"; return false; } @@ -863,6 +864,11 @@ unsigned int GetP2SHSigOpCount(const CTransaction& tx, const CCoinsViewCache& in bool CheckTransaction(const CTransaction& tx, CValidationState &state) { + // Don't count coinbase transactions because mining skews the count + if (!tx.IsCoinBase()) { + transactionsValidated.increment(); + } + if (!CheckTransactionWithoutProofVerification(tx, state)) { return false; } else { @@ -881,6 +887,12 @@ bool CheckTransactionWithoutProofVerification(const CTransaction& tx, CValidatio { // Basic checks that don't depend on any context + // Check transaction version + if (tx.nVersion < MIN_TX_VERSION) { + return state.DoS(100, error("CheckTransaction(): version too low"), + REJECT_INVALID, "bad-txns-version-too-low"); + } + // Transactions can contain empty `vin` and `vout` so long as // `vjoinsplit` is non-empty. if (tx.vin.empty() && tx.vjoinsplit.empty()) @@ -2006,7 +2018,7 @@ bool FindUndoPos(CValidationState &state, int nFile, CDiskBlockPos &pos, unsigne static CCheckQueue scriptcheckqueue(128); void ThreadScriptCheck() { - RenameThread("bitcoin-scriptch"); + RenameThread("zcash-scriptch"); scriptcheckqueue.Thread(); } @@ -3003,14 +3015,15 @@ bool CheckBlockHeader(int32_t height,CBlockIndex *pindex, const CBlockHeader& bl // Check timestamp if (blockhdr.GetBlockTime() > GetAdjustedTime() + 60) return state.Invalid(error("CheckBlockHeader(): block timestamp too far in the future"),REJECT_INVALID, "time-too-new"); + // Check block version + //if (block.nVersion < MIN_BLOCK_VERSION) + // return state.DoS(100, error("CheckBlockHeader(): block version too low"),REJECT_INVALID, "version-too-low"); + // Check Equihash solution is valid if ( fCheckPOW && !CheckEquihashSolution(&blockhdr, Params()) ) return state.DoS(100, error("CheckBlockHeader(): Equihash solution invalid"),REJECT_INVALID, "invalid-solution"); // Check proof of work matches claimed amount - //printf("from checkblockheader pindex.%p %p\n",pindex,mapBlockIndex[blockhdr.GetHash()]); - //if ( pindex == 0 ) - // pindex = mapBlockIndex[blockhdr.GetHash()]; komodo_index2pubkey33(pubkey33,pindex,height); if ( fCheckPOW && !CheckProofOfWork(height,pubkey33,blockhdr.GetHash(), blockhdr.nBits, Params().GetConsensus()) ) return state.DoS(50, error("CheckBlockHeader(): proof of work failed"),REJECT_INVALID, "high-hash"); @@ -4916,6 +4929,14 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, // the getaddr message mitigates the attack. else if ((strCommand == "getaddr") && (pfrom->fInbound)) { + // Only send one GetAddr response per connection to reduce resource waste + // and discourage addr stamping of INV announcements. + if (pfrom->fSentAddr) { + LogPrint("net", "Ignoring repeated \"getaddr\". peer=%d\n", pfrom->id); + return true; + } + pfrom->fSentAddr = true; + pfrom->vAddrToSend.clear(); vector vAddr = addrman.GetAddr(); BOOST_FOREACH(const CAddress &addr, vAddr) @@ -5130,15 +5151,14 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, } } } - /*else if (strCommand == "komodo") - { - vector vData; - vRecv >> vData; - komodo_checkmsg(pfrom,vData.data(),vData.size()); - }*/ - else - { - LogPrint("net", "Unknown \"%s\" from peer=%d\n", SanitizeString(strCommand),pfrom->id); + else if (strCommand == "notfound") { + // We do not care about the NOTFOUND message, but logging an Unknown Command + // message would be undesirable as we transmit it ourselves. + } + + else { + // Ignore unknown commands for extensibility + LogPrint("net", "Unknown command \"%s\" from peer=%d\n", SanitizeString(strCommand), pfrom->id); } diff --git a/src/metrics.cpp b/src/metrics.cpp new file mode 100644 index 000000000..a5480838e --- /dev/null +++ b/src/metrics.cpp @@ -0,0 +1,223 @@ +// Copyright (c) 2016 The Zcash developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include "metrics.h" + +#include "chainparams.h" +#include "ui_interface.h" +#include "util.h" +#include "utiltime.h" + +#include +#include +#include +#include +#include + +AtomicCounter transactionsValidated; +AtomicCounter ehSolverRuns; +AtomicCounter solutionTargetChecks; +AtomicCounter minedBlocks; + +boost::synchronized_value> messageBox; +boost::synchronized_value initMessage; +bool loaded = false; + +static bool metrics_ThreadSafeMessageBox(const std::string& message, + const std::string& caption, + unsigned int style) +{ + std::string strCaption; + // Check for usage of predefined caption + switch (style) { + case CClientUIInterface::MSG_ERROR: + strCaption += _("Error"); + break; + case CClientUIInterface::MSG_WARNING: + strCaption += _("Warning"); + break; + case CClientUIInterface::MSG_INFORMATION: + strCaption += _("Information"); + break; + default: + strCaption += caption; // Use supplied caption (can be empty) + } + + boost::strict_lock_ptr> u = messageBox.synchronize(); + u->push_back(strCaption + ": " + message); + if (u->size() > 5) { + u->pop_back(); + } +} + +static void metrics_InitMessage(const std::string& message) +{ + *initMessage = message; +} + +void ConnectMetricsScreen() +{ + uiInterface.ThreadSafeMessageBox.disconnect_all_slots(); + uiInterface.ThreadSafeMessageBox.connect(metrics_ThreadSafeMessageBox); + uiInterface.InitMessage.disconnect_all_slots(); + uiInterface.InitMessage.connect(metrics_InitMessage); +} + +void printMiningStatus(bool mining) +{ + if (mining) { + int nThreads = GetArg("-genproclimit", 1); + if (nThreads < 0) { + // In regtest threads defaults to 1 + if (Params().DefaultMinerThreads()) + nThreads = Params().DefaultMinerThreads(); + else + nThreads = boost::thread::hardware_concurrency(); + } + std::cout << strprintf(_("You are running %d mining threads."), nThreads) << std::endl; + } else { + std::cout << _("You are currently not mining.") << std::endl; + std::cout << _("To enable mining, add 'gen=1' to your zcash.conf and restart.") << std::endl; + } + std::cout << std::endl; +} + +int printMetrics(size_t cols, int64_t nStart, bool mining) +{ + // Number of lines that are always displayed + int lines = 3; + + // Calculate uptime + int64_t uptime = GetTime() - nStart; + int days = uptime / (24 * 60 * 60); + int hours = (uptime - (days * 24 * 60 * 60)) / (60 * 60); + int minutes = (uptime - (((days * 24) + hours) * 60 * 60)) / 60; + int seconds = uptime - (((((days * 24) + hours) * 60) + minutes) * 60); + + // Display uptime + std::string duration; + if (days > 0) { + duration = strprintf(_("%d days, %d hours, %d minutes, %d seconds"), days, hours, minutes, seconds); + } else if (hours > 0) { + duration = strprintf(_("%d hours, %d minutes, %d seconds"), hours, minutes, seconds); + } else if (minutes > 0) { + duration = strprintf(_("%d minutes, %d seconds"), minutes, seconds); + } else { + duration = strprintf(_("%d seconds"), seconds); + } + std::string strDuration = strprintf(_("Since starting this node %s ago:"), duration); + std::cout << strDuration << std::endl; + lines += (strDuration.size() / cols); + + std::cout << "- " << strprintf(_("You have validated %d transactions!"), transactionsValidated.get()) << std::endl; + + if (mining) { + double solps = uptime > 0 ? (double)solutionTargetChecks.get() / uptime : 0; + std::string strSolps = strprintf("%.4f Sol/s", solps); + std::cout << "- " << strprintf(_("You have contributed %s on average to the network solution rate."), strSolps) << std::endl; + std::cout << "- " << strprintf(_("You have completed %d Equihash solver runs."), ehSolverRuns.get()) << std::endl; + lines += 2; + + int mined = minedBlocks.get(); + if (mined > 0) { + std::cout << "- " << strprintf(_("You have mined %d blocks!"), mined) << std::endl; + lines++; + } + } + std::cout << std::endl; + + return lines; +} + +int printMessageBox(size_t cols) +{ + boost::strict_lock_ptr> u = messageBox.synchronize(); + + if (u->size() == 0) { + return 0; + } + + int lines = 2 + u->size(); + std::cout << _("Messages:") << std::endl; + for (auto it = u->cbegin(); it != u->cend(); ++it) { + std::cout << *it << std::endl; + // Handle wrapped lines + lines += (it->size() / cols); + } + std::cout << std::endl; + return lines; +} + +int printInitMessage() +{ + if (loaded) { + return 0; + } + + std::string msg = *initMessage; + std::cout << _("Init message:") << " " << msg << std::endl; + std::cout << std::endl; + + if (msg == _("Done loading")) { + loaded = true; + } + + return 2; +} + +void ThreadShowMetricsScreen() +{ + // Make this thread recognisable as the metrics screen thread + RenameThread("zcash-metrics-screen"); + + // Clear screen + std::cout << "\e[2J"; + + // Print art + std::cout << METRICS_ART << std::endl; + std::cout << std::endl; + + // Thank you text + std::cout << _("Thank you for running a Zcash node!") << std::endl; + std::cout << _("You're helping to strengthen the network and contributing to a social good :)") << std::endl; + std::cout << std::endl; + + // Miner status + bool mining = GetBoolArg("-gen", false); + printMiningStatus(mining); + + // Count uptime + int64_t nStart = GetTime(); + + while (true) { + // Number of lines that are always displayed + int lines = 1; + int cols = 80; + + // Get current window size + if (isatty(STDOUT_FILENO)) { + struct winsize w; + w.ws_col = 0; + if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) != -1 && w.ws_col != 0) { + cols = w.ws_col; + } + } + + // Erase below current position + std::cout << "\e[J"; + + lines += printMetrics(cols, nStart, mining); + lines += printMessageBox(cols); + lines += printInitMessage(); + + // Explain how to exit + std::cout << "[" << _("Press Ctrl+C to exit") << "] [" << _("Set 'showmetrics=0' to hide") << "]" << std::endl;; + + boost::this_thread::interruption_point(); + MilliSleep(1000); + + // Return to the top of the updating section + std::cout << "\e[" << lines << "A"; + } +} diff --git a/src/metrics.h b/src/metrics.h new file mode 100644 index 000000000..4a2ca2264 --- /dev/null +++ b/src/metrics.h @@ -0,0 +1,62 @@ +// Copyright (c) 2016 The Zcash developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include +#include + +struct AtomicCounter { + std::atomic value; + + AtomicCounter() : value {0} { } + + void increment(){ + ++value; + } + + void decrement(){ + --value; + } + + int get(){ + return value.load(); + } +}; + +extern AtomicCounter transactionsValidated; +extern AtomicCounter ehSolverRuns; +extern AtomicCounter solutionTargetChecks; +extern AtomicCounter minedBlocks; + +void ConnectMetricsScreen(); +void ThreadShowMetricsScreen(); + +/** + * Heart image: https://commons.wikimedia.org/wiki/File:Heart_coraz%C3%B3n.svg + * License: CC BY-SA 3.0 + * + * Rendering options: + * Zcash: img2txt -W 40 -H 20 -f utf8 -d none -g 0.7 Z-yellow.orange-logo.png + * Heart: img2txt -W 40 -H 20 -f utf8 -d none 2000px-Heart_corazón.svg.png + */ +const std::string METRICS_ART = +"   \n" +"   \n" +"  :88SX@888@@X8:  8; %X X% ;8 \n" +"  %%Xt%tt%SSSSS:XXXt@@  X :: :: X \n" +"  @S;;tt%%%t ;;::XXXXSX  % SS % \n" +"  .t:::;;%8888 88888tXXXX8;  S S \n" +"  .%...:::8 8::XXX%;  X X \n" +"  8888...:t888888X 8t;;::XX8   8 8 \n" +" %888888...:::;:8  :Xttt;;;::X@    \n" +" 888888888...:St 8:%%tttt;;;:X  X X \n" +" 88888888888S8  :%;ttt%%tttt;;X  8 8 \n" +" %888888888%t 8S:;;;tt%%%ttt;8  : : \n" +"  8t8888888  S8888888Stt%%%t@   :: :: \n" +"  .@tt888@ 8;;ttt@;  t t \n" +"  .8ttt8@SSSSS SXXXX%:;;;X;  8 8 \n" +"  X8ttt8888% %88...::X8   X. .X \n" +"  %8@tt88;8888%8888%8X   :; ;: \n" +"  :@888@XXX@888:  tt \n" +"   \n" +"   "; diff --git a/src/miner.cpp b/src/miner.cpp index 41a4f9f84..80c507d21 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -4,6 +4,7 @@ // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "miner.h" +#include "pow/tromp/equi_miner.h" #include "amount.h" #include "chainparams.h" @@ -11,6 +12,7 @@ #include "consensus/validation.h" #include "hash.h" #include "main.h" +#include "metrics.h" #include "net.h" #include "pow.h" #include "primitives/transaction.h" @@ -450,6 +452,8 @@ static bool ProcessBlockFound(CBlock* pblock, CWallet& wallet, CReserveKey& rese if (!ProcessNewBlock(state, NULL, pblock, true, NULL)) return error("ZcashMiner: ProcessNewBlock, block not accepted"); + minedBlocks.increment(); + return true; } @@ -471,6 +475,10 @@ void static BitcoinMiner(CWallet *pwallet) unsigned int n = chainparams.EquihashN(); unsigned int k = chainparams.EquihashK(); + std::string solver = GetArg("-equihashsolver", "default"); + assert(solver == "tromp" || solver == "default"); + LogPrint("pow", "Using Equihash solver \"%s\" with n = %u, k = %u\n", solver, n, k); + std::mutex m_cs; bool cancelSolver = false; boost::signals2::connection c = uiInterface.NotifyBlockTip.connect( @@ -554,8 +562,8 @@ void static BitcoinMiner(CWallet *pwallet) pblock->nNonce.size()); // (x_1, x_2, ...) = A(I, V, n, k) - LogPrint("pow", "Running Equihash solver with nNonce = %s\n", - pblock->nNonce.ToString()); + LogPrint("pow", "Running Equihash solver \"%s\" with nNonce = %s\n", + solver, pblock->nNonce.ToString()); std::function)> validBlock = [&pblock, &hashTarget, &pwallet, &reservekey, &m_cs, &cancelSolver, &chainparams] @@ -563,6 +571,7 @@ void static BitcoinMiner(CWallet *pwallet) // Write the solution to the hash and compute the result. LogPrint("pow", "- Checking solution against target\n"); pblock->nSolution = soln; + solutionTargetChecks.increment(); if (UintToArith256(pblock->GetHash()) > hashTarget) { return false; @@ -586,8 +595,11 @@ void static BitcoinMiner(CWallet *pwallet) SetThreadPriority(THREAD_PRIORITY_LOWEST); // In regression test mode, stop mining after a block is found. - if (chainparams.MineBlocksOnDemand()) + if (chainparams.MineBlocksOnDemand()) { + // Increment here because throwing skips the call below + ehSolverRuns.increment(); throw boost::thread_interrupted(); + } return true; }; @@ -595,14 +607,53 @@ void static BitcoinMiner(CWallet *pwallet) std::lock_guard lock{m_cs}; return cancelSolver; }; - try { - // If we find a valid block, we rebuild - if (EhOptimisedSolve(n, k, curr_state, validBlock, cancelled)) - break; - } catch (EhSolverCancelledException&) { - LogPrint("pow", "Equihash solver cancelled\n"); - std::lock_guard lock{m_cs}; - cancelSolver = false; + + // TODO: factor this out into a function with the same API for each solver. + if (solver == "tromp") { + // Create solver and initialize it. + equi eq(1); + eq.setstate(&curr_state); + + // Intialization done, start algo driver. + eq.digit0(0); + eq.xfull = eq.bfull = eq.hfull = 0; + eq.showbsizes(0); + for (u32 r = 1; r < WK; r++) { + (r&1) ? eq.digitodd(r, 0) : eq.digiteven(r, 0); + eq.xfull = eq.bfull = eq.hfull = 0; + eq.showbsizes(r); + } + eq.digitK(0); + ehSolverRuns.increment(); + + // Convert solution indices to byte array (decompress) and pass it to validBlock method. + for (size_t s = 0; s < eq.nsols; s++) { + LogPrint("pow", "Checking solution %d\n", s+1); + std::vector index_vector(PROOFSIZE); + for (size_t i = 0; i < PROOFSIZE; i++) { + index_vector[i] = eq.sols[s][i]; + } + std::vector sol_char = GetMinimalFromIndices(index_vector, DIGITBITS); + + if (validBlock(sol_char)) { + // If we find a POW solution, do not try other solutions + // because they become invalid as we created a new block in blockchain. + break; + } + } + } else { + try { + // If we find a valid block, we rebuild + bool found = EhOptimisedSolve(n, k, curr_state, validBlock, cancelled); + ehSolverRuns.increment(); + if (found) { + break; + } + } catch (EhSolverCancelledException&) { + LogPrint("pow", "Equihash solver cancelled\n"); + std::lock_guard lock{m_cs}; + cancelSolver = false; + } } // Check for stop or if block needs to be rebuilt diff --git a/src/net.cpp b/src/net.cpp index 636e3d5e7..0a96d01f2 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -2142,6 +2142,7 @@ CNode::CNode(SOCKET hSocketIn, CAddress addrIn, std::string addrNameIn, bool fIn nStartingHeight = -1; fGetAddr = false; fRelayTxes = false; + fSentAddr = false; pfilter = new CBloomFilter(); nPingNonceSent = 0; nPingUsecStart = 0; diff --git a/src/net.h b/src/net.h index 44f14fd43..50fb90dca 100644 --- a/src/net.h +++ b/src/net.h @@ -278,6 +278,7 @@ public: // b) the peer may tell us in its version message that we should not relay tx invs // until it has initialized its bloom filter. bool fRelayTxes; + bool fSentAddr; CSemaphoreGrant grantOutbound; CCriticalSection cs_filter; CBloomFilter* pfilter; diff --git a/src/policy/fees.h b/src/policy/fees.h index 15577d128..d37d4b184 100644 --- a/src/policy/fees.h +++ b/src/policy/fees.h @@ -66,6 +66,9 @@ class CTxMemPoolEntry; * they've been outstanding. */ +/** Decay of .998 is a half-life of 346 blocks or about 2.4 days */ +static const double DEFAULT_DECAY = .998; + /** * We will instantiate two instances of this class, one to track transactions * that were included in a block due to fee, and one for tx's included due to @@ -105,7 +108,7 @@ private: // Combine the total value with the tx counts to calculate the avg fee/priority per bucket std::string dataTypeString; - double decay; + double decay = DEFAULT_DECAY; // Mempool counts of outstanding transactions // For each bucket X, track the number of transactions in the mempool @@ -179,9 +182,6 @@ public: /** Track confirm delays up to 25 blocks, can't estimate beyond that */ static const unsigned int MAX_BLOCK_CONFIRMS = 25; -/** Decay of .998 is a half-life of 346 blocks or about 2.4 days */ -static const double DEFAULT_DECAY = .998; - /** Require greater than 85% of X fee transactions to be confirmed within Y blocks for X to be big enough */ static const double MIN_SUCCESS_PCT = .85; static const double UNLIKELY_PCT = .5; diff --git a/src/pow/tromp/equi.h b/src/pow/tromp/equi.h new file mode 100644 index 000000000..f6d8803c2 --- /dev/null +++ b/src/pow/tromp/equi.h @@ -0,0 +1,98 @@ +// Equihash solver +// Copyright (c) 2016-2016 John Tromp, The Zcash developers + +#include "sodium.h" +#ifdef __APPLE__ +#include "pow/tromp/osx_barrier.h" +#endif +#include "compat/endian.h" + +#include // for types uint32_t,uint64_t +#include // for functions memset +#include // for function qsort + +typedef uint32_t u32; +typedef unsigned char uchar; + +// algorithm parameters, prefixed with W to reduce include file conflicts + +#ifndef WN +#define WN 200 +#endif + +#ifndef WK +#define WK 9 +#endif + +#define NDIGITS (WK+1) +#define DIGITBITS (WN/(NDIGITS)) + +static const u32 PROOFSIZE = 1<= *indices1) + return POW_OUT_OF_ORDER; + uchar hash0[WN/8], hash1[WN/8]; + int vrf0 = verifyrec(ctx, indices, hash0, r-1); + if (vrf0 != POW_OK) + return vrf0; + int vrf1 = verifyrec(ctx, indices1, hash1, r-1); + if (vrf1 != POW_OK) + return vrf1; + for (int i=0; i < WN/8; i++) + hash[i] = hash0[i] ^ hash1[i]; + int i, b = r * DIGITBITS; + for (i = 0; i < b/8; i++) + if (hash[i]) + return POW_NONZERO_XOR; + if ((b%8) && hash[i] >> (8-(b%8))) + return POW_NONZERO_XOR; + return POW_OK; +} + +int compu32(const void *pa, const void *pb) { + u32 a = *(u32 *)pa, b = *(u32 *)pb; + return a0 the leftmost leaf of its left subtree +// is less than the leftmost leaf of its right subtree + +// The algorithm below solves this by maintaining the trees +// in a graph of K layers, each split into buckets +// with buckets indexed by the first n-RESTBITS bits following +// the i*n 0s, each bucket having 4 * 2^RESTBITS slots, +// twice the number of subtrees expected to land there. + +#include "pow/tromp/equi.h" +#include +#include +#include +#include + +typedef uint16_t u16; +typedef uint64_t u64; + +#ifdef EQUIHASH_TROMP_ATOMIC +#include +typedef std::atomic au32; +#else +typedef u32 au32; +#endif + +#ifndef RESTBITS +#define RESTBITS 8 +#endif + +// 2_log of number of buckets +#define BUCKBITS (DIGITBITS-RESTBITS) + +#ifndef SAVEMEM +#if RESTBITS == 4 +// can't save memory in such small buckets +#define SAVEMEM 1 +#elif RESTBITS >= 8 +// take advantage of law of large numbers (sum of 2^8 random numbers) +// this reduces (200,9) memory to under 144MB, with negligible discarding +#define SAVEMEM 9/14 +#endif +#endif + +// number of buckets +static const u32 NBUCKETS = 1<> (2 * SLOTBITS - 1); +#else + return bid_s0_s1 >> (2 * SLOTBITS); +#endif + } + u32 slotid0() const { +#ifdef SLOTDIFF + return (bid_s0_s1 >> (SLOTBITS-1)) & SLOTMASK; +#else + return (bid_s0_s1 >> SLOTBITS) & SLOTMASK; +#endif + } + u32 slotid1() const { +#ifdef SLOTDIFF + return (slotid0() + 1 + (bid_s0_s1 & (SLOTMASK>>1))) & SLOTMASK; +#else + return bid_s0_s1 & SLOTMASK; +#endif + } +}; + +union hashunit { + u32 word; + uchar bytes[sizeof(u32)]; +}; + +#define WORDS(bits) ((bits + 31) / 32) +#define HASHWORDS0 WORDS(WN - DIGITBITS + RESTBITS) +#define HASHWORDS1 WORDS(WN - 2*DIGITBITS + RESTBITS) + +struct slot0 { + tree attr; + hashunit hash[HASHWORDS0]; +}; + +struct slot1 { + tree attr; + hashunit hash[HASHWORDS1]; +}; + +// a bucket is NSLOTS treenodes +typedef slot0 bucket0[NSLOTS]; +typedef slot1 bucket1[NSLOTS]; +// the N-bit hash consists of K+1 n-bit "digits" +// each of which corresponds to a layer of NBUCKETS buckets +typedef bucket0 digit0[NBUCKETS]; +typedef bucket1 digit1[NBUCKETS]; + +// size (in bytes) of hash in round 0 <= r < WK +u32 hashsize(const u32 r) { + const u32 hashbits = WN - (r+1) * DIGITBITS + RESTBITS; + return (hashbits + 7) / 8; +} + +u32 hashwords(u32 bytes) { + return (bytes + 3) / 4; +} + +// manages hash and tree data +struct htalloc { + u32 *heap0; + u32 *heap1; + bucket0 *trees0[(WK+1)/2]; + bucket1 *trees1[WK/2]; + u32 alloced; + htalloc() { + alloced = 0; + } + void alloctrees() { +// optimize xenoncat's fixed memory layout, avoiding any waste +// digit trees hashes trees hashes +// 0 0 A A A A A A . . . . . . +// 1 0 A A A A A A 1 B B B B B +// 2 0 2 C C C C C 1 B B B B B +// 3 0 2 C C C C C 1 3 D D D D +// 4 0 2 4 E E E E 1 3 D D D D +// 5 0 2 4 E E E E 1 3 5 F F F +// 6 0 2 4 6 . G G 1 3 5 F F F +// 7 0 2 4 6 . G G 1 3 5 7 H H +// 8 0 2 4 6 8 . I 1 3 5 7 H H + assert(DIGITBITS >= 16); // ensures hashes shorten by 1 unit every 2 digits + heap0 = (u32 *)alloc(1, sizeof(digit0)); + heap1 = (u32 *)alloc(1, sizeof(digit1)); + for (int r=0; r indices[size]) { + for (u32 i=0; i < size; i++) { + const u32 tmp = indices[i]; + indices[i] = indices[size+i]; + indices[size+i] = tmp; + } + } + } + void listindices0(u32 r, const tree t, u32 *indices) { + if (r == 0) { + *indices = t.getindex(); + return; + } + const bucket1 &buck = hta.trees1[--r/2][t.bucketid()]; + const u32 size = 1 << r; + u32 *indices1 = indices + size; + listindices1(r, buck[t.slotid0()].attr, indices); + listindices1(r, buck[t.slotid1()].attr, indices1); + orderindices(indices, size); + } + void listindices1(u32 r, const tree t, u32 *indices) { + const bucket0 &buck = hta.trees0[--r/2][t.bucketid()]; + const u32 size = 1 << r; + u32 *indices1 = indices + size; + listindices0(r, buck[t.slotid0()].attr, indices); + listindices0(r, buck[t.slotid1()].attr, indices1); + orderindices(indices, size); + } + void candidate(const tree t) { + proof prf; + listindices1(WK, t, prf); // assume WK odd + qsort(prf, PROOFSIZE, sizeof(u32), &compu32); + for (u32 i=1; i> (SLOTBITS-6); + binsizes[bsize]++; + } + for (u32 i=0; i < 65; i++) { +#ifdef HIST +// printf(" %d:%d", i, binsizes[i]); +#else +#ifdef SPARK + u32 sparks = binsizes[i] / SPARKSCALE; +#else + u32 sparks = 0; + for (u32 bs = binsizes[i]; bs; bs >>= 1) sparks++; + sparks = sparks * 7 / SPARKSCALE; +#endif +// printf("\342\226%c", '\201' + sparks); +#endif + } +// printf("\n"); +#endif + } + + struct htlayout { + htalloc hta; + u32 prevhashunits; + u32 nexthashunits; + u32 dunits; + u32 prevbo; + u32 nextbo; + + htlayout(equi *eq, u32 r): hta(eq->hta), prevhashunits(0), dunits(0) { + u32 nexthashbytes = hashsize(r); + nexthashunits = hashwords(nexthashbytes); + prevbo = 0; + nextbo = nexthashunits * sizeof(hashunit) - nexthashbytes; // 0-3 + if (r) { + u32 prevhashbytes = hashsize(r-1); + prevhashunits = hashwords(prevhashbytes); + prevbo = prevhashunits * sizeof(hashunit) - prevhashbytes; // 0-3 + dunits = prevhashunits - nexthashunits; + } + } + u32 getxhash0(const slot0* pslot) const { +#if WN == 200 && RESTBITS == 4 + return pslot->hash->bytes[prevbo] >> 4; +#elif WN == 200 && RESTBITS == 8 + return (pslot->hash->bytes[prevbo] & 0xf) << 4 | pslot->hash->bytes[prevbo+1] >> 4; +#elif WN == 200 && RESTBITS == 9 + return (pslot->hash->bytes[prevbo] & 0x1f) << 4 | pslot->hash->bytes[prevbo+1] >> 4; +#elif WN == 144 && RESTBITS == 4 + return pslot->hash->bytes[prevbo] & 0xf; +#else +#error non implemented +#endif + } + u32 getxhash1(const slot1* pslot) const { +#if WN == 200 && RESTBITS == 4 + return pslot->hash->bytes[prevbo] & 0xf; +#elif WN == 200 && RESTBITS == 8 + return pslot->hash->bytes[prevbo]; +#elif WN == 200 && RESTBITS == 9 + return (pslot->hash->bytes[prevbo]&1) << 8 | pslot->hash->bytes[prevbo+1]; +#elif WN == 144 && RESTBITS == 4 + return pslot->hash->bytes[prevbo] & 0xf; +#else +#error non implemented +#endif + } + bool equal(const hashunit *hash0, const hashunit *hash1) const { + return hash0[prevhashunits-1].word == hash1[prevhashunits-1].word; + } + }; + + struct collisiondata { +#ifdef XBITMAP +#if NSLOTS > 64 +#error cant use XBITMAP with more than 64 slots +#endif + u64 xhashmap[NRESTS]; + u64 xmap; +#else +#if RESTBITS <= 6 + typedef uchar xslot; +#else + typedef u16 xslot; +#endif + xslot nxhashslots[NRESTS]; + xslot xhashslots[NRESTS][XFULL]; + xslot *xx; + u32 n0; + u32 n1; +#endif + u32 s0; + + void clear() { +#ifdef XBITMAP + memset(xhashmap, 0, NRESTS * sizeof(u64)); +#else + memset(nxhashslots, 0, NRESTS * sizeof(xslot)); +#endif + } + bool addslot(u32 s1, u32 xh) { +#ifdef XBITMAP + xmap = xhashmap[xh]; + xhashmap[xh] |= (u64)1 << s1; + s0 = -1; + return true; +#else + n1 = (u32)nxhashslots[xh]++; + if (n1 >= XFULL) + return false; + xx = xhashslots[xh]; + xx[n1] = s1; + n0 = 0; + return true; +#endif + } + bool nextcollision() const { +#ifdef XBITMAP + return xmap != 0; +#else + return n0 < n1; +#endif + } + u32 slot() { +#ifdef XBITMAP + const u32 ffs = __builtin_ffsll(xmap); + s0 += ffs; xmap >>= ffs; + return s0; +#else + return (u32)xx[n0++]; +#endif + } + }; + + void digit0(const u32 id) { + uchar hash[HASHOUT]; + crypto_generichash_blake2b_state state; + htlayout htl(this, 0); + const u32 hashbytes = hashsize(0); + for (u32 block = id; block < NBLOCKS; block += nthreads) { + state = blake_ctx; + u32 leb = htole32(block); + crypto_generichash_blake2b_update(&state, (uchar *)&leb, sizeof(u32)); + crypto_generichash_blake2b_final(&state, hash, HASHOUT); + for (u32 i = 0; i> 4; +#elif BUCKBITS == 11 && RESTBITS == 9 + const u32 bucketid = ((u32)ph[0] << 3) | ph[1] >> 5; +#elif BUCKBITS == 20 && RESTBITS == 4 + const u32 bucketid = ((((u32)ph[0] << 8) | ph[1]) << 4) | ph[2] >> 4; +#elif BUCKBITS == 12 && RESTBITS == 4 + const u32 bucketid = ((u32)ph[0] << 4) | ph[1] >> 4; + const u32 xhash = ph[1] & 0xf; +#else +#error not implemented +#endif + const u32 slot = getslot(0, bucketid); + if (slot >= NSLOTS) { + bfull++; + continue; + } + slot0 &s = hta.trees0[0][bucketid][slot]; + s.attr = tree(block * HASHESPERBLAKE + i); + memcpy(s.hash->bytes+htl.nextbo, ph+WN/8-hashbytes, hashbytes); + } + } + } + + void digitodd(const u32 r, const u32 id) { + htlayout htl(this, r); + collisiondata cd; + for (u32 bucketid=id; bucketid < NBUCKETS; bucketid += nthreads) { + cd.clear(); + slot0 *buck = htl.hta.trees0[(r-1)/2][bucketid]; // optimize by updating previous buck?! + u32 bsize = getnslots(r-1, bucketid); // optimize by putting bucketsize with block?! + for (u32 s1 = 0; s1 < bsize; s1++) { + const slot0 *pslot1 = buck + s1; // optimize by updating previous pslot1?! + if (!cd.addslot(s1, htl.getxhash0(pslot1))) { + xfull++; + continue; + } + for (; cd.nextcollision(); ) { + const u32 s0 = cd.slot(); + const slot0 *pslot0 = buck + s0; + if (htl.equal(pslot0->hash, pslot1->hash)) { + hfull++; + continue; + } + u32 xorbucketid; + const uchar *bytes0 = pslot0->hash->bytes, *bytes1 = pslot1->hash->bytes; +#if WN == 200 && BUCKBITS == 12 && RESTBITS == 8 + xorbucketid = (((u32)(bytes0[htl.prevbo+1] ^ bytes1[htl.prevbo+1]) & 0xf) << 8) + | (bytes0[htl.prevbo+2] ^ bytes1[htl.prevbo+2]); +#elif WN == 200 && BUCKBITS == 11 && RESTBITS == 9 + xorbucketid = (((u32)(bytes0[htl.prevbo+1] ^ bytes1[htl.prevbo+1]) & 0xf) << 7) + | (bytes0[htl.prevbo+2] ^ bytes1[htl.prevbo+2]) >> 1; +#elif WN == 144 && BUCKBITS == 20 && RESTBITS == 4 + xorbucketid = ((((u32)(bytes0[htl.prevbo+1] ^ bytes1[htl.prevbo+1]) << 8) + | (bytes0[htl.prevbo+2] ^ bytes1[htl.prevbo+2])) << 4) + | (bytes0[htl.prevbo+3] ^ bytes1[htl.prevbo+3]) >> 4; +#elif WN == 96 && BUCKBITS == 12 && RESTBITS == 4 + xorbucketid = ((u32)(bytes0[htl.prevbo+1] ^ bytes1[htl.prevbo+1]) << 4) + | (bytes0[htl.prevbo+2] ^ bytes1[htl.prevbo+2]) >> 4; +#else +#error not implemented +#endif + const u32 xorslot = getslot(r, xorbucketid); + if (xorslot >= NSLOTS) { + bfull++; + continue; + } + slot1 &xs = htl.hta.trees1[r/2][xorbucketid][xorslot]; + xs.attr = tree(bucketid, s0, s1); + for (u32 i=htl.dunits; i < htl.prevhashunits; i++) + xs.hash[i-htl.dunits].word = pslot0->hash[i].word ^ pslot1->hash[i].word; + } + } + } + } + + void digiteven(const u32 r, const u32 id) { + htlayout htl(this, r); + collisiondata cd; + for (u32 bucketid=id; bucketid < NBUCKETS; bucketid += nthreads) { + cd.clear(); + slot1 *buck = htl.hta.trees1[(r-1)/2][bucketid]; // OPTIMIZE BY UPDATING PREVIOUS + u32 bsize = getnslots(r-1, bucketid); + for (u32 s1 = 0; s1 < bsize; s1++) { + const slot1 *pslot1 = buck + s1; // OPTIMIZE BY UPDATING PREVIOUS + if (!cd.addslot(s1, htl.getxhash1(pslot1))) { + xfull++; + continue; + } + for (; cd.nextcollision(); ) { + const u32 s0 = cd.slot(); + const slot1 *pslot0 = buck + s0; + if (htl.equal(pslot0->hash, pslot1->hash)) { + hfull++; + continue; + } + u32 xorbucketid; + const uchar *bytes0 = pslot0->hash->bytes, *bytes1 = pslot1->hash->bytes; +#if WN == 200 && BUCKBITS == 12 && RESTBITS == 8 + xorbucketid = ((u32)(bytes0[htl.prevbo+1] ^ bytes1[htl.prevbo+1]) << 4) + | (bytes0[htl.prevbo+2] ^ bytes1[htl.prevbo+2]) >> 4; +#elif WN == 200 && BUCKBITS == 11 && RESTBITS == 9 + xorbucketid = ((u32)(bytes0[htl.prevbo+2] ^ bytes1[htl.prevbo+2]) << 3) + | (bytes0[htl.prevbo+3] ^ bytes1[htl.prevbo+3]) >> 5; +#elif WN == 144 && BUCKBITS == 20 && RESTBITS == 4 + xorbucketid = ((((u32)(bytes0[htl.prevbo+1] ^ bytes1[htl.prevbo+1]) << 8) + | (bytes0[htl.prevbo+2] ^ bytes1[htl.prevbo+2])) << 4) + | (bytes0[htl.prevbo+3] ^ bytes1[htl.prevbo+3]) >> 4; +#elif WN == 96 && BUCKBITS == 12 && RESTBITS == 4 + xorbucketid = ((u32)(bytes0[htl.prevbo+1] ^ bytes1[htl.prevbo+1]) << 4) + | (bytes0[htl.prevbo+2] ^ bytes1[htl.prevbo+2]) >> 4; +#else +#error not implemented +#endif + const u32 xorslot = getslot(r, xorbucketid); + if (xorslot >= NSLOTS) { + bfull++; + continue; + } + slot0 &xs = htl.hta.trees0[r/2][xorbucketid][xorslot]; + xs.attr = tree(bucketid, s0, s1); + for (u32 i=htl.dunits; i < htl.prevhashunits; i++) + xs.hash[i-htl.dunits].word = pslot0->hash[i].word ^ pslot1->hash[i].word; + } + } + } + } + + void digitK(const u32 id) { + collisiondata cd; + htlayout htl(this, WK); +u32 nc = 0; + for (u32 bucketid = id; bucketid < NBUCKETS; bucketid += nthreads) { + cd.clear(); + slot0 *buck = htl.hta.trees0[(WK-1)/2][bucketid]; + u32 bsize = getnslots(WK-1, bucketid); + for (u32 s1 = 0; s1 < bsize; s1++) { + const slot0 *pslot1 = buck + s1; + if (!cd.addslot(s1, htl.getxhash0(pslot1))) // assume WK odd + continue; + for (; cd.nextcollision(); ) { + const u32 s0 = cd.slot(); + if (htl.equal(buck[s0].hash, pslot1->hash)) +nc++, candidate(tree(bucketid, s0, s1)); + } + } + } +//printf(" %d candidates ", nc); + } +}; + +typedef struct { + u32 id; + pthread_t thread; + equi *eq; +} thread_ctx; + +void barrier(pthread_barrier_t *barry) { + const int rc = pthread_barrier_wait(barry); + if (rc != 0 && rc != PTHREAD_BARRIER_SERIAL_THREAD) { +// printf("Could not wait on barrier\n"); + pthread_exit(NULL); + } +} + +void *worker(void *vp) { + thread_ctx *tp = (thread_ctx *)vp; + equi *eq = tp->eq; + + if (tp->id == 0) +// printf("Digit 0\n"); + barrier(&eq->barry); + eq->digit0(tp->id); + barrier(&eq->barry); + if (tp->id == 0) { + eq->xfull = eq->bfull = eq->hfull = 0; + eq->showbsizes(0); + } + barrier(&eq->barry); + for (u32 r = 1; r < WK; r++) { + if (tp->id == 0) +// printf("Digit %d", r); + barrier(&eq->barry); + r&1 ? eq->digitodd(r, tp->id) : eq->digiteven(r, tp->id); + barrier(&eq->barry); + if (tp->id == 0) { +// printf(" x%d b%d h%d\n", eq->xfull, eq->bfull, eq->hfull); + eq->xfull = eq->bfull = eq->hfull = 0; + eq->showbsizes(r); + } + barrier(&eq->barry); + } + if (tp->id == 0) +// printf("Digit %d\n", WK); + eq->digitK(tp->id); + barrier(&eq->barry); + pthread_exit(NULL); + return 0; +} diff --git a/src/pow/tromp/osx_barrier.h b/src/pow/tromp/osx_barrier.h new file mode 100644 index 000000000..da05b3552 --- /dev/null +++ b/src/pow/tromp/osx_barrier.h @@ -0,0 +1,70 @@ +#ifdef __APPLE__ + +#ifndef PTHREAD_BARRIER_H_ +#define PTHREAD_BARRIER_H_ + +#include +#include + +typedef int pthread_barrierattr_t; +#define PTHREAD_BARRIER_SERIAL_THREAD 1 + +typedef struct +{ + pthread_mutex_t mutex; + pthread_cond_t cond; + int count; + int tripCount; +} pthread_barrier_t; + + +int pthread_barrier_init(pthread_barrier_t *barrier, const pthread_barrierattr_t *attr, unsigned int count) +{ + if(count == 0) + { + errno = EINVAL; + return -1; + } + if(pthread_mutex_init(&barrier->mutex, 0) < 0) + { + return -1; + } + if(pthread_cond_init(&barrier->cond, 0) < 0) + { + pthread_mutex_destroy(&barrier->mutex); + return -1; + } + barrier->tripCount = count; + barrier->count = 0; + + return 0; +} + +int pthread_barrier_destroy(pthread_barrier_t *barrier) +{ + pthread_cond_destroy(&barrier->cond); + pthread_mutex_destroy(&barrier->mutex); + return 0; +} + +int pthread_barrier_wait(pthread_barrier_t *barrier) +{ + pthread_mutex_lock(&barrier->mutex); + ++(barrier->count); + if(barrier->count >= barrier->tripCount) + { + barrier->count = 0; + pthread_cond_broadcast(&barrier->cond); + pthread_mutex_unlock(&barrier->mutex); + return PTHREAD_BARRIER_SERIAL_THREAD; + } + else + { + pthread_cond_wait(&barrier->cond, &(barrier->mutex)); + pthread_mutex_unlock(&barrier->mutex); + return 0; + } +} + +#endif // PTHREAD_BARRIER_H_ +#endif // __APPLE__ diff --git a/src/primitives/transaction.cpp b/src/primitives/transaction.cpp index 1cedd6f27..399cd665a 100644 --- a/src/primitives/transaction.cpp +++ b/src/primitives/transaction.cpp @@ -41,6 +41,30 @@ JSDescription::JSDescription(ZCJoinSplit& params, ); } +JSDescription JSDescription::Randomized( + ZCJoinSplit& params, + const uint256& pubKeyHash, + const uint256& anchor, + boost::array& inputs, + boost::array& outputs, + boost::array& inputMap, + boost::array& outputMap, + CAmount vpub_old, + CAmount vpub_new, + bool computeProof, + std::function gen) +{ + // Randomize the order of the inputs and outputs + inputMap = {0, 1}; + outputMap = {0, 1}; + MappedShuffle(inputs.begin(), inputMap.begin(), ZC_NUM_JS_INPUTS, gen); + MappedShuffle(outputs.begin(), outputMap.begin(), ZC_NUM_JS_OUTPUTS, gen); + + return JSDescription( + params, pubKeyHash, anchor, inputs, outputs, + vpub_old, vpub_new, computeProof); +} + bool JSDescription::Verify( ZCJoinSplit& params, const uint256& pubKeyHash @@ -113,7 +137,7 @@ std::string CTxOut::ToString() const return strprintf("CTxOut(nValue=%d.%08d, scriptPubKey=%s)", nValue / COIN, nValue % COIN, scriptPubKey.ToString().substr(0,30)); } -CMutableTransaction::CMutableTransaction() : nVersion(CTransaction::CURRENT_VERSION), nLockTime(0) {} +CMutableTransaction::CMutableTransaction() : nVersion(CTransaction::MIN_CURRENT_VERSION), nLockTime(0) {} CMutableTransaction::CMutableTransaction(const CTransaction& tx) : nVersion(tx.nVersion), vin(tx.vin), vout(tx.vout), nLockTime(tx.nLockTime), vjoinsplit(tx.vjoinsplit), joinSplitPubKey(tx.joinSplitPubKey), joinSplitSig(tx.joinSplitSig) { @@ -130,7 +154,7 @@ void CTransaction::UpdateHash() const *const_cast(&hash) = SerializeHash(*this); } -CTransaction::CTransaction() : nVersion(CTransaction::CURRENT_VERSION), vin(), vout(), nLockTime(0), vjoinsplit(), joinSplitPubKey(), joinSplitSig() { } +CTransaction::CTransaction() : nVersion(CTransaction::MIN_CURRENT_VERSION), vin(), vout(), nLockTime(0), vjoinsplit(), joinSplitPubKey(), joinSplitSig() { } CTransaction::CTransaction(const CMutableTransaction &tx) : nVersion(tx.nVersion), vin(tx.vin), vout(tx.vout), nLockTime(tx.nLockTime), vjoinsplit(tx.vjoinsplit), joinSplitPubKey(tx.joinSplitPubKey), joinSplitSig(tx.joinSplitSig) diff --git a/src/primitives/transaction.h b/src/primitives/transaction.h index 61e756b2f..9a0e78ef4 100644 --- a/src/primitives/transaction.h +++ b/src/primitives/transaction.h @@ -7,9 +7,11 @@ #define BITCOIN_PRIMITIVES_TRANSACTION_H #include "amount.h" +#include "random.h" #include "script/script.h" #include "serialize.h" #include "uint256.h" +#include "consensus/consensus.h" #include @@ -52,7 +54,7 @@ public: // These contain trapdoors, values and other information // that the recipient needs, including a memo field. It // is encrypted using the scheme implemented in crypto/NoteEncryption.cpp - boost::array ciphertexts; + boost::array ciphertexts = {{ {{0}} }}; // Random seed uint256 randomSeed; @@ -78,6 +80,20 @@ public: bool computeProof = true // Set to false in some tests ); + static JSDescription Randomized( + ZCJoinSplit& params, + const uint256& pubKeyHash, + const uint256& rt, + boost::array& inputs, + boost::array& outputs, + boost::array& inputMap, + boost::array& outputMap, + CAmount vpub_old, + CAmount vpub_new, + bool computeProof = true, // Set to false in some tests + std::function gen = GetRandInt + ); + // Verifies that the JoinSplit proof is correct. bool Verify(ZCJoinSplit& params, const uint256& pubKeyHash) const; @@ -293,7 +309,12 @@ private: public: typedef boost::array joinsplit_sig_t; - static const int32_t CURRENT_VERSION=1; + // Transactions that include a list of JoinSplits are version 2. + static const int32_t MIN_CURRENT_VERSION = 1; + static const int32_t MAX_CURRENT_VERSION = 2; + + static_assert(MIN_CURRENT_VERSION >= MIN_TX_VERSION, + "standard rule for tx version should be consistent with network rule"); // The local variables are made const to prevent unintended modification // without updating the cached hash value. However, CTransaction is not @@ -306,7 +327,7 @@ public: const uint32_t nLockTime; const std::vector vjoinsplit; const uint256 joinSplitPubKey; - const joinsplit_sig_t joinSplitSig; + const joinsplit_sig_t joinSplitSig = {{0}}; /** Construct a CTransaction that qualifies as IsNull() */ CTransaction(); @@ -385,7 +406,7 @@ struct CMutableTransaction uint32_t nLockTime; std::vector vjoinsplit; uint256 joinSplitPubKey; - CTransaction::joinsplit_sig_t joinSplitSig; + CTransaction::joinsplit_sig_t joinSplitSig = {{0}}; CMutableTransaction(); CMutableTransaction(const CTransaction& tx); diff --git a/src/random.h b/src/random.h index 1a2d3e8ee..1f6f7fef5 100644 --- a/src/random.h +++ b/src/random.h @@ -8,6 +8,7 @@ #include "uint256.h" +#include #include /** @@ -24,6 +25,31 @@ uint64_t GetRand(uint64_t nMax); int GetRandInt(int nMax); uint256 GetRandHash(); +/** + * Rearranges the elements in the range [first,first+len) randomly, assuming + * that gen is a uniform random number generator. Follows the same algorithm as + * std::shuffle in C++11 (a Durstenfeld shuffle). + * + * The elements in the range [mapFirst,mapFirst+len) are rearranged according to + * the same permutation, enabling the permutation to be tracked by the caller. + * + * gen takes an integer n and produces a uniform random output in [0,n). + */ +template +void MappedShuffle(RandomAccessIterator first, + MapRandomAccessIterator mapFirst, + size_t len, + std::function gen) +{ + for (size_t i = len-1; i > 0; --i) { + auto r = gen(i+1); + assert(r >= 0); + assert(r <= i); + std::swap(first[i], first[r]); + std::swap(mapFirst[i], mapFirst[r]); + } +} + /** * Seed insecure_rand using the random pool. * @param Deterministic Use a deterministic seed diff --git a/src/rpcmining.cpp b/src/rpcmining.cpp index 2e4ebd113..0808bc9ad 100644 --- a/src/rpcmining.cpp +++ b/src/rpcmining.cpp @@ -11,6 +11,7 @@ #include "crypto/equihash.h" #include "init.h" #include "main.h" +#include "metrics.h" #include "miner.h" #include "net.h" #include "pow.h" @@ -195,15 +196,20 @@ Value generate(const Array& params, bool fHelp) { LOCK(cs_main); pblock->nSolution = soln; + solutionTargetChecks.increment(); return CheckProofOfWork(chainActive.Height(),NOTARY_PUBKEY33,pblock->GetHash(), pblock->nBits, Params().GetConsensus()); }; - if (EhBasicSolveUncancellable(n, k, curr_state, validBlock)) + bool found = EhBasicSolveUncancellable(n, k, curr_state, validBlock); + ehSolverRuns.increment(); + if (found) { goto endloop; + } } endloop: CValidationState state; if (!ProcessNewBlock(state, NULL, pblock, true, NULL)) throw JSONRPCError(RPC_INTERNAL_ERROR, "ProcessNewBlock, block not accepted"); + minedBlocks.increment(); ++nHeight; blockHashes.push_back(pblock->GetHash().GetHex()); } @@ -393,10 +399,10 @@ Value getblocktemplate(const Array& params, bool fHelp) " }\n" " ,...\n" " ],\n" - " \"coinbaseaux\" : { (json object) data that should be included in the coinbase's scriptSig content\n" - " \"flags\" : \"flags\" (string) \n" - " },\n" - " \"coinbasevalue\" : n, (numeric) maximum allowable input to coinbase transaction, including the generation award and transaction fees (in Satoshis)\n" +// " \"coinbaseaux\" : { (json object) data that should be included in the coinbase's scriptSig content\n" +// " \"flags\" : \"flags\" (string) \n" +// " },\n" +// " \"coinbasevalue\" : n, (numeric) maximum allowable input to coinbase transaction, including the generation award and transaction fees (in Satoshis)\n" " \"coinbasetxn\" : { ... }, (json object) information for coinbase transaction\n" " \"target\" : \"xxxx\", (string) The hash target\n" " \"mintime\" : xxx, (numeric) The minimum timestamp appropriate for next block time in seconds since epoch (Jan 1 1970 GMT)\n" @@ -419,8 +425,15 @@ Value getblocktemplate(const Array& params, bool fHelp) LOCK(cs_main); + // Wallet is required because we support coinbasetxn + if (pwalletMain == NULL) { + throw JSONRPCError(RPC_METHOD_NOT_FOUND, "Method not found (disabled)"); + } + std::string strMode = "template"; Value lpval = Value::null; + // TODO: Re-enable coinbasevalue once a specification has been written + bool coinbasetxn = true; if (params.size() > 0) { const Object& oparam = params[0].get_obj(); @@ -533,7 +546,7 @@ Value getblocktemplate(const Array& params, bool fHelp) // Clear pindexPrev so future calls make a new block, despite any failures from here on pindexPrev = NULL; - // Store the pindexBest used before CreateNewBlock, to avoid races + // Store the pindexBest used before CreateNewBlockWithKey, to avoid races nTransactionsUpdatedLast = mempool.GetTransactionsUpdated(); CBlockIndex* pindexPrevNew = chainActive.Tip(); nStart = GetTime(); @@ -544,12 +557,12 @@ Value getblocktemplate(const Array& params, bool fHelp) delete pblocktemplate; pblocktemplate = NULL; } - CScript scriptDummy = CScript() << OP_TRUE; - pblocktemplate = CreateNewBlock(scriptDummy); + CReserveKey reservekey(pwalletMain); + pblocktemplate = CreateNewBlockWithKey(reservekey); if (!pblocktemplate) throw JSONRPCError(RPC_OUT_OF_MEMORY, "Out of memory"); - // Need to update only after we know CreateNewBlock succeeded + // Need to update only after we know CreateNewBlockWithKey succeeded pindexPrev = pindexPrevNew; } CBlock* pblock = &pblocktemplate->block; // pointer for convenience @@ -560,6 +573,7 @@ Value getblocktemplate(const Array& params, bool fHelp) static const Array aCaps = boost::assign::list_of("proposal"); + Value txCoinbase = Value::null; Array transactions; map setTxIndex; int i = 0; @@ -568,7 +582,7 @@ Value getblocktemplate(const Array& params, bool fHelp) uint256 txHash = tx.GetHash(); setTxIndex[txHash] = i++; - if (tx.IsCoinBase()) + if (tx.IsCoinBase() && !coinbasetxn) continue; Object entry; @@ -589,7 +603,17 @@ Value getblocktemplate(const Array& params, bool fHelp) entry.push_back(Pair("fee", pblocktemplate->vTxFees[index_in_template])); entry.push_back(Pair("sigops", pblocktemplate->vTxSigOps[index_in_template])); - transactions.push_back(entry); + if (tx.IsCoinBase()) { + // Show founders' reward if it is required + if (pblock->vtx[0].vout.size() > 1) { + // Correct this if GetBlockTemplate changes the order + entry.push_back(Pair("foundersreward", (int64_t)tx.vout[1].nValue)); + } + entry.push_back(Pair("required", true)); + txCoinbase = entry; + } else { + transactions.push_back(entry); + } } Object aux; @@ -610,8 +634,13 @@ Value getblocktemplate(const Array& params, bool fHelp) result.push_back(Pair("version", pblock->nVersion)); result.push_back(Pair("previousblockhash", pblock->hashPrevBlock.GetHex())); result.push_back(Pair("transactions", transactions)); - result.push_back(Pair("coinbaseaux", aux)); - result.push_back(Pair("coinbasevalue", (int64_t)pblock->vtx[0].vout[0].nValue)); + if (coinbasetxn) { + assert(txCoinbase.type() == obj_type); + result.push_back(Pair("coinbasetxn", txCoinbase)); + } else { + result.push_back(Pair("coinbaseaux", aux)); + result.push_back(Pair("coinbasevalue", (int64_t)pblock->vtx[0].vout[0].nValue)); + } result.push_back(Pair("longpollid", chainActive.Tip()->GetBlockHash().GetHex() + i64tostr(nTransactionsUpdatedLast))); result.push_back(Pair("target", hashTarget.GetHex())); result.push_back(Pair("mintime", (int64_t)pindexPrev->GetMedianTimePast()+1)); diff --git a/src/rpcserver.cpp b/src/rpcserver.cpp index 8b72e6986..801a4ff95 100644 --- a/src/rpcserver.cpp +++ b/src/rpcserver.cpp @@ -627,16 +627,16 @@ void StartRPCThreads() unsigned char rand_pwd[32]; GetRandBytes(rand_pwd, 32); uiInterface.ThreadSafeMessageBox(strprintf( - _("To use bitcoind, or the -server option to komodo-qt, you must set an rpcpassword in the configuration file:\n" + _("To use komodod you must set an rpcpassword in the configuration file:\n" "%s\n" "It is recommended you use the following random password:\n" - "rpcuser=bitcoinrpc\n" + "rpcuser=zcashrpc\n" "rpcpassword=%s\n" "(you do not need to remember this password)\n" "The username and password MUST NOT be the same.\n" "If the file does not exist, create it with owner-readable-only file permissions.\n" "It is also recommended to set alertnotify so you are notified of problems;\n" - "for example: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com\n"), + "for example: alertnotify=echo %%s | mail -s \"Zcash Alert\" admin@foo.com\n"), GetConfigFile().string(), EncodeBase58(&rand_pwd[0],&rand_pwd[0]+32)), "", CClientUIInterface::MSG_ERROR | CClientUIInterface::SECURE); @@ -1073,7 +1073,7 @@ json_spirit::Value CRPCTable::execute(const std::string &strMethod, const json_s } std::string HelpExampleCli(string methodname, string args){ - return "> bitcoin-cli " + methodname + " " + args + "\n"; + return "> zcash-cli " + methodname + " " + args + "\n"; } std::string HelpExampleRpc(string methodname, string args){ diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index 41e0441a8..6c17eab70 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -252,7 +252,7 @@ bool EvalScript(vector >& stack, const CScript& script, un vector vfExec; vector altstack; set_error(serror, SCRIPT_ERR_UNKNOWN_ERROR); - if (script.size() > 10000) + if (script.size() > MAX_SCRIPT_SIZE) return set_error(serror, SCRIPT_ERR_SCRIPT_SIZE); int nOpCount = 0; bool fRequireMinimal = (flags & SCRIPT_VERIFY_MINIMALDATA) != 0; diff --git a/src/script/script.h b/src/script/script.h index 79bd61630..e0e89185f 100644 --- a/src/script/script.h +++ b/src/script/script.h @@ -19,6 +19,9 @@ static const unsigned int MAX_SCRIPT_ELEMENT_SIZE = 520; // bytes +// Maximum script length in bytes +static const int MAX_SCRIPT_SIZE = 10000; + // Threshold for nLockTime: below this value it is interpreted as block number, // otherwise as UNIX timestamp. static const unsigned int LOCKTIME_THRESHOLD = 500000000; // Tue Nov 5 00:53:20 1985 UTC @@ -570,7 +573,7 @@ public: */ bool IsUnspendable() const { - return (size() > 0 && *begin() == OP_RETURN); + return (size() > 0 && *begin() == OP_RETURN) || (size() > MAX_SCRIPT_SIZE); } std::string ToString() const; diff --git a/src/script/bitcoinconsensus.cpp b/src/script/zcashconsensus.cpp similarity index 78% rename from src/script/bitcoinconsensus.cpp rename to src/script/zcashconsensus.cpp index b0d5faaf7..d66cf21c0 100644 --- a/src/script/bitcoinconsensus.cpp +++ b/src/script/zcashconsensus.cpp @@ -3,7 +3,7 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#include "bitcoinconsensus.h" +#include "zcashconsensus.h" #include "primitives/transaction.h" #include "script/interpreter.h" @@ -53,7 +53,7 @@ private: size_t m_remaining; }; -inline int set_error(bitcoinconsensus_error* ret, bitcoinconsensus_error serror) +inline int set_error(zcashconsensus_error* ret, zcashconsensus_error serror) { if (ret) *ret = serror; @@ -62,30 +62,30 @@ inline int set_error(bitcoinconsensus_error* ret, bitcoinconsensus_error serror) } // anon namespace -int bitcoinconsensus_verify_script(const unsigned char *scriptPubKey, unsigned int scriptPubKeyLen, +int zcashconsensus_verify_script(const unsigned char *scriptPubKey, unsigned int scriptPubKeyLen, const unsigned char *txTo , unsigned int txToLen, - unsigned int nIn, unsigned int flags, bitcoinconsensus_error* err) + unsigned int nIn, unsigned int flags, zcashconsensus_error* err) { try { TxInputStream stream(SER_NETWORK, PROTOCOL_VERSION, txTo, txToLen); CTransaction tx; stream >> tx; if (nIn >= tx.vin.size()) - return set_error(err, bitcoinconsensus_ERR_TX_INDEX); + return set_error(err, zcashconsensus_ERR_TX_INDEX); if (tx.GetSerializeSize(SER_NETWORK, PROTOCOL_VERSION) != txToLen) - return set_error(err, bitcoinconsensus_ERR_TX_SIZE_MISMATCH); + return set_error(err, zcashconsensus_ERR_TX_SIZE_MISMATCH); // Regardless of the verification result, the tx did not error. - set_error(err, bitcoinconsensus_ERR_OK); + set_error(err, zcashconsensus_ERR_OK); return VerifyScript(tx.vin[nIn].scriptSig, CScript(scriptPubKey, scriptPubKey + scriptPubKeyLen), flags, TransactionSignatureChecker(&tx, nIn), NULL); } catch (const std::exception&) { - return set_error(err, bitcoinconsensus_ERR_TX_DESERIALIZE); // Error deserializing + return set_error(err, zcashconsensus_ERR_TX_DESERIALIZE); // Error deserializing } } -unsigned int bitcoinconsensus_version() +unsigned int zcashconsensus_version() { // Just use the API version for now - return BITCOINCONSENSUS_API_VER; + return ZCASHCONSENSUS_API_VER; } diff --git a/src/script/bitcoinconsensus.h b/src/script/zcashconsensus.h similarity index 57% rename from src/script/bitcoinconsensus.h rename to src/script/zcashconsensus.h index a48ff1e18..a68921d90 100644 --- a/src/script/bitcoinconsensus.h +++ b/src/script/zcashconsensus.h @@ -3,8 +3,8 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#ifndef BITCOIN_BITCOINCONSENSUS_H -#define BITCOIN_BITCOINCONSENSUS_H +#ifndef BITCOIN_ZCASHCONSENSUS_H +#define BITCOIN_ZCASHCONSENSUS_H #if defined(BUILD_BITCOIN_INTERNAL) && defined(HAVE_CONFIG_H) #include "config/bitcoin-config.h" @@ -19,7 +19,7 @@ #elif defined(HAVE_FUNC_ATTRIBUTE_VISIBILITY) #define EXPORT_SYMBOL __attribute__ ((visibility ("default"))) #endif -#elif defined(MSC_VER) && !defined(STATIC_LIBBITCOINCONSENSUS) +#elif defined(MSC_VER) && !defined(STATIC_LIBZCASHCONSENSUS) #define EXPORT_SYMBOL __declspec(dllimport) #endif @@ -31,34 +31,34 @@ extern "C" { #endif -#define BITCOINCONSENSUS_API_VER 0 +#define ZCASHCONSENSUS_API_VER 0 -typedef enum bitcoinconsensus_error_t +typedef enum zcashconsensus_error_t { - bitcoinconsensus_ERR_OK = 0, - bitcoinconsensus_ERR_TX_INDEX, - bitcoinconsensus_ERR_TX_SIZE_MISMATCH, - bitcoinconsensus_ERR_TX_DESERIALIZE, -} bitcoinconsensus_error; + zcashconsensus_ERR_OK = 0, + zcashconsensus_ERR_TX_INDEX, + zcashconsensus_ERR_TX_SIZE_MISMATCH, + zcashconsensus_ERR_TX_DESERIALIZE, +} zcashconsensus_error; /** Script verification flags */ enum { - bitcoinconsensus_SCRIPT_FLAGS_VERIFY_NONE = 0, - bitcoinconsensus_SCRIPT_FLAGS_VERIFY_P2SH = (1U << 0), // evaluate P2SH (BIP16) subscripts - bitcoinconsensus_SCRIPT_FLAGS_VERIFY_DERSIG = (1U << 2), // enforce strict DER (BIP66) compliance - bitcoinconsensus_SCRIPT_FLAGS_VERIFY_CHECKLOCKTIMEVERIFY = (1U << 9), // enable CHECKLOCKTIMEVERIFY (BIP65) + zcashconsensus_SCRIPT_FLAGS_VERIFY_NONE = 0, + zcashconsensus_SCRIPT_FLAGS_VERIFY_P2SH = (1U << 0), // evaluate P2SH (BIP16) subscripts + zcashconsensus_SCRIPT_FLAGS_VERIFY_DERSIG = (1U << 2), // enforce strict DER (BIP66) compliance + zcashconsensus_SCRIPT_FLAGS_VERIFY_CHECKLOCKTIMEVERIFY = (1U << 9), // enable CHECKLOCKTIMEVERIFY (BIP65) }; /// Returns 1 if the input nIn of the serialized transaction pointed to by /// txTo correctly spends the scriptPubKey pointed to by scriptPubKey under /// the additional constraints specified by flags. /// If not NULL, err will contain an error/success code for the operation -EXPORT_SYMBOL int bitcoinconsensus_verify_script(const unsigned char *scriptPubKey, unsigned int scriptPubKeyLen, +EXPORT_SYMBOL int zcashconsensus_verify_script(const unsigned char *scriptPubKey, unsigned int scriptPubKeyLen, const unsigned char *txTo , unsigned int txToLen, - unsigned int nIn, unsigned int flags, bitcoinconsensus_error* err); + unsigned int nIn, unsigned int flags, zcashconsensus_error* err); -EXPORT_SYMBOL unsigned int bitcoinconsensus_version(); +EXPORT_SYMBOL unsigned int zcashconsensus_version(); #ifdef __cplusplus } // extern "C" @@ -66,4 +66,4 @@ EXPORT_SYMBOL unsigned int bitcoinconsensus_version(); #undef EXPORT_SYMBOL -#endif // BITCOIN_BITCOINCONSENSUS_H +#endif // BITCOIN_ZCASHCONSENSUS_H diff --git a/src/sendalert.cpp b/src/sendalert.cpp index 6fac530e2..aed9b7682 100644 --- a/src/sendalert.cpp +++ b/src/sendalert.cpp @@ -76,9 +76,9 @@ void ThreadSendAlert() alert.nCancel = 0; // cancels previous messages up to this ID number // These versions are protocol versions - // 70002 : 0.11.2.* - alert.nMinVer = 70002; - alert.nMaxVer = 70002; + // 170002 : 1.0.0 + alert.nMinVer = 170002; + alert.nMaxVer = 170002; // // main.cpp: diff --git a/src/streams.h b/src/streams.h index 787d8e297..9b678b3c0 100644 --- a/src/streams.h +++ b/src/streams.h @@ -241,7 +241,9 @@ public: CBaseDataStream& ignore(int nSize) { // Ignore from the beginning of the buffer - assert(nSize >= 0); + if (nSize < 0) { + throw std::ios_base::failure("CDataStream::ignore(): nSize negative"); + } unsigned int nReadPosNext = nReadPos + nSize; if (nReadPosNext >= vch.size()) { @@ -406,6 +408,20 @@ public: return (*this); } + CAutoFile& ignore(size_t nSize) + { + if (!file) + throw std::ios_base::failure("CAutoFile::ignore: file handle is NULL"); + unsigned char data[4096]; + while (nSize > 0) { + size_t nNow = std::min(nSize, sizeof(data)); + if (fread(data, 1, nNow, file) != nNow) + throw std::ios_base::failure(feof(file) ? "CAutoFile::ignore: end of file" : "CAutoFile::read: fread failed"); + nSize -= nNow; + } + return (*this); + } + CAutoFile& write(const char* pch, size_t nSize) { if (!file) diff --git a/src/test/coins_tests.cpp b/src/test/coins_tests.cpp index 695a8b05d..8f626d9ab 100644 --- a/src/test/coins_tests.cpp +++ b/src/test/coins_tests.cpp @@ -4,11 +4,14 @@ #include "coins.h" #include "random.h" +#include "script/standard.h" #include "uint256.h" +#include "utilstrencodings.h" #include "test/test_bitcoin.h" #include "consensus/validation.h" #include "main.h" #include "undo.h" +#include "pubkey.h" #include #include @@ -524,4 +527,73 @@ BOOST_AUTO_TEST_CASE(coins_coinbase_spends) } } +BOOST_AUTO_TEST_CASE(ccoins_serialization) +{ + // Good example + CDataStream ss1(ParseHex("0104835800816115944e077fe7c803cfa57f29b36bf87c1d358bb85e"), SER_DISK, CLIENT_VERSION); + CCoins cc1; + ss1 >> cc1; + BOOST_CHECK_EQUAL(cc1.nVersion, 1); + BOOST_CHECK_EQUAL(cc1.fCoinBase, false); + BOOST_CHECK_EQUAL(cc1.nHeight, 203998); + BOOST_CHECK_EQUAL(cc1.vout.size(), 2); + BOOST_CHECK_EQUAL(cc1.IsAvailable(0), false); + BOOST_CHECK_EQUAL(cc1.IsAvailable(1), true); + BOOST_CHECK_EQUAL(cc1.vout[1].nValue, 60000000000ULL); + BOOST_CHECK_EQUAL(HexStr(cc1.vout[1].scriptPubKey), HexStr(GetScriptForDestination(CKeyID(uint160(ParseHex("816115944e077fe7c803cfa57f29b36bf87c1d35")))))); + + // Good example + CDataStream ss2(ParseHex("0109044086ef97d5790061b01caab50f1b8e9c50a5057eb43c2d9563a4eebbd123008c988f1a4a4de2161e0f50aac7f17e7f9555caa486af3b"), SER_DISK, CLIENT_VERSION); + CCoins cc2; + ss2 >> cc2; + BOOST_CHECK_EQUAL(cc2.nVersion, 1); + BOOST_CHECK_EQUAL(cc2.fCoinBase, true); + BOOST_CHECK_EQUAL(cc2.nHeight, 120891); + BOOST_CHECK_EQUAL(cc2.vout.size(), 17); + for (int i = 0; i < 17; i++) { + BOOST_CHECK_EQUAL(cc2.IsAvailable(i), i == 4 || i == 16); + } + BOOST_CHECK_EQUAL(cc2.vout[4].nValue, 234925952); + BOOST_CHECK_EQUAL(HexStr(cc2.vout[4].scriptPubKey), HexStr(GetScriptForDestination(CKeyID(uint160(ParseHex("61b01caab50f1b8e9c50a5057eb43c2d9563a4ee")))))); + BOOST_CHECK_EQUAL(cc2.vout[16].nValue, 110397); + BOOST_CHECK_EQUAL(HexStr(cc2.vout[16].scriptPubKey), HexStr(GetScriptForDestination(CKeyID(uint160(ParseHex("8c988f1a4a4de2161e0f50aac7f17e7f9555caa4")))))); + + // Smallest possible example + CDataStream ssx(SER_DISK, CLIENT_VERSION); + BOOST_CHECK_EQUAL(HexStr(ssx.begin(), ssx.end()), ""); + + CDataStream ss3(ParseHex("0002000600"), SER_DISK, CLIENT_VERSION); + CCoins cc3; + ss3 >> cc3; + BOOST_CHECK_EQUAL(cc3.nVersion, 0); + BOOST_CHECK_EQUAL(cc3.fCoinBase, false); + BOOST_CHECK_EQUAL(cc3.nHeight, 0); + BOOST_CHECK_EQUAL(cc3.vout.size(), 1); + BOOST_CHECK_EQUAL(cc3.IsAvailable(0), true); + BOOST_CHECK_EQUAL(cc3.vout[0].nValue, 0); + BOOST_CHECK_EQUAL(cc3.vout[0].scriptPubKey.size(), 0); + + // scriptPubKey that ends beyond the end of the stream + CDataStream ss4(ParseHex("0002000800"), SER_DISK, CLIENT_VERSION); + try { + CCoins cc4; + ss4 >> cc4; + BOOST_CHECK_MESSAGE(false, "We should have thrown"); + } catch (const std::ios_base::failure& e) { + } + + // Very large scriptPubKey (3*10^9 bytes) past the end of the stream + CDataStream tmp(SER_DISK, CLIENT_VERSION); + uint64_t x = 3000000000ULL; + tmp << VARINT(x); + BOOST_CHECK_EQUAL(HexStr(tmp.begin(), tmp.end()), "8a95c0bb00"); + CDataStream ss5(ParseHex("0002008a95c0bb0000"), SER_DISK, CLIENT_VERSION); + try { + CCoins cc5; + ss5 >> cc5; + BOOST_CHECK_MESSAGE(false, "We should have thrown"); + } catch (const std::ios_base::failure& e) { + } +} + BOOST_AUTO_TEST_SUITE_END() diff --git a/src/test/data/bitcoin-util-test.json b/src/test/data/bitcoin-util-test.json index ddcff21cb..e30c53759 100644 --- a/src/test/data/bitcoin-util-test.json +++ b/src/test/data/bitcoin-util-test.json @@ -1,39 +1,39 @@ [ - { "exec": "././bitcoin-tx", + { "exec": "././zcash-tx", "args": ["-create"], "output_cmp": "blanktx.hex" }, - { "exec": "./bitcoin-tx", + { "exec": "./zcash-tx", "args": ["-"], "input": "blanktx.hex", "output_cmp": "blanktx.hex" }, - { "exec": "./bitcoin-tx", + { "exec": "./zcash-tx", "args": ["-", "delin=1"], "input": "tx394b54bb.hex", "output_cmp": "tt-delin1-out.hex" }, - { "exec": "./bitcoin-tx", + { "exec": "./zcash-tx", "args": ["-", "delin=31"], "input": "tx394b54bb.hex", "return_code": 1 }, - { "exec": "./bitcoin-tx", + { "exec": "./zcash-tx", "args": ["-", "delout=1"], "input": "tx394b54bb.hex", "output_cmp": "tt-delout1-out.hex" }, - { "exec": "./bitcoin-tx", + { "exec": "./zcash-tx", "args": ["-", "delout=2"], "input": "tx394b54bb.hex", "return_code": 1 }, - { "exec": "./bitcoin-tx", + { "exec": "./zcash-tx", "args": ["-", "locktime=317000"], "input": "tx394b54bb.hex", "output_cmp": "tt-locktime317000-out.hex" }, - { "exec": "./bitcoin-tx", + { "exec": "./zcash-tx", "args": ["-create", "in=5897de6bd6027a475eadd57019d4e6872c396d0716c4875a5f1a6fcfdf385c1f:0", @@ -43,11 +43,11 @@ "outaddr=4:t1g1aXFye74HKJ24VviTxo3AW4BZbyCni5H"], "output_cmp": "txcreate1.hex" }, - { "exec": "./bitcoin-tx", + { "exec": "./zcash-tx", "args": ["-create", "outscript=0:"], "output_cmp": "txcreate2.hex" }, - { "exec": "./bitcoin-tx", + { "exec": "./zcash-tx", "args": ["-create", "in=4d49a71ec9da436f71ec4ee231d04f292a29cd316f598bb7068feccabdc59485:0", diff --git a/src/test/miner_tests.cpp b/src/test/miner_tests.cpp index 7b145c833..4a960df76 100644 --- a/src/test/miner_tests.cpp +++ b/src/test/miner_tests.cpp @@ -10,6 +10,7 @@ #include "uint256.h" #include "util.h" #include "crypto/equihash.h" +//#include "pow/tromp/equi_miner.h" #include "test/test_bitcoin.h" @@ -22,129 +23,122 @@ struct { const char *nonce_hex; const char *solution_hex; } blockinfo[] = { - {"0000000000000000000000000000000000000000000000000000000000000002", "0062c7093da54f87eead77f84d7fee9e2319dadb6c00641fb26b0d790d3ed9256c1f6c5eb9655ff19c3003f1f0247083fe485a57d0c8b587366de366d46a0a1505131d3ea438b5914d243cfcfcc435b61e7d8fc90df1bcf93e9cefbb9abdf360abc70520e71ecfe98d4cd3dc9378ab29d1cdf0276bdcc0cda308157e88b8450a2a74621e86196f339b591a5bfe9f1cd9b92aea59d14dc794672f9f50635621f65ddc4e09d619e0f2098f33fad34a83766d60e258aebec7d123c13db1bf31280b4caa962b359418c3d3d1dfbe1e26faf5b60d28afe2770d515a5924a51705677df5a5f6b1d7f6753a9c26aed06403a599ed741a3371c1c5cff5b15edd131ba5aa7b4ac8d6e18c22585f2c62c532472da095132d16e68daeb06fc7c99137cfde70be310e16ff05186ff94d2eb6a759caedf4ea3b39e4c79f37dfc6e228e175d314941b45bb37f42c05ebe9c1162efa6f7d0235f8f9ad6bd519c73d951d2631d07b6cac7e01d5042ff8f6f6c9f05ad061c19f361aee3710f4b8c402221ea321208bc45bf0ce76b39b3960ea071533d2c224147cb7d4d51944ac8022adaf5cffa9b7996fafa0100e369be132ca11ee24257113bee1fe1e09f23876347089ea318dd6ebf251a7b567d3401df4dbbf5b1910180bc59985e4d4a9de17098a7e451e65f6d39e6910b59c8092c67ead274b93a4be60363947f35833c50350c17d05454bf51e6ac0f4d310851485362acda31bea66f183c70157b35c52e799ff4a2d8103109b811f4656e45719eedde6505809677157ce6e0355bbc23eb05283739161e6ccd61427c636de6d990473ab7f107e0df94cdd6fb5db2401a91cccc73dffc4353d592842f3af291219f33811736274a9bd98e5c50cb512366b7768e76c8e1bcc7f356f97b9ffc1c1dbf5227647653c27a73c2135f530079098621189e5915ae60f01e24c8f4a5decf4fced803641e9d4a4e735a7cbb00bce7f5fd01b5d698f63c31afb731bad10c6dfbb751d85d56702f1dd69e2e9140626745aea4b147416d12441c61d8ea5fec9e0f314343ec5b95599a694043e11a4877f51cc4d55fcf837c698c11aa2dc4a3ba5ca7b12b748f5728515f3dfca43075db937a6d1ffa8a411f8fcd3f50b9929c1e544390c2a3f378781feca341902279120d59251af33a4d295c3daca84e4d60ed30b332de62746e22eddf4470d01ca3c33385d3c7c6320df44b19e214a9b7bb77b0465f6c79ed68b59b7e20e3d4a379cc8b506d0df45d80479413626fcb26d5c15cd3a7bcd668da78cd2f26bdae279558e99ed482f0f544b535637e6cdd472c3d63e5aed2d215c9e446f1d77843d9c0e961cbe03726d2d9f59df4ed9bd31432a32f677a44df203a9bce44e4f4829e14c200e078577398fe4cfe3017d409158583a7dbb67e693df9f20020262b88013d02f3fd571ca8042d4ae81d05ea3ab05a70992c917cb3cefab32e8dadef8c21ea5f5c29805a0d82ff4c1f4a5239c6320a3a2ac3142b83d004313ff2e3eb297a614d56763ead9507d0f84f49ecdb2066b340ecb4b6853600ce3c15053b591667976b550073d698e9ae00b9501c9c0c35190d2ae20e0989cf321fe73c0f624447b4a9ed2a190f1c7791126cdd4f853df1ee72ce2289fbbe17685f4e3b25a307df5088605337105c3c5be1d08d346550dd50826f46abd250f164b59418f4e7c5e8ad3f4e200a80c296f38b95e31160d86b504f0c829aa9656bf367abfc1d4473e7eeb6138747bb4dc7eeb61681705e0e896ce7517fec5a908fa916da1d159a6c11a87d273f246329deb16a2781f380becd3da019f92da360007eaf185cfec31edf70d74ac1ddf231ac16b59a1d5ecb34647966fdecafb12222f660808b5575e07e1e3863124f8d426587903"}, - {"0000000000000000000000000000000000000000000000000000000000000002", "000450a9d3646c057855f0e659c99134eb7f34e7ba629c5d1ffba1155bc365b6654a74bf79b458d895b113c7cfb3f2ee2b6d9ca3c6cfc1fb80d7a1915f70f75a86eaf3bcb73df1ea17474835cb878e570b5590990f9f2e16404e8c4eec9fd1c623f5b3aa28e61c285b1444ffb531c938a28c41c2eb0364388f7c187c5ec316c95ea3d1563f61d0eafb1c6779cce30bc8fa00201d4e8d0bc453ba9976c2e8e379f044039a38bd8480008292852695463bde2003ac75ab71cb4ea57ff3de028e211f098b05611bb8f644176f48ba1cb7b50c5b052d80729101b1940eb0616da035f4a51c3b5fb4bb077983db3a56d56dfbfd1098ae6576d151be1cb7f00a3c3f26281c53ed2dbaa466e5a920e16126115f4c15060b7fcbd7c609405c517efc6995a5ed045b9d8418425fd6be63c1c1bdd0a61f26f4606afcbe5a8bd11f05ae8a3827049995b913c9482b6e0e6a4bb6a9e801af884a1cc5fe9959515908817f11536228dc9f943646fe084c1e11e9666143dfb267adc1db10dc5ffe0720d2592d4a3b8337b25087bdefdc3b761b3e5aa64723caea331213be9a713474e1c8b2deffad1ef6af16811cafa01ed98f78d4f1723d4a40452a606e6ce92e9e2a9e93cc982ae84267be4474598b1d609db72c309ec28e1d24e96b890833f88f70afb9885773083746490df51b54a815cf37b645c67532d2446d7cc1d90961df0d170b25aeb56768db10612f2a76bf748cee0f0e2b45ba88a0c7a44a841202536da565654d7be22a645d07a29ed747edb8b3082df2aef9de6d38e3ee2d7f3f311e22a3c7c025138543b9cd26a443b7730f11a7928fae0e155ad8df04b2a42a56493b62df744f1ede9ec7c365dbe9532b89fdfef92bbb38b05aef31249ae399596d09c1e86417b3ddf9b5ce2b5b3c63623ee5eebbc85f3827e40a8881556ae79fa115bf4eb000288306d614669b5ba9f8f22f77f15e7b171eb4ba2b6811deaee77ca7ea9925c454e58fda9f44d881df0c36c784cdae346b79c3514b45cee17656673cd2131a675aaed912de8b2910f36659ef1e952aaf7331290d3dea1dd0db130980c531d8524a29dd6c0c37531923cef1463621fab1c85cb50949ef0ff670bfdcf9d714d77c94d549841ed125a1cafa461f58d866f48e57250bcbd6319e8275ea91891256d32e46dfa237fcbd0496b42536d5b373749391de6447d62cd632bed22b0a6e8b67e6737a53f311d65902ce41ff6abe5f2a9009e2d79cfb847c8a91a530feece18130c537db5dee54454dace7f519c1fce5961883dc2036111cd2d4ad17c55d343dca5a7ef18c135391e5fc04fd5adfd76b20237549a30dc915e08ea6d5224e7187be455e64311893d5f7faa8a10fa6e1218ab59a4c9545c39ae28e5a649b75b457c0530942a76357d303369c769afdf901e23945d52ce2558c49621f13170434cfe34ccf32283f53c975160542d779068b2a7eba574f8e7c9d261a8e5230f589b7589bbb43ae0a745ba1ec3a3391412cf6eaeb56d05d9b0a1ae5ff07ffcd09f1f5b43d7a0b330d86b3d298f333d67211f75fdfe5dfd47419c05ae86e3f3d5dfa430c9976a68e397a59c26575ae9d2173e31a2fdd27c977be929e1734f07df1b2d0bb842db61fae741d325371d0e4b291dbf91959135e3e4704966fa8300870a318537088fbbab1d10954508c815c64de0233e97bd58a34f9ce3963e9bed8c5dadd7c11edf72bb24d05f73f8341fa053c44715d776b7d9128efecb5d6e73e9ff52f732f3651f04111599ba2ea0a3b949d4e9cafc5c059c124766cf7a88886368b7936a8a20ca57a0599df035437bf4bb12187070e73943e1e057d5f97ef34ea89d5146e31ca197ca23e2dfa66f7147aad6fd883b043d6b921393b29ca6c7ec550"}, - {"0000000000000000000000000000000000000000000000000000000000000004", "00385c4db642b3a6b7e9217bb499f0f10e9a9ec0443dbdac61d7226133622427bf3a577a36cea05a80b10dafc8c717f9aeebd68672767efd1bef1fcb7952fd248a34ae515021d3354378ae3c741362d144bb827a00654eaea92fc23ba3d8947110747151a83e3daeb835e60ee184cff7e6b8d2938723ed1b12bc5b775091105d812fd48d3e71de8d51570d2318c2850d5ac3952380be0bd9163259a348571627c7759ee36a3c4f2b01d7af2d1d8584233bb2015b19d3196c92d3060ead22b46a661bf4d951fb622b40f874c9e7a2c4bf83470d8791b46e2128c3fd7ad1e460145302a8d75ecab42c7b768df793bdfddb383658987e06eec1171e1501141a3db0e990bf61f05c21755b7df4086257e4da9c5be317097de96ca3d45ce7ccf548b97e7803db9f33351fcfb1b75f2b7f686a858f2acdcef9c2df70528649038455b0949487869be68e27ecad99dc479fdec404f3c4a7ed25ab59cfcee40e666cb20538e4af0f6923e7b55f3e6daa0db41ab46d916455199a2a94e25207ccf29a7cdfa207a0ea1553b650abe6c2449946df14f0050394616cc1a88032ea4b38a751fd7374a5f9080f92c732098fd3e8ce21ac5c99acc09b18ba8ed64145e7336df740ddbf0b843b6ac4c02f55b13aeee933fbed8df90d1f46767b543e91ff0a062988f95e3e5e330db1ad28394daa68e5eda955abd1d22d9f801509c74645dc6a95abb5fbd14d7e5f80cdbac41d83c510b074449def6bd3f9ad44302c6264adc3c72eb4ad2591ab692de9247ba3c663247945bd17930edd0aeb5d5863e152591a8b313e86e0f8ff0f1ad1d278a8e41999aa90d8146ef8e08f56c4634a14e639859f09ba259f4a9472e0fe85809fb429a8e68c3f2cd43fad92242a8783a4cda1396b9ea4340ab3bd1946263f015666e17d5b645f17fbd56027230648a54e1ee41e8e6701cdd9542eaa5b7fde365662f2f062722c6f9bf68f58ddedf120dcfe9b7432f7ff76703556da21580c021465c0baed950637f776b19c322e89a89f8df06fdf21fe04490354d11abcfa02f19450365d17aed8bbff040bcdc5b5d288b977445139d7c14aa8938eedc13206b3514b2ec96ed93fa9573629bf0d335eaabfac7f2d38cfee7f24215bc21cd75fac5cfe4655047ccd4a419045d44250cc71e81dc50422fca1a5b04e2dd6bb07f7f43c44dc6e918f5411081e71dc41cc9e97f8a8176bae192f96ce2f3ed316255fcf2555a11cba9ed426da26fa5652ba9d24cc16452049c97ebdd8fdd3964214ef07aed2c40b140b989e124cf39acc25b89965085fc0db91d8030706e3a566a6ca11dbd234def19a16002c1e805eacc71c47c3d518fe6001e6731eb0792c257e886130490bc19275fbd4de926272407aa2d65600defdc6e1135149bce648d7c60d32b4ac58e9a7048a55e4b742dd8f2dce75e719b1ba261e8894911613bc2a42c36a3d47f3cc29b56f75ce6a798a3f5ba806391db624997943fcdf525a3d39300240a354204808578a9b5293843ebe3171933917bbfdc8fb5bdc660989832befdc1b5df47631a87c2f0570a5b1e70ccf66c30e3a20627ae3b0666ce6a47c659b4943da50a30d62a26116241d3928b2d10e3d26839784033fc1374223433034b49c37fb71f7d2eefefdb2727d74fbc5068c3a4d189976a98f0243c7984be9312efddb4ae40bc3816a1812a93ccfb3232e4271f809858e977ccf0c1c8c0b944e0409989ec65762e7056ad2b978df27309a427b981a22ccec7634bccd683fe542a2db78f40715c976fac62c3700dec813614f163e1a45b79689198d01729053cfeacca0857a203e6766a3aa3d0f6f2cab7600218d2ac8b189d3446be598311dbb0b8d255381eca5bf5b667d1d12761ca2483cd99ca5dcac45"}, - {"0000000000000000000000000000000000000000000000000000000000000001", "00d823706585ca9ab5b9a21706c36b91106d184feb14736e0d7e299ab16aa3f24c3a6b2808959b7ec8cd1157e0b1a3518443ab05a885c3f38b8adfed9ca22d136f5dbd40aa43fb6df3f86609510f7ab2a13ff780010c1ba4f859964acfdbf5edfa309cb62e31fe8fd905347f5b2f830c7727be227255d412354c30398a3905d8b34c864f342152da6444eff3c9c9b2f27b5c8c09352eb717d0f3528d2060e320fde81dca5e9fc343018d6eb44bd34e9da004e11401d4fbf484e1ddbe343d8693bce9956d233a069535c2fa3d7e3ea8541efe01d35ce096d6ae1f3b3542d578589a2a655df4e1d82f576335feccd214ddb4b5458f4eb03e54f136ed5e0512752a1c44c46e45f9e1c1bdfe57621073914ef3198b9cf78586de06a207d95c8650854e95325d6a630e147a5583488e2eed28640823abf9edd12e12bace49ccddfb9addc6656bfdc8272eccfbe6490af6beed03551cddc2562445d3bf33ddc06e4c057d358c6944055758a2230af8b8f26dd169858d8fbe07425667e5057b4a96b20f9e2ba29d71093a6b2f9c43197e767b28a8dd3f89d92c4da96173f4bda9171d201c3b257104ef388a23571269744073676d3659fdacf4d21c84200a3b9c8210e75abdd83301b2371e21aee87bbfaa088e87cd388a220b4b82b3f322b5cd612ff61ae1712abc837f8eb1984bbc5482c88d70a384df738c7c90060c18548348e028e8c2e4f6a9b6c011dd8a52b7110d14186eda19add2dba5c3da49bb718e7963b6d2941058b31e442ba013e3c571f0d575c805295f69fb1d20a49b226ec8ef9afffda668923e67e34d6cbb990f127806c0ba56265774ba51ec6320093a08c116976025d19afeab1ea8159bba338539d7c7cd944d91cc5e1a25049bcddc5b16f5f395219562971e992339961b24e7d9c44a68fdfdd5a442ece4a14f858594b9cbe5029c85a4bb44606ee580b6784fdac08dacbd6d8efc078e0d5d8d688415d394b954e8f4547325267aa986199d1c71810c5265c7c031e41b6ce30d1c1efc599732aac343a22160239c7f36eab7636a3ec73357457e04d456fb6b044516348f925dd4b7100cd2d867228939d624b6a09375196c6fa8c02858cdfa4e939b49bd0a69186f1cedfb5bb4f30443df73a255432315e2864e10fbeba9edf3119ff9d6732148450dbbd6f870e3031e360e33ec34237ad88176a2cb7b222e89b8a67a33b5ad7d1a72ed15c4da44cba2d86ab64dcb1368fc0416bbec2fe92c8bab36676271c0b7a627f31698051a98f598ad0fb4130eb756d971f9426be740bf709e236fa926b25b9fe3cdee028e4f4c60454178ee2a292dc95bb720ce37a0cdfa953b5daa80c6ab1dd7b0db23b8bb23aa5f48874499e6acb2e908b1e46310f97e36e744a1eb93e0a16a21d4c4f76ee9062392de6efa02cb723592c51895fa4552452ee9dd3d1ec8701c010eb5bbc0b5e8b79b75d4339ebf3e57012ebe36a7ff0a575299caca7274b220e5c4ef3becc6fa3fda8d722b6337f67299f2f1312965bd5c6d9de62bcff6e24517b79637c7491ecf32646452ace3202e603dff223d348c85358728aa9f9475e6008c37e3d2463854f121222f44bdff6b7f81ea23e3eb177db3e14d0cdc14e75dee9f2bc035bb3de55a26a50c522306ee33ba0d9c09e21bf260266127ff5bd71ae6d3eb035f0ddf5dab499ddd24d91921d1bf50b4f461f1684d80077fb1290c522cd7af70ab8de3dd432689e0ae11fd37d629f145094e711cb6278fd3a3a52162c004bde196fe49a10a9787a5ad71c4a3ddf5f161deca1ae4c674d9472155d3d670da2f1505efe0379bc8f0c9bab516fd2e0417b56128ea9deaf561da65ad5cd11ebe9b4677266f23e8da179e8b36996773c3191e6eeb7624195245b9"}, - {"0000000000000000000000000000000000000000000000000000000000000000", "004dfdf9b3dc307f825e47ba5bf2a1ca8a371e275c0d23e41fcbdcc34b6fade189f21e0dde27b91cadf01917fd76d1113465d38dc2df30f0549935c639253c4109874032242b21d0e25b1b6c745ef6ca12f7ba2b0058ac23c33b85b7e0a2d2f1637eaa9647c97c47c702a5fc9f4d23081fff74c2ff405c75419fe59ff37822668e5c84f16f0b9244d4e6402dfea5a50c15c68723c48eff28986893464588f7127c52432d055f259400de27289413f320f64131ded93a0d370f399912181a3ff760725094e966b6d4923a57114b24c3bfd28107fd55256a5110ecec2dd4cb3d2ad825405e6c48660ce589eec4cc4381fd627115d89735db263f9b2f870379fa4c7806bea4a82d8442d2e5c80e16b7599e1b1a504f84ed8a1bf6d4990802bbe1f81a979fb97cb11a990c3e12ac93a1a0e0b46381e8483aa5863ddbb61b0073cc2e52a03fafc9022438db91f0adf2d1924e012422b43ac141fe917b03dd29ddbc064e6edd770c230261b1cd13248ecb2123cef5399d6b1b03df1a820fab97057e8c84bb6d2dc304edce010d8a0b53dd363219ae29743071e1dfa8c56954d12a0d82be4d775f08978df8844b60c92ccaa0d7ed4cd9664c261d38dd1ee0490be2a07659e85c43d07f49bc99bf28b178dd28fc1d848e8ed0b7657504e18966f2927a6e5c137c3ca47aabccd7d230e60dc4e1b238314986e8131a960ed55642bf926a0fe2ac70f36f5f7134d0dac994b915c3dd78ac87d816d295628a62d3c2312bf43cdd37172a1fe559d2d9cafeaa3716116ec1babf7a5ae04e1e40994fbb0b142349887218a0f221dcdf17122cae194222cee7969626e424d578cd6020ee184559e97c1c9bcb27e609a34711e6e7471a60457f548bff142d249af16198f54ea5fb43060118cbab21846fb087f7275d6acb7f5bd0f9e3f13cdc44748d237b74bddce900866b986a16fe0d0f8890a105db4df1ac79bed32f10537e93b58b069de36962e2e435fdb19d7dd39c4904e3f3d0f368dedb6c7a43ecbabe1e49ef64df18f019a37fd5f826f81583458414023d3ec5902a38d65e0212ee78ade3d86fc72a245cbbbee9891b6b1f77595f796c60f8da159540e53a27ccfa84f74763ffb41f075508783bee7453bfcb3257ce208b3daca153684533506796f2111a4f65af18041de4bebf53a7bc0e51009a130ee10097ed929e808afa34a0830b1c5a2e511bc32a7dd45af536e9f2636f4f6aa6ad4765119c2700d24fd5900ec06ea74dc0829a42f622b48e18807905f35f4be7076135784d2069c9f257a6606cf850b6062843330d3084d3e6f8c091040a990a6b8837781626ae05c4fae2673783e1b3a9fa27aca281f9783ee10f93e4fb8238c243fc32725e212d22b637917991c23cb02c5dc127de15d8c7898929ef75b2bbfcfb517e01097490e316522cdd5033cfa7e30c0d1082d041080bcd1f7ebc963615e8c8e1a9702bcbb5a1134e60830b638dba2b178fdbca41e11ee0c8b9b97b03fa57b01f88a676ae524991be69238309a8c56961bb30a34901b56dfbf1c34b17c36d18c4acd46fdb098fdcd212024c073ccd83f897cfaf02b423c2b5896e74cbd45604b5d0b68207deeb425546180b62e73ee57b97ed3e2c82ffa05a8df298b4f2b340d9361cd51c9a51d77b0192b7c8db08855c5f56154ef067246bb6abbfefd83ad843d4439fda07ffb748146cf0137ef23fdd5a7b04ff05725e1e0f2cf17ff4bd00f7096d4c841c80b10563289a92589d62d094c0f1752b5b9c5e0723ec7c06b2b64d84637cb3eac1920fa220e819abc4f17daf219bd55ed055dadec49287654cc6caef3a8c5e240e1a8a5cb925ea01c1f860c3c1086f7d96d96fbc3a2a28337bffcde26ee5db48457b63d52cde5a569f7ffe"}, - {"000000000000000000000000000000000000000000000000000000000000000b", "0163e850367ee29bfdb76020d3573a8e33a8ba6e832ed54a8c3b0d603103043405ffb2c9267d545ab753069a96d5a84ba7c7311dd34affce87deef717e04c006aa1b6b41c2cf661d6fc0e5bfc8af5d29d109704c044ed7e69c0d29d96840d501d6592bebaca33fadf74663a277e2a0481951dc877821ea8ac642ef533ed04360e2bb4d953205a7ef97366de335bf4bb21f894a513432ee3c55b424d2bfb62069d121a6717ab8103b04441afa8c08687a79303166922163b2baa255e7c70f1215b552e95ed76cd4c80ea9e85c7a770a9ffcb8085226bf8743aa4efc8cb2402478b9ad65b66f229c3ca2434c52117c899d5394d55cef0235852af675d60f7718a17d6bfea968c562ab71d63d4f55227e46ff176cb7b2e5484bf69ec0d253a79f2956714ab5f9bd1a8c1e0da0ec178fb1f175b59a4c99b2df4b58e8fd2524da9b3c2667df895652e0a35fc7ae3774780db801c7a3339f99bfb32a31e6546c78c0ce142997615a184cf5708691fd1ca51bb2294a7e5a890fbb1a2d6b08a740abec1df633ebfb07b048d8f2aa027d54ebd7482f53fc896ed0dda684665e7cbabeeae45b3ba5d408965abbd7b80aafcd41e09833b25de5b091b812611cba030f22abb6ebe3975683816c102ddf921729e00debacfc6c270611516563ab21c78b36b1d5bd19c1146e2c194bced22a851a460b45532fe9c2025762c805525e7f7cb804dfc88ee383e9f204ee4746f912550ef666e0159f9a3118cad38bc940bc91f579f83730157259fe56125c68d4cdf1cb192d959c93cc99f9403afcce2bdb5b8ac91ac4c4d2d0f1b6c235e75e371405b3b97a5562d26f98ffd70a3d441956be9dd73eaa1b6d4266a7ce04da930f06aa7b4d214de29cb94307090d2509fbc6a0317594941aa02bcee13cb06f984a1c2414c2c48b4ce6e195b3ec1c69a39da26b7a9a64038005d60d2c655fdee1612fe3aecc0981f1ae267044d10b89efd7990f483d4996d8d0cbce8f277717ca18b88a0bf5671273a10ab774eb3f6c9f9fc1de93991d9794e6bf26dc69784b858efc7b815a748c766e7904aca40f0ea2e81f22cd513992d30b8d1b0a19651646f07dee1bb49cb3a79b5c5148fa993f3d1c5b867208c8a8621f42c869279b8402fcfb09b11732ed484c5620e379fd288087c21555f877e9c5cdfe4817c2b804dfecad65b2691db600e1e2342e57cd6e10d269cf1cd48fc80707c3abca1165eafae6a9599b971fb3dc106e455f701598a7fe5fe1520b7bf1ad3fcb566c852a283239139efd574f8e9596082fb4addc92b747be1b4e73b038c84c6252f0b2b0b22fb5d9241d6f63f12cc4e3df9f0c98db739e6635f95fc0caae321be81b3164760412b1c407959e43b10d355835d776dbfb518000462b25287953e242288cae615acaa2b9fa8eab043bee4203ca07e1f5f026e3d079045270ebff6f0c09850e59c6f22df7e43b7135562b0b3652be5ca88b0af38e99afb30c79ff377139b64242813de97ed99f1542e4fd7128287d99dce6201ef6ff6a0bc473d84310654cb28fa08633a37f91f14cafa6f1038f69d5b8300d53170cccdb68ef6ea7a63bfa866a1893f0c86d259221cecc4f371faf2ad3f05bde4871d84c73b8c04081f53e56a6af616b30f8365360ceca38089c4053055d436ae883023f433a6159e3eec2c2249a36e43313333fce35114189a3e08138ccda3b62ed1edb4cf305f7ce8e9098c655bcdae12d5f72fae0e1d5f0ef7d12785ed02f63003b9cc876d110e204fe617738c4ce09616270cf106f972016913cf5b2d46c5d3a465f6012acc930afdd752370123198c7d3d99542df794888143bed9678da473f845d333e83ef6299392c50b40a2ed4b4636e1ba4f9aa04b45bc457e9c5e6335ce0f2"}, - {"0000000000000000000000000000000000000000000000000000000000000007", "0018a73ff2d38063cc0800b77f7a204a5c8e758d120532f2e9628a3f171fc627a27df1423e220292def608e50b69e7ec22d7e6d8c37dee79702de6efba8e3422358b178fccf0a08df0058b64d7cd4d795d315c0a00fdedbf6088c0e57407695f96e52df74e131aee93160f6203eb667da7f01dd5dba549a0097d99faa9cb0401739dbfe6daa744aaa0aa5a1cc3f202295409e304830454125847d8cfc7e162f333a804ae857a32c311f39bc70d0a1ad9d89183b1ff58b2124a985d87352b7de6478993ce12d1aab364dbac031dcf8fdded43228c11f35cb432dde878c307b29d1879b2ef97c4ab2ea71cf39e5b2ee9c6c2565feffcd48e9d74d9dbd31868a255d151b8755e054558cff3784e2dcd746b2930abff7ff49a973bb609432700a7ff513350796a101a7b56f7ded5e019b0e125e694bbad21b7ba946a11378a64db451de7634b3f841b7ec0dbd9bbd0b1fcb1035a4b64a85d21e99673e5cbd1c3f4e7486fdd558c1f67fb5e7d2492675b17a25f2137b13d761f5b742d0540f5dce268edabb0e2eaf9b46572c3187dde5ebc1941cb6f4f470363d197324207c9a63cca049e783b10ab54540d925235799c416deb0f416c843a50fe2b1dce9dd3718ca6e7ff4e263531baa0f9a12151dcf619c46756ff8bb8d56527a537fcda3b39e81794f8ef1bfc03e393a7279b92b3126810b59a1195a40f7d9b0a88cbaf6f0531d5ff72e345dcc07b52edff987aff0b7f06e4b3ec32f7d44be2179d66462989efdd58190d74f9c63730af0deb70f240efba36468bb71a38e65b1ae7bb36a243c9835c566705b3f4fa746777a10c0e2767168054f087b873c61c65ddd046a63ffbbd4023f784907512e298d681f6b7c86f9155b133da773d19086b5f2615fecbc0893295705222e114592933c341305e09c0e1e6fbfb6ce5329ddd4ac96ee6522d38050c914d5176e487eae4118ef68eb03581fb1e8f010f04c8f2b9d2fb9b7756c274a3398e40b10c2ba6700cc987577699132edb39b46ae378370f73a83daa4e3fe5b23926b24d37ffa0e64974384c1e11e87c211f3f447a1ccd6c8fbfdee0740adaa0c39a82bf9954eb3f5d1e8d03b30bffd50924a874e2a5ba32b1be900953588ede5bdb6cdb7d140a41c7e9c416db44dd1f6b7ce80c6b0bb6e47be9e0188166db8052ef1f7c0b94072b19cc738dd781365a413563e94c79bb219b4da907bcb2790ad8b1635ebef0d3423a2cbe77a2f9113f2bc9a4e35f5183d78f479687ece879d5b372f3551d6309e73706d94b1783a498525d51a0e2aad6b7171010a764d13a8c8d916cdb5209885ad265186cadab863671f6dbfa906685b1f484304ce50eb11656ac790718dada2caffa4573f86353e7a4e1374576da7e397a1d7e743e84779e25f667f2536a68f8954621138c08050dd46638d46787d90232033b3fce66458ebac25b9a568d3cda6bbb27c1e10a43c5d5751aff9c7a9ae616d5657474ec8b67777125e3ff68d3b9e68651f7281f05a66ea6cee7a5cf46f53b54e8d0017cac188cef17b84c61a067bfb3f687343e3ed5bb655cebb452ff21d77fa8ecac7c2d6e69338b24bc93927aded6b5471d43ef2a22663157a3f8344fb429e79e81a99698fb347aad217bcfce2ca0b767e458c6f4d606eb5f4b6809c8b5cc00a11e5fce8860dd27d9c03164f65aa59b1818671bf88cac1493ccd1d1d3dd53f204cab576f133c7b9eb6d5fabfd9c5fb576ebf02962ee1e5b4a5b71e1ecae2a21c725fa220ad0e66a4b8752753de2fc179632e3dee18f81efa127211fc5dfba67fa93feae1c4c0d7ca163b87fadaa89130a76190aa60b5a72f4254c7b0b65eb63775fd6935fab3e13873d7d3f0c983bde72b787649697ff41744d9d7b6d9e4c239e265f"}, - {"0000000000000000000000000000000000000000000000000000000000000001", "00475de6890f05596fb1b60e81c2427e0e825434701a29756fea0fe55bffc2f33c78e8752e089cde89440177dd1be899c5b91b67f1e9add977567d8b7449a715e409077f584a26e4bb62d40d3e990d435d6efec30c73f8f7675edf4d9c9074bde935fe76725e7e669a339091b40d795fbbe015351eea6e244f44159cc8251a69b6f53bd0a08967c0137810e7318a8880f8f75a1c8f71977ba04e5dd31e42b041fa0aeea318d67213053b810d9b21ae8d23c4205a537564d95bd1b01fc33899f767e690f76fbfd7d40b2169c97e5644fcb162054ce451f6ce8b0ecc2ec15fd3b1e5d7194d7e960515d70607dd465293f8ecb21ab641dc69426ad1a00a07dc9c1ecbd46831ca34f52b8cb73e9a213d7f4a3529b9fd845b122566aed0597fc34dfad2a1f996de7e22b3f3ac3e19a38d6c3ef85924e4825eee28d865af4fe2cfca9ba321b3d985676c1250b776fcd91866a001c6906e418642fb938c011586f6e7e71959bcb99a07bbbcd8d188680f8dcbd149a7447125bc8213fd4928c1c2956f0f175d180df741b9f1fcb9e6946f4ba82b3acf2d261ab7cbc4cf86c992f23f99b382d4bfba023cdd204999f29ee3b4155ccf5be7097bdc1155a7119abdac134938a68e6967c64a4500234a133c2f330d44c5573eb7b3b5cbb076408fb58f0da77cb1e7c825c621abfa9e5a45d23e55ccbd3c389abe91582b0f078f37357157fde1b45f269c1962a09ab3e73a46550f6fbcfee7446962a86881ded7446449dbecb7dfd60c68e600eba108a3c0a77457f27b8d5fb2349dd65a132cfc2876ee098b99fa016c45fa1e6a0e689b336a092cf5d6c48b00cdb37ea742eb689506e9369c4b563789257425160ccd399fa71987474a25edf272786b0caecca60a4d60d964a2d2f10b63f20e388bdc22111f4c4126769302776128047284e5919df4fc39cdb10092b99930c14a219781f862c44f59aa1c3a11658f54bb3adaf8180ab6e0a4eae57ed8635add0cbccc0801edcb82a1b037799d0402f18cbb38d920d9f881163e997f7917d411d6be11f53c1d2ebf4e1e73d6975701073ffd2f0dcecdfbacb010e0fdc6b42adc93ce3032610f6c3cdbb5dae00caa87b0f50b67590f7c69e71687f93de78c8f33dd58022a979c3cb4ec8f1b94a663161bdbf2f4c9d9bdd8269376c59ca5ccb29a7b460838e730370d53e1859b84204b5c55c725ddbc1bdb093cf573b3dbcac58e6382c19a246dd13f24ae3b7c092cec7f156c88d1b386a13358320450c2322f299923696bd100d3a909228872d524434735452152e9410acdd6c7518ad35f8701a591d7c4a36626737e7b3521dfcba316b94fefeef1157e7056a70f9c0a7fea680b081d5e3bc87db3c1a0c4f4d8c0c5e18680716e6d1e333c9de0daeb8320bc795ffc6cacdab56b76518b04537162ac5d01a5253b71379d35aa737bfede3e3550dba390bda62daf947d98ee186e92166de0df72dc170e0e55f3d64b3cd82307b26b6acd2eb14e7ce09b1be2ba94b88a4edd51c4672fb444388a8fdb959de4048f585b4a8c1f4b36d02085c9998b3aaa9fdad3146154bd363be77e23bd9a772126d04385dc197c4e0c12fdbe719647efe7c54103994bdfe0a523bdfca8b21bf4727fac560ee73842f2642ac9b0b64b2d14c3e8065cd8b230a09c0f37ca0086d1f60ece213936b0ff141d1c8465e05105b377d3d791658ececa5af7d4421661b5cab517dfefd5471246a2b1796e647e1591e7664db3b9629bd54cf0fc282364c98c333046dce059139a3e2ec61b1574f3358364a1dabdd1ac39713d4a2f0c751a060cb3c1863c771be0fbbdfdffffbe85b11d20fdecccad9aa5991fa6229ddbdd926af39fdcc52063b34b312249f3e6cf43b3fdc98ff5565eff88bc"}, - {"0000000000000000000000000000000000000000000000000000000000000006", "002f65e79050cb814bc586095bea05aed26ddd4ae804785a4ccc921dd0b50e329a133f413a00e8dde60d1db99b3c54cb25d92f170425c3cc11c5a26571721a6d4fdee30a9ed0cbd9e9a715cdd15c35effd93031a011e69f94e42a4ea9a9fc20ad4a97fdd8c04f544f31208c584acf06207bce2294844ff587719061979120990818903923dff79d4a75b8148e7f712413a02522e28efe6646c5a5389f316ca5f6f876ebd35f9d9590910f1364d82496f2ca394b1d46de30995ba6d6c290a857e805d68955da1e27a9c6fd856470edb1b6bc21be2343b83d6c4e7850204d6ea273685378371555b33791f392acdcb668f0598c196da1cf6be62fe8baa0be1be1195c8f1fd8efe0a3df17f8f8700715a17ad10d808b652184055ac9619b441ed6b9ee71458d0c71f1cb2434c63cf4dbc0353376e53fee9a81ecf6ce0574f77fa05228073ff4e56081d3e473e43953bfd5c0057adbff7e5104fc89e048e78c53a2604d636b7251f0c6903de6d5f95f6f7454bbabb80eab61296f015180b3be451cfc204e5c492121b90d7e5073a8d6bf92d7483085a51c101a8c7887488d490beed3599f419039da222a2c9f662edf3b2d97e7878f91c6c3f33ee03e19985164bbfff6475b2d1e17e417a41cdb2434517987da2f3204f51f24f3679ff663381e7a5951ed928ffcf5e95ebf0d9c4cc3507c57f383b63825da7ac0426a2c66a4b1bb3cc0d75f87472104a693d37f9790f60d509cfc5517fc31d95656868f36164a0f1f1aa08ec7ff5153c860bf786e1e54ec72c6ab58116762a1b5ee5ae73c84d557bb3c661c03ad9d290b23d81ed1aec7fc9af9ad54b74d861e5150fb7d8e5fbcd253727cbea37d5ea1a0591e3ccf6316c9797de019f3fe11c7332642c88aa89c54ce66f474864ab1ec47b80a63ba1df2c0190740737aa24118052b9611e7f5376ad0166076c15061723b4e930d9ddfb8400debf97b2120eaf1fe90d2c7419975e565751ee0511b33377bf2b0520b8c4dc7805ebc5c542835657e91f45287fcff714155e2a511573db2dba61cf244eae51fa019591f10ad24c20228d1028d922e140d76f785081dec4d4a62c3772f895561b59aec3a73a1b5eec8e93f9f7692e1604513d38fa6da9ec9c0501754d68164fd85eae1d1f492c6e4f21bea580e3d68eaede3707789f5edbf204d4c1159e8fe302b641065e9b5dfdfe233cdaa9980a08b725004e2158e645c0aa47db4ae985e0f3e2e21db7be060eda2f49aa25d55bf83ca6fdd7f8d2d40c3f411700bd173d4d93cf66ce3dba24c6f56bdbdbfd0b42dfa6b945d01f620242361bbc48c9326dbd9a19115299997eab3cf16e91a336819a8af5c51e345d561d3fe6f65f5a0e8cd61db343fb679769c2659619841fe93e7268b2c76dd408e2e4c13411252dc05d7e8103c211fadadd091b6706f1ded51c365086d8f83fcb43ca85d7199eeff3de77753549b96b8e74957e853f0ff67f6f7bd5591bd0cfb16058b79a4aeb931b0c9c7e8b3e9a53635781c496f8704157df963dacbbffec08badc6e3057b6f517bc218690100370c4179bdfd053b2ccfd2b5c62cefbb225e88b307ae326583e897009f1614eedbc3b21ff5dd3c5b3235e4cf33987d31024d23fc0fb778dc3d59a44690f41f481e8e894fc810b52497d67275d399c0ed4d14231b45ab8785c70c90c8625286d0f730e8b1f93d19f7fd754f9d76df5502207be4565d3dcceeaed93fbcf40be85ed6710f8643732ef9920960401d549c49738f45e61d9cf4ed38c116e18cb2f06c12c6b75696ca07e1056f5849c1e041a02659b30ddf6430c14d1f28b15618d7e2e9560e51bd46a34341c8b2bed6093cd4ac7d8e9a0c2ee263d4c894d2801262f0558ce65963be5a4bb59de1e3150"}, - {"0000000000000000000000000000000000000000000000000000000000000001", "0015327fd8e596454cb4b90ce3e3d5174691ddc77407c0c2b601c4bbd4825191f425ab2bf4b211abaf8b0157c099fb472b8322f0e2b2f720a7c992859d83e124bb0b115cd690a3540c55cb19b903da755e7fd28d07e3f97b6f04d32b656086702ece8075ffd09d332311b4514715dd50c3f42a055b0d55849e5bb19822f109e403fab5a2787bc80690c4970a16ac71ad558a3d150957cf8889787f35a5c25f33961aa8c98bd40e8402a9069e2983005edd2410e2dafc3d351013153e9712e9467e32968d27bd667156c58fb66df7881c50c8151ee8fd7f1f7d3b8d5cf1c324156296cd633ae2f4499227dd19b6d3ddd08128013841a4b2249f1528961488e776678fc128a915c41d7ceeb6a5c779fd2daa154632785b5f1dc4fbe1837b50af478354139b649d2b0446047831a60dc1d6d490fdd96721ac3b55f20e58eecc235a1c3db5cc3817532c476d3b672c7fae960086b4b1ef8549b4394a72dfcf69230a3554d986d90b035be1b3caf15c83a9f0c9f164be009dd2b340ff02739ae2d916a481d812a70e89ff45f9db3fde66670e66a2aa542d9a23fa0e926b3e243568c6accf76b503b5e230b5da7ad79a07b35c64bf94234fa8db27551817fcfbb74b8b9b3feea1d6e110cd095a6caeda2805fd2c1fe181d8972742b1a363deb3d0a2d1777d353deec656a1e663616df0356706c812769109d9bcff00968188e169aa7d7a02f4776da7bb4f1a49bded9811f85cdbe8980fb154e87632f871a1fb03179fba13018d8b465c51cca7debe332aa640b6bede6ddcd9749ce24790e4797697f1b8ac454ff131334712fa473e083aadbee0981d0fccf0828c893eaa911ceb2d2f2817a0c4cc9021c0534c14b29fdb2c1abd37329056a8139681bf54492bdaada2324d2654ea5215961b02f63a2aefdf3a53a91fcf9614dc1c5dfede6e49ba5b16003513470408fd0bb3b980989bee0f0df49ed506911961029ce4303ea1b7edd3a854c8d032332f71cc2e00dacb22e98f90cf546b84b35946330d40e678e90e1d4946288b8db6d93726f2e4a041e7a934587dd6360b1eac5e22c8d4e6a97c0234f17595c11bcdba3aa00d5ce76f4e71862fa9c221d7e71c4ee30535ba46ed203ffbb6dfe30e51aaee036be1dfbaca0b681979b247336ede64ad8b53951446b2e2c7c126f4031e89450526122d3105776b05572067b7d942587d0bd6840509f3796723ddaba1a3c044db82d75dd7348bde2ec9080684048684bed67416b2b696f2bc2b1154394409402acf88991439d769fd270e2962d402a29e19e98c0874a1c7cf822410a2f74275c93cb976568456e434303775632238a57fe02986f2acd6b9ab2bfbff8e8823f67e5da41d17afc51df28f21da5d3e858577a3fe3005ad0d00a38563297975437a5605e6af613e94dd018af575761074f74c77f11b3e5e171c7f8da4b08c0feeed146936f43dd9d693032db5121ae2ec7dd420202411da01cecd8fe19705fbc26282f2c912fba51a22515f49089445d0cb40c311fc750e99cba0fe949504fedda8c3c83116534233c4f1fd7242a26337d80417eeb0c6ed1fd591c22353344fc0ab036eafdd55221f152b28c7264d4f8e466206dfa51f89239ccdff533dca6a63e65161f8c908c5fa184b811aba47582e860616205b365c101bd20712de622521ae9e0bbe62e91881772a66897fabd6dce23a04126b26ba737eab490740c43049db1b9718a4e9a11a773a8a8533fdd38a127fa710246e9d358d3014e525bc7909e6ec984a710cc97daec58c2d11c28b798bf472a1db7ae97ec6c30d8b349eb0e9603d863ce6a3a2cc2506670e3fa10e19f320fa8dc9fa1bc89e62db697ae33613769f8b0b2127dc5f8b8c47a0d8d95768cb6586021b8a5b5a54"}, - {"0000000000000000000000000000000000000000000000000000000000000022", "0011bd889605109a6e99934335a8f1dce6783f6ad9088040cefa03ab85ba6a42ec9e47b318be9e8e008b15480aa54c4de99ac9c1426464da4485edb0bc570944047ff6fa53e4f98f253484aded8601b3403cc8421f612f03de539b5186e4a29a0537d9428743d5797d43fdecc0aa5a4917041ff497bddbd2d127a3a9fb6528ff9df82a5384498c2dd2fc0d4ee42f3e3bfeadb0430305dfbdafa8ebc96326d9f879e9165fbd36e811002b15082b752751bc649055ab7d8226173f955d212e8797c250d7d9256c0da56cbc7820056b2476612f00bb3b35aecb8a8cd0b5a309c168e892eac1dcc521012426177faaad5ffaac713d7fc18e3f20261d3295057387220713665cedff918d8b3dee8eea6ddf4455081d0ab6120ad4930e812249a97fe5f8afff9b357426074968bc9e2fe1c331859f866fed35cd9fd6f1a52bce07a83c1b540cf7a46726af7ba29a293b543ada0091533beedecfeb41159044c8301e12ee5ddf2db508c98ec7aaad8297c125f11cd4f735aa0cff36e3a30ee71b4a650c5c733a9f773c3f61e7e6c9dcb9982017d5a164f29aaaecdad6a2bc52b57f5630889b18e7062b57b8ef87abbea2c260b29b65d93bd33e3fc55113060589fe5e51df5c7fd3951fde8281a1e6def6b0064cd3589ae058a3dc41a242614f389d6d962cba3e0c0e72db8d17717550fce2f88b236cd111d379fbd2032b175f6a4d60d3a193c707eaf01c5b162d1bacc40382d9e766890fbca9fae356ef3fd44f06dffb24c407640f2124f2cd8fafc4414edb798dcdb5d77d9091437703e779a19575902e745d75f567852b2c3c104d067efd15beb3bf6ba35732c7b621f1a4b21ef550472bf14fedd8b333e7c70344c87fb2dd6a9b53959c4307576bc7a6975a20e4bdf36bbaa0d8b28729bb8e361a3f645fef695ac5c73d0389a5b325ed19ee37487901054919dea6d24dbd5ac7e3b7cf0f81fa87b1dfaa0616ae769a0a186d33d122f538fa5e92250dfe9d4c14abaed3f3ccb84e93a212060148f0f8cf984a28b93c54be79f7524933787894c2a2f373299c84f75f9c0d6f16e042d442b9c513d3a19be05c4a1cd37c6b051daadb2efbf85685f5df75b1b6d02f1e45ce139ba730b3c5d9652a6f55b926e316752a2779f802d38f2d5155f6078c635287cb4956fc51db4cc676b6d4c1f80b840b8343a93359f691939cf2a3f61173b81c33d2169e0585380b2f8bec70a5973d71c0799f8777559d0d458704240e45a6f38cc2878a5bf087973fbdd162378ed36246de33cfc6b6881b69f278ee36957e84870dc00ae6739351c0b565c2106c215facdfb27c266f347402a1c321708bc4b8639dd87f2144ecbd1c89c726f83aa98297502b242f948e64601587312d3b9fbd28791a62e1e0bab9b7b7f8f199db336ea397b5b2240131fc6bf09c59a3a0bbd6e50942ef5ad561df7c6614defcc22e0d1b67f12ca6c7f36cda12f4bfdb97ab1449dc3a32a21d15334255e731627fe66c56bd380a1f43835ced6aa039fc63a2d02069e44d0d005f41b602dd4057d1d676af7971344410b046cd8f8ab6d0df2b5dbbe4158de00ba61f6c8499fa31876b4b5d31d304be791efce1e745384792790a4b5aa32a26ba04770bbddabc620a8ebdcc0800d7db1e39e78a8abd8c0805a6cac686c85bcb916307a065d4921df635efbbcf1f9555a5aa26e57fe4ce96b4123f817a54937eec7d0ee6450573300af7d6c232097236e4b0e17eca15ad376e16ba5637e43bcfb9548e74b62e5fc4767e2e810db3e11ca5eaa41f7901033335715431a23e6f503a16c86a222e976f578e53449f1929d7dd6d18ccc866138e92d794d4a683af51052aa7797bf980eed0e57b2a818d408e8affa4cc1c53abb6f7c0e55c86adec93"}, - {"0000000000000000000000000000000000000000000000000000000000000010", "00b9bdbf0b0ab915e7a58287cb5b280960f1db28881fa8d4573c56df774f05cc99f1f9c23ff6d03fe18617fffc5adbb62fabcd81726cb35d8ae65f67d582764726eae5301b5ec0e14454dc05f4b451d22579d69301bfd074d6c7dd189cd56a1ddefe2482a1011a42190a6d878fb36ac7b9584fa3932dd2f5859b06f1f0a50affff661ba29a738b9492b50acc5f0540690b3c5c12995dd1dbf05815c196c5e5f3f03da5836a342251037926c9c0e3cb296f6da06a9c7f667d52b136bdcf096d9be0cc6fd47bd2d9938d71dbd3ea7bee7be8e7072f4ffdcc7047eb954362633cd354f658e5d418641d265fbcb4ace53390785605d84801e19227d9af1d0de74cccfcdf6d2dabe471167ebac1d2b6c7bef6ec12d639e6cddd136d1cc3628e4cb6047f074a5c814e1d9beed9ba4eac67f96261df0ae423b54a058d96b530040a65a5aeb6efce80b41e1b27fd3d67604fc0a70291977c120e083ab38e927928699d26b4c2fc3c6d09689df089cb7c6a7bc81098997b1a28c5b37178ec047097d96e98d22d047508a4c2578d5aa261bde7721018753d35250611580a63e6aa54aa999698bc704a04407c84488dd08f3f09c54fbbfbe5b1c7a57df6e821186609bbc9a50ad605ea3155fe638f82977d603f0bdeb16e2cb0b493cd6be385b7d36b89b33a123969169aa67bcbde5b6395dc25fe726357d25a6132eed305133603d3c60f89b75a5a2fbfde22b2c02ef7ccc0106647b7f94c63e1405a1369f53751b912a30fd89607938c60ffaebc7fbad790b8a26bb1c227ebfc4a4708bcecd825caff16e98d5393443d8a9695439c821e09b862f5455919b4d494528142f663464a439db8db2b25dfb9b0112ee4c40802c00572bec656c372ff3916e444ec5b62ba3fa36986cee8c826e6370f7ac7881a508b7c780799475dd912b48022dd7d5838bf530d0130415069cebc0386b7008bc5b5c5950fc2cf8b9b0b95f23e73237b1d5111186736e2ebb72148bc99f807aadcce161815a3b93ce3004cfefbed03198f1f250cf13caee6c84685fe6b222b8d62262d9fe074b7c213100fe9af5361dd8a3f2292d960ef49f456bef9661e2549676d48452291b8d37b3bf174d2052c394c182980f2f78c0c30db466514ce3642ed8269b5bd1324534c9f8da95cedf5a9f7967f3bf06a51f132d193ed024b4fbda314c5dd86a7004b38c7845ab87a960c022a33a3f9abdb020f65f8d5df3e4bd841ff6a1fe1241626e98dfbdb3141903372b787742c1a4272d8910b1777ca1aed4faf736f9042e24f3c569752789c590703ad3704c44a72b3717021750af321e8af0515dc4b09af423339edc1998bdec221ff3ed4d9b41c3e9dc90b6e14545ac37a428371f495a2b1f2cd51758fa4c00fb59d6de79c070ae84ed26cf7f3ba0930176a838d033fa7b18343b225e99d031372a2df8ebd19ff1fee107d54fa1d91b32da78ce195d3158ede280836ad01081f0652140796b6e7d9c228741883d996624db3b60e76dff5b14a3c0aa61d51cddf436e1619b0395b3e096a8e227326224d9f1694aee6468cc327311982ca16f674666af36079aa881749797955aa134d96d08e1073fab792d2c4ab5da481ff9d76d234810e3f2bf81f3c1189de5cbf8b6225137588b87759522f56f7bc044c30b633db3c0f65e793d5d7fc13ddd9a7d2fa541710d0dfaa1dfdad30ea24f7b9f8f46e2c4eb950ce1679c6c1ae08ac239597a3e6183fffce4cff98c5f23c56eef2dbf67f91f796f58af5ce8185c4de12f16e0654cb65620e009285c4d92b51d7864e97cb18319020e88aa9ea898bf2e50ac439b2c12a3d37250f7bc90a67db76769b02932121c118d43c7118decfb2f29a0d15760bf02b2041bd9be538fedaec71e65815c115"}, - {"0000000000000000000000000000000000000000000000000000000000000003", "0005d580a702df5c5c0360214e22da2aa20a9d19272c995663b44bf23ceb39c68b3fea6655cc5536c98b1004aae42ad2d064cb80344bbf4468617e1c55da4e1a2e456ce0b35c0baa1557d87b5dc552d40dfc549a0057feeb7f9587695d5e6051b92fc4357fa03424f84d13950a4053da95765e257ce1df76c15f3e91f13e1461a183dd2095e3532d5210e5d3058d0bd291a9841493bfee02cfd4435a3736bb02548d570b3ebf83fc034bce503c57731af400c272445c2ecb5c297b92b31ae797fc2d3162dffbde975a83f13b6a179c1d79a70891abb6af0cd70751de439dffdff499c526916b16233f46bccee1d72f2151731f6b7cafb4d11709deec0365fd5af2a1ae75ed079288eb63a711dc123af7d3336bc37b6ee8790f6e5cd4c6ba5ce25edbc91880ca25f08cc6b5d9cc1eec9e541399be54c25559fcff5649db4eaa332638479aaadbba14f5f81fbd0a3f0745006a81d4652075edbcc06205551e34860187d0c20c07e63c796164f33f9cc2d42499d02c6ac58a3a054a27db8501d02dbaafad9d74f65c42cb0efcf5fc052536531f742a1cb4774568652e3d3597ad7a5d3462ff06ddab67c68a0fc35e8736205a3eb856465efbf29750d77c221c99d74d3892088d37d3e212da2c3ad2bc17c2eeeee612d026f19df340bf9aafacfc59d67bfe34d48b70e650e06cf73a13a5d25a8ef1c14c5c61de0b921bc60ca1d04b4345e2be29aba93ceb8eaf295a1b5d6b86814ba94dc3e1164cccf77f2a57679d934b19d5364c5427311577af0321effd743577e3739ad53b53978404b5ac89c8cc63ffb93a64559f61b62c7e105c69bd259868ef401c273159fc1f5224da92a2ce20ce6335a2cefcf5140a146be8f4da9b6e795dc06d13f08654db051952a710f2ea0e6cd7e50e763a8c512ffb2ea069cf319bfc0066c21471563f5106fc47e6019db60da1c4d156944701be6fb4905f1ea97a0bfa0454b220dd0540fac8a830f1030ba292c8629840e80546a4b1a6c1b6ec9904a49cdce1e5de8032f66be4400742b90635f39dbe6575402a511f2953a034d82f026356328ed8b9d8e93b33142fba3585904a145f983895bc330ea2c00d483eec2e907739bb36867ed05008c8c8cac1c811a948d8a7613dd6ce3a85cd347e8332289ba0525aef63d0aae7d67d68ab76d9d077dbeb021f9df9dc0b708b91c892708c325e7d6fc87ed2a217e7ef98bdd2ecc71aa624fdf354151dc6083e590f0b5f471d764fe69f1340329169ed9d0debcc18999e1564122e7f8a1ee6e435346ea2327ed9f31b11515803789096e89069a6db478102a17da435b502d0db1426271b3a784e0d2591c6a4d8d9dc924673e99fcdb90ed461d6931431eac3e6c1a48490888d0b7971b90c32474d0ff9cef49a82ec6c0b0df3e6c37ecd1bf89e04682bb35a54fdd6d15f012a0a7f77dcbe4995bded207359749220dbabbfea22349f6865d139a218d1d222eaa3fcb8ca4fa92d3d743ae7307d3d3dd2b5fc422f6797b0451dfe8daaaf83b26cc1f8f63876954e1207e2f99926539d9ffb11174343e9c176236235fc631feab1e6e08880418c335507e92f1a4a05153b192d1810baaa14231db1a529426a981a58c17bfbd80a3837eb83930d68046b4e979a94ae60cdff0ed79d8a3e04684cc9140d3a416108bec274fe52dbcebcbebaa1174b56841624af9f428cb883f456e3378c051cf5c613517e3b8c76121bdc599182c8d86442213a1fad1134793c78c7d5d8f37c94b6d7594ac9cf11581db7ec09255ebedbaa77d1ff7e28b7c55c92168156142beb0c255e57005c20f17d11d0c86a647975f94477df000fe19fdf9a8e4b197b23a52f5df432428f1ab6896224b51fe6e5ec05658aadd3e91db5b7298bd5520121"}, - {"0000000000000000000000000000000000000000000000000000000000000001", "0027166cda58551b0e7e94923ad2001e1eb69e4d731632e3faa65eae7589f996735277595e0e4e9f4fe20b9ab7218966daa18e49547d40aaaf855467cbcb4829355231da1c3b67bfd42607b6d6ce56f7185d840b0125d1ecf31d0e99311831c8fd7035198ba05cf6082da8eac64c0c182d1a66056a1e7bb02d7604de39cd16d4fe30dc69884de7dc0260efd32f2e002957eba848186aaf41a2a141351f75acd36fb7d2ba559ae01f00941425ac87bf86cfd990ec0d462d6cbdbb2e3a163cdfcfb5a1943d6d9170b99475e15c139da63f2a33041af5817deb82cd8c29335db74cbad6c1eabf3c7912c84afeaf5a66574be9555c706c70e1a4283db7f70ee255796294b197ccbe23aa816279915f29b54830850e0cd931aae917dd220bf60ef8b673cc279ee787215e66ec67e51a3b3dd59236c5fadb6eacfddfb01d29ef97afd38d0977071fb4db04509cc9bcd714fe0e01f07ae351468c8b5cd9c377f6eac863a6561eeeee32879d6749147389833fd3455673951cf8b0329d9e2014cbff586af8918184c78c98ce2d8306fddc935851c035d56658de6bfd1b4acf466f526f62797ce93c06cb2a756cd0911dd28f64ee4de342dd86d2734fd1085e924ca4fa7905ea3f208a98fe37b292e97a3a6c07c6be5f528c3475c12b61a4d46bcff89ed3fd9de728fcf991e020408374b9e3bf48f173cd9dcb16d9e2047d7133a8416cd386ea3625dd6d054e27d19f34d334594ce6778e7a60ab93e5fcde5d1f23239afb73de08f935cef5ad4f8d80453453f12a1c65d8635908c82a5b9f7447e85e51c286d92ce9692a4a7269bdfcba10ef51c69f7c70a7f850045d29eb2bfb3f781e82794f12b547976d72b5976af73a08584dba7bce34f1be1354f63b242900bde4d3075f4ebb274661fb3edf4e2739ae08426431e76309b82f07cdf38ae69f7c59cc00e6f6ce9b1ce551f0ebd4f7a0d17bf72fc45a35181f14db083ed1190b2ff5747128f9be067125b53fbf0dbf416cc9cb6d5ca786d348c7a3eb8942446f9c861701bcd58490aaa382fc535e9fefebf1376735b72506f6b34b849fe5259705120f3a320dadc75b5c25650c58f328cc58e96da90df1d543485cc0ad0beea21b07fb9f722916cb10db8a9191f8d509947726f618d71951d527334b3849398371ea113dc5a27f07dc2b910614c6ea4148c0bd6e86d4ca12ebd8861065763c0818ba71779269ca6d849da1b4bf6edb04cad48f489a067cc8c5525134c9f75a856745689761e440ef8b6b13c73aea48c89359b54e94d19dfec8ab7f1ddda5b2077bc49eccdb0c7d7e26d28688a4f711152d18eecd1b39c482c30ed211162564bfdbf5af71584e8f4cd3233d5292289e752dbe2723eb92fe4935dd02d1705444755d220e968fe33ec296cbcedd8a39c2317618a70328239adca214e371ba63e853b0bc76aa8278c09a21dc863e51130e992cb0f62596d2e1c1e04ed102b205b395b998f7b7bfc58991b22c3281aa6ceefcfb690aaa8a92bee7069f69646282f051392527cf971afe04ea8b8bfc8145fbd6dfd2cc25e875014d3fdb5a9d132fdac749056e1967f991bae5203218e1c7cddf280b803b306b48603f8268761fbe3c2d126bf3954f2d2b354fa7cba349a5fe60aaff05d9cea6d1fd3c5839092bf14c5edcbebf9ae941effec7c32498491233f81d41ebaee52373d74086b2211692de3892b19dd3f01814f57b4b601d19b691338c78cdb039ef9b37980422ae8527f7d785359a7d15ca1ac87ae57956507e2609d3337f98437fca4d16427164f1328f44b57ff16d2adf93c0e71b9c77187893c6cd6db9a2ce5656fa980c3b1088f415ed750a79a13aa7bc58f8e8e46fff280e984cc5f0a06559ab8f987652f54933204fdb0b07"}, - {"0000000000000000000000000000000000000000000000000000000000000001", "0044cc7c400e83df349c49a5457621f6f209ba0e9554e4ce87161f21639f262a9540f5ed1753549f5c91044baeabe94eb5c53f9311ac2af6d010fef9dfea0715ac94b877e37afd44471219e0460b8978e8bd81c201a79955646366477013319a4a4c8cd12bc15cf5b00cbe95c3b8d6aa1743bab0e66867469c698f96c40402a4342562b49873a620d92a9df33a87d59cbf718a0955b236ed1c73872517e356b7a795ce4f4f3c0d3a03a5a47e0b41998096ce282306459c32c21b784c1946a0de243065e033761a26a933754559bb691e738d11d895a981cbec9b3f54c61117c1a142822efa33d12ce1e2348cced3087ddb34ce04fced1dc89a972a52071b7f6cdd8dc94cf0df75ce30df975184cb9c729b2bfedc00110c136d470ca3353ef0585b00611ef5480875254217a61e1df66265004428e701e7e7920d870b12a0787b8b9c376944e5f670567936dd73f85b3901d0c166b343420f9c3500472e8cd4144e5799bdb61b08538f6fe44dffbfa542bb6a164923721fde02240adabb459fcca4a98ebdf32b05b259559c899155300da242299ba295a99486438bc46303810ee70ecf250b673e3d2091e165d231e6a40bf13c5b94625dfc1f231016159e9c34efb83de44529c9964d8894b54098175dede14c523ccacf44e8e5d27ae59a84b87d08c649636e92cf1f1b32fada764d0de9e07e76d8b71a6f07e427eb3704dead724b1401e7315ba9968cd257a71273042fc60b0c89c05f01c19a7f5304ae5a0b28ca0c14df5f61b8f773f4738852abfc64ced14c5701cd354e0e2a3ad727a5fa96f3ed65b9a68e80ad74150808e1f6729b4bcd987a59d2b1e51ac27f86f05dd63d2fd5a63d5df99b81dd7f88da2fdd3357075e98438615b21bca52d912d923f82663b7e658ae803bfcf5773d103c7df9947df7924b76c165ca839b080b79d5a0009d501e8e41c604f1dba23c30e7b81eb70b7cd11e0feebafbc586a17346f2d5a997c002aa03de73deac056112517f68516171e614c06669c87d6875b84f281905844caed615872de5b19cf94153491a92efd74102c4d09f4f8a549d035da325b9dc7ec1c44a7dfca232515ad2d5652275ffbb2b2c4965add7a5789dc1f62abb019514da0816f14b55f73060fc41fdb150d2a148771d14e012cd2ca13e95438d76713df39c335478045f870301136a59f37a30f4e64573e126fbb121ff19637fc5424bf9c77f03268ee57644aa739354749a144e53d6c753622cbc1fa285ac18f119e195f97275171f2a7ffb39224de4d7180e63421557243afe4bf306379ccd57d033616ed747e213525732b27357586142da5bb4ae2b715b75739815b8c0b8a657a63905490cee3a36ddf7a2b1da1164a5e3a8474b518a3f53f436b79a13c86ef2a1ddffd5b384308e29e8cdb1d66f00b3a6030308ac125a97208a10245e6d76c72fcfae19f03a0f0d08e0404a21c6a34fdc84bef6ee9ab4e01a297a373b0935e2cbc7226daed7930d0e4ad3482a456a4aedb0e0e07382dbb5220ee614fd93545da8e80c876d177b188719c0f252fe97564d150774d3f9010e8cf58d314483002bbbf1b55498b310e1d2a9b3810c9d0221035ba0ad4d89659c3ad0acc99e92f8a9af131b9295c6215f05a2cf1192bf1f98559c4f7cdb3a02f584efea9877cdab99807b33477691f31f7fdd2a0dceb1a16304d97cf49b2b8028fdeadf38b83ac4b00f0f2720ec115976ee4e228822c25e1d346d1e57cf2429e45ba258ded105c30a43c658d7cb47bc1c835f098f2f809acd916fd62ad0eb8f154814ec3148b7cf09922d3429548f3cf5b5e399f9e9a35ba2c03d3beb0db314517ccf15235a2aa1324addff1c5d0e0e491f2a338d3a155413739a4202ec87c52d65cea857b8dc"}, - {"0000000000000000000000000000000000000000000000000000000000000006", "005fd978835819a9c40b004efb11c12d2e62132e412ba5c3a4614f3e8f9698236625532e4cdab8ce73a304f3c984484f24eebbb134c54f3e1c355b5b5a900320289f5d3809d8b924d19677646ddd49ab911ef7dc056a2b9f0bccd460758de6ad50ca63763d3e1b45941f6401db5761c215ef8b375c5cd0a71a1f93b97bea1970425ea5716131963c564f83c2a11dbd5bfa5944349bc504db2bb301d7dbc766e3489eb2160f527c8303730fc49c9334a92ffea323b97db0c792d93f24f40ead1076e2eb33f5d70ce14243ea005cc3ebd227653062d320d5d2f26b008ee7ff52fa196b158ebf7bfa3ef0b27c7eec65f7dae9d5d1e83d4eeac31a9810140b04e0e22f87582b73b3d155acf588fa466f3b671735b9f2fbaf640a49a3c59a5c567d9396bad6b7a8c026eeda86ffcb9dbf45dc62d890ea1575901152797a5213efbcef1e4de0fb2d070c73bde1b66d6c176b6a01eaded0cf966a41cf77f15b141d6cc661bb35b8591a21b4989c9f25d99b4322824d1a5ae28e52dee1740363e2c062c6a5cd608bc81cadce258e21a87b3bcc074b3370d65547057137435dfc5570c1279aed1686021b05466f37cd3df963d116b8391ae44c65cc7d9d4c906bb4aa5c5a5f867d54fbb34a794190e1ae1180125ef0de81e0451b8cdf91597bcd5b56a6ddd836292955747c76d05fedf3cbc3843ee3953d569c73f14f04a9eb72be9ec56330a4a2bb9646316b727f1bdb7611c6e4e746e88d95fa7fb6b37653dc1b6937bde128081ae4bb521f02cb47465b4dc16a46eb14177b9507190abc6cff1e98b743dc0b7b7ce8730733c69fcc431101844ef857db2986c90568d9d9a6635f63db1d02333d2b54bba20421c69344fe80ae258f135ef9ee61170f07c292f0b1038f64c19500e737e9166ef82a50262c54920f98434986547386cab5d2a8f924d197f701e9bc8a74d46bb0ba55656536b94531bfc3ce472e2d27cf6508d158dfb375244e9fa4a25532115d456102266e17b18633ed4bbe434cf5204f050df7b2e5060d8710b26a8b3e72d370139e63cfe34d8361d6ffce04498f3c0c58c0bbc420a0e76047631115581d2c0211339432ae4b8e89632bf35c9b40c8433c09bd2a9612c2efe69acea5a766be92572a234a20a1aa95deca33e3aad31c26e2b17a991348de2691a26020fb00e905cc9eed5d5eb955c016a4b1fb7806d96bee90610a0ed19d486a8c8a678120c2c195fb8cd141038cc7d506463dc4595dc4affeae9231891a9715b6eed4c1cc143a20c4fc2a2b57b753c248dac335c9d77d1382ae270b1f3230d417e7e9a585cca4e8bf6e6b9e15de80511c1e39a99c35b10fa6952ad3f5969dc783da7fa7326852a9ec70bc9790d847a857705e02c9ec19fb56984eadd31c699be38f63ca287366392ef9de1ef2ed036fe1fa125f8b6b0d3ca4e9dfcb1a55f16dfba6152fdce3158f61309b80c568d619cfdd86cb87fdf5f109061ddad6ced0edd1b933f078f6244507e9f6f6d114f86f6b3807a8168743d6b51b46f7f5e5fd7c17dc03ec9fbbfe9721f2de8ab6abeae2dab26dc99e490019a55edb1050e78d4439b29c54ca9a734ac79ea63905dd03662782a2c986c6a07942ccc1775a7e7f9ff806bf35e38a9ed561525120aeef74fa0127829e53df098be65759ccf42d18436207613d42ea93b15749861c352a86709bc9df234a2896ff44f73b51ed3aa52915f8d9e1c82f7ecdcdcdf6245dd1ef45a64d99b82731547754eba3c261277ec3e36babf79ed4c93965c31157cdac6dc9cb0b3a9428aab5cad8637c3e1d55291a6de3592f2a69d564c4723d3c6d48a25a465c5128180689f552cefe8714e673c5403fd4ad9bf393aa922caf1630b51f91e7a00fa44b43781a32e88ad96728"}, - {"0000000000000000000000000000000000000000000000000000000000000008", "00ea9d125dcfe3f8f21c53a3b16a9e2a14397280e715185531fd9a76957d9d528a282a362ac2907d726c1346c106596a8f77a9ce62b51d4290819c29da324e1dbb7d15c25f89eb3806149bc3f206a13279eaf0f503d8109b6b0db467d8d7c468eb320601c0773e784e064e3b6f6b9f5ab5f72470cd0a22323d6403eefa3b215caebb4d647cff66f15404a3cdd1968479f611d54d58ff8ecce2ed79594cb6f3093cee8a3b8d75767803c1ab7f7f181887841d30efc416e810a9e0166483142e3dd7aa13ccfcb5fa964d474a611dd54658f9a603cdff7b1f0c1ce4620813a33bc03d4b07d45be50d0d71fb47dccc73f3489381915ae1e494beb64853880a2b14a6d9b0a6a9a6d4459a2d7a5641d2b232971f3356c4d616ad0681764e139e3b656af65eee997ebb1f8b493d2ece843f835ba2a40836903358a4fda9241fcf9dc8580f07f71a3bd58ca76c9a3a61e31e3223055ff40e23d0060f3b3f769d6046ed32679e3ad11b0fcb1d25f1e0abcd6dd3c4a741a818223c8939982012eec5ff65d7b1d7287e83fbc53fe80f6438be3f4d1c7c5536b36be1d17cbc9249f3554c1ba458bdb7ef05f851b352c992f786ed70e4a891ab197b33ba9add292291e9a220ac4d9ae5564a15550a360ea0d60a2c06f6b0d43e8603cec16df170ca6f4e81d7d0d0f2455c4fce4bdfb142a9dc6a969cdae11da2afe975b24308d7913953c919bd754163f4fdf4dd156755ad6a1157070d9c055c5f35677c257d4ff28309d161de98cd280fcc28cc116d4ce0c5947124dddb01edc4f02f5844105753626238c31bf3a4f063d7730f0b85bc5b2d302ee3d6da4f1293266536213b6b172b209a3eac9b3328255e7be0892337b3d5036c449ead72a070c9b734482af648d24b9b44dce5445f4e9a9177d83168e34c1cc491489beb7710c1774bd26c3366bc919e5bd401b840b568f6b647cafed72db3ecc94216e7b49b461bc4ca34ee5b122ee10338131041d06a252138e84e02da4a44be209bcb4b2f22b1fee830859ce89c12a612cf18b90aacfe419188a4ffd2594fe282f9762b190280fb573a5749053b4ef5b087588449a60cf9f9fb260cd210156553db2c7363ec6233b8f374365cfb481a4cf2bab4322101d47102796537f519c5f2f27b1e45378e50f669223b9618674b2652dffe4626f2fa0103b0ae009a07b52e970f809e5ea1bd08ad3f8604dd47447ed1609937f9766478b002775586acdb9719cc048f39320a1d8de9988de20fdf7ba3fa7e9e7835d92609914d60d1ce092064cbac5e77ea6ef643bb4eda062633e66cad26d973f2308c8719c269621736205715ded6508f5e695f7f93a7d37f5fc0b6433755b9600a4283b736ede3719fbe414b623161fe9a03bfafad0f5d5d6de1cb63f3e3a33ac9867fcb5b1e4ffb9318030570b0e588fba128ba77b2e4faf85f60b93d65b726aca7de4d2e66e78779e33f06b2c8e790a89fd09b18ff6f92e0157cafeacb21e9e0a197dabc977cc92e4c218e75cbb66135b88ea4fefef4f45f17965e0268061f1033f44b454b702be23194fae55e1cafdebe0959cb6f76f92a07bddb0c285c18dc80abe5131f8e4c244253824c6bc55f7ee2e50c63b84e9df868fbb1ac421d7faadfdc29139d5b546c54af9eaa053cd17f7a044d1f657a0c7572c38205aa9f49ae8219549e924a1d7c81991b1561439e11b8c02ace05125809349d5f0566a8502d03092a489726787e6be5ee49e9f6db5130c0d457a7d17496c5f2f47b1bb323a6d7fd5f156a0b0724580d84010b254405c9eed04559bf873885b60db6237f1deec6d996534409a9224a623b469cce540cb989f959eaeeb7892e26f7933fd385ed38fe475e23cd1ad2e85a967b323802c363ecb609dd3871bbd1"}, - {"0000000000000000000000000000000000000000000000000000000000000019", "000705eb589b6883591244ace7e2af55a257b207204bc46dd5c713ba81ef17253312d2ec1e28763d20690c0d23ade04cbeef0516a322611fb34a2f45797c3b1e7639ae9b4e5174f8b034b4706282521f88565e2a14d2191aedce38a5b32265a5fff8b171906bcf6b7e18a74ea908749501f6682279af37d4b18c7a9cddbb19151f9a0197a21fd0c2c99c3457efdba182ff94d43b962ee73f6d02299d464984607b4c12930b3826d50205569d316a91c1e5af9770ecc0fa6e16a8f751130a13ec48c908e104ef7984871e31a419c6de7b72bc13a132c90d0ca1a2884e534d1021594ad87d1f840f2da5be493815be98b498a30daec205c703f27f0515074e7e0980a95403b5b3538ec072f2e20dde7805461615c2eac2494374ea3fc16f31e605b8c6df27a99115b92dfa534f96f9b41f45afafcf2b6f8f4d1f54346cc5ef86f75cb7635b224add17ee338ed6a25f8dba00ac381bab657a853766d5d4aeaf34c1ecc83b84d93c2b47d6bb679ffb8b09f4a13df797130c92bd6825035de9ad295286d787c152261875b43cd8b03647fc05d8c22eb35413fef2343124e9bf7084f0db1d670d0853cfe0a4a3eb09b6d0796f6068b64ef9cf5b645909ab04832fd69e71fefbb209ff71d19960d0b1bfbc162ef538ec97bbaed7df76af5168dc9ef1b1b7fe772563cfd2a54bb7a5c077b74a55fdb61623299ecbef01e26615a0eaef3da2ef81168922898b730c5c21650e5bacdf53d60b91903671ee4f198430f0917606992bf749e8111ca44d72cc737677d4de2236c7f8ecee2f05b5879c1bf80ef0ecb393052aaf80fbb2dae3ef093349fa318bdcd06f828126b511a9a8ab5db13ea3375ac6ca6be9527f6ed58817bddb72feed8b7d1a340e2eb074b344c11ccd3f03188f521e853e59bf2af617ae3c4cf3a094f1ab18e4e35155be6eb23835dd56002d11bc7b9df3e17a2a039114ac10999b123fe1cf02cc76930123fadb76ced449c0d843093c2f731e3523e35c3593926d6f3872129bfb6bf7326b95169baa35e9b71dd49d119fd9e288b892e26e5f44b3bba2d9073fc986b058cb9ed12117348576377a041cfb1ae9081b404b80d670bd032853a06154d07b5a48df0ed711a178a0adca66e6cb6bb5a67ccf7a4f43c39cfdc11a9f3a57f217e7299c10a5b5a76de90d9f5a975b2e05ffab4fd446b23b30cc7a227fdf5b3af33c3c925e0b2e661229df78993acdb55eb13544957f3d1aade31be61ecd3893677fa6e13552e45ff3119f1a398420404697d2ad25f0cd4c3c17517b6323b9f8743dba62069db0579214b564aa2c4667146fbfdb65393f656b4c8a3f320899ee855359c8ee834f52ab4549bb963c26908b3ddf122d8db3de44a91b590e2b0a1b3a289769d424bfbea0ae9539b90994124e118ebf4bbaf061003b34c0078b6b13d454a07bf0aacd15972c7636b856c4148385961bbdd10a17afc769c04a0176bbc0f806ccc50e816aa8198d9c820539147a1aa7dc5fd077860727afc23a2313ee5d4c80c37f0957a2a6bd601a179a06630199b205cd461240eb4bf4b1e1145d6cab1d4c9cb921db225ce04d13e3c6c86c297941ac77f11d307a776b12648b12bae6a498e5cc5780981d56604242fe37d2d3cd17959dd83a9e7ef5ce37ce5eff8909590e97799a200b04e8464a8fffdb83409f5a8aeb14fece75b4e92f77fd6a2264feef697ddfe3133ec916f84e1271c7f2704c99019a8d9e4c6a48d4b73c053085b5b71a141d95734b5b7093df313ae5cb1de7370b5b7f1aa8a3e40fff6504ffe7294cee91ba7b625b0eb14ed87dcceb03b19a42ad5697a29a270fb3e1dd1431ba4fd195b9f396ff72e2c5440997102cdcda0d21f33cdaf9d542673886e47d63d3f3d1fe503ea138"}, - {"000000000000000000000000000000000000000000000000000000000000000c", "001dfec28cd28cc3758e61b092f327caa11a3a6c8926328beead55f812edce98562e459bfa3420b8a1b4073a24484b62a811abf664233b65dc2fcc659fa8540ba6f298b5c6836a621b80ecf08cd67c4a5fda2c13210ca9e80d50e817fc162675d178a5e9c6eaf981b93e204e02175d9c55e988b4f89e5d7ecd6ec011aacb2cd69471b9950424f8fad3e4cfc29c0226fc934a443f2cce79ecdd75a3a4c125d4fbd280dd87623e236000df3740a1a72345501de0d1f99e7aa4bb0453393b0519dcadafdf8fe3fc58b563ddee5dcdd86fd6c48b139fe234e059fdb5515c61cfccf9b120991d87d58d1e1740ffe7cce7cf346f67df6bff54f22cb7fdf7ac13aa9911b84b3e236c66b1cd9037d50874bec3ca1e17e352e9fb49046b804812dee6c2c86ae3909ac17717b27705b85db2dfa035c33d055a286978faf44db832ecca359d1b41cb26ba446e5029cc9dd1853fc46804bddd1bd068461dc7ab93d0f8480f84f4bad998e05f54a5be096955875bf196d76be8d529ce9a7b976e10577ff06c51aafedd9f028188a7483d97f59b939c402bb560dc17b9770d75360072b4d43b34577f8e7905a784b5a2aee1fdd05ae7e5abeca83e4ce27577174902febcbb929e31890407dcb2585472741498e1ba0c803db63253e8c7c051c2856f20b7edfb1d5fe0ca13865a16a51f049198fd228906dc66ed087bf9d4c50ad3a30eb88d427baf20e155021b561993764de27e2f8ccd2edf6b5e61e2aaf79491dfd1b380521f12691dfe63a63453ad4dad4cc3862bf125fa78703a64f8348b91c821a41fd7ba4834e62bbfdb35ffd5d5e3660e12e181df26420f705e11105d7435a0984c7b86482c14d758908e5fd93fee03aec224f70a070290526c2b8d9f93861a9babf23fc2cdbe180864f7458ece8c3836824b94dce28d4e4113d35eeb88b8f79a152bde00f92bcfcf44830ca66467c2d97a8346dab3b9f34b0b8620d7f9932b9f8ae921e0d8415ed6e57f5dc73b30f87372fb69e4dde9467338e4e3b87705735b49e140e8947ee02459099deaa4b3a3358eae6586bd154807377760c2cf90f5d9951622dab2c5be7cbe15dd9e2a1653986c123cac98319454122d6d7518beb14c7f079dad8b28873168cf2d236371ab0b864402b368ed1291cce382e89add6251520195ed0ad9a30413817a01b95195f5c536f6f127f0f37b427c3db00e1b93e40526462f27cf3a94fe58e07e75bbd3e5af6e3e43d6079ad84dc20b43ae6f05d0a626db50b1740a510f1e1298f7413f96dd45569774fa27566e4f1697192c5f07c0c336480c704e7492c186107f6ff602069c667f162f0d726652c45af28e720283b715cdc04c55bfe017463ef2ad92047bd55a72e3a73dc001dda6d7336d206b8d7e2f565ef5a19e8220e13226d1fe805c2b050373b1863719e497cf323320b7e53b516705734a7f1bbfee08f653b9ef5b27e27c9f482d05834f99468611fc209bd133bac7a1d3c2b0bc987a1f8e6aff2f161bd5d7f8fc11a6558479025362b9df7695d0151cf3070e3961211c67dbd2cd70fd5d9135145f95469f65299917dd085c5bcb190114792dfc6d9d31d59f10900b3507c4828c58f128bcc3658bfa59074b727c38ee6fa26f9d26a5a94bdb86d91af9e1006ba7b61e1d5d0e5632d38243dbd67c12c3fdd64ee9d5d9ab1e48911b1721b141cabcaad883c5422a5e415d90bed3bc910e794d61ccc6372ecc80c160b06ff93d7cf30f71151ebb1f1e55e5b6d9f593a26d429c221117cb8e1e591143d74ee94c28c9251995f6ea3f5a3f05b57fe4d522573f1426da8c8f6c1ef4a9d6eefe425258d406f01c967b419489b241ea6408ee405f74931f3c7a48561cbbadcc71990cb91a3d12652a7ad319e30bb106f9"}, - {"0000000000000000000000000000000000000000000000000000000000000007", "003565c15c5261357f5c761602b86915d1d0f8305813a04e22cc0c7016c45b338c613698f5312fb1656e23ddef642d74d781faca361148c8ffba1abcd5c35e69872c23cc303c37f7d9f99021dfb99760ef5e5af9029e59cddb1c4af720a8e0c7cc3a9e528bd87a83fd2a58fef368f046439a84f488a5b7bc8f59f95afe330904fc95b69e223b286da0a58340b42982bb382b730f4c83aa90e2bd03370c22692bb1e21505d0d5e8ae02ec276f918a339dcac7b1f15ef77186d9d81958160c78b5dbb708d9af1ad6b819c3c152761a9c97d58d10bffbcc5b072a549cfc516da30e1fc50b0f7c469d304ae22fca4c5c5ed58ff4180f6668d2020373e37028d7b24c7b9a44b3fcbeb3e78c290f070ed55f84d6555e94d4f5611fd76dabc9b76f6faac2d527fcc72f49d95c8a79206927c4ee95acd0419dcf968f7effbb5e3f54b23899935bbc3ba5fea74c7b3590a70da32b0042c3ddd8c86a8b53ade6094acb583617fa3e59ae07b95dbe2284dd247e1242f0e849a15e71b43b76ee00b57524c6808fd8a1ecd060f4bd0f31008efcd79705a355f827ded4a382a095f4ad479ae9aac8aed7c10517ea00569cac5fb6735133f95921c4d3facf3196071f85403804c5a1777fc5a31d482169f530f200490ba74f0d5e4e6edbd04fd1a424343f3ce848ec4af222615b0de62a7c4b8977b435c9db8aef03b51b4652049f103d7095730b14e361a17697ff471a861c66cd8f7866bfe568b3976cd3492067e78bab7b5fde3d4e0936da2b925b5f536d90e4d6bba7cddf2aabbfeec81b1c1f44533e377ffde7a57950d37f6643bedc6e1b0cb1a5856c5cca5fd18135aa1355df5ac3c4f70b130e2dbf5baec5a40d08af217010c408991b1e5849b52709c14145cc00b5b97a33c938b400ea66f854d5752cb9617a5796a9f180f61a05f4fe80d318fb5a95060187b2a682c07fe2106bb3cdf23f91d90e44909afb15ede917b9eefbedbe2a042109d774dd6f918dd36a1b91d681020beb8d56b4660964efa2e247c6379ae82d3bb5413910e267454b55347d711195ded0f4a22c0377723f41479bac7477406e0431235f22a8de901705e3082f4e13dfb7738f50f4c29b026342537a23f804ace0b200837065ffcd41565a6a7bde687c946c08083b26eefc4233b26c78c0fcdea3b54c9da69543c80334fd6cca1a52b1b01fa0bcf12cf2a19f83f57084092297d61290826f52b7932307c246b8d68c94031109a68bae8b53eb00f36dd56250d5979a444b9dee0c40cf23f767d347ad072a091f37583baeae20fd9d59050b0e1d2e841fea5e47f0f89941beb4bdef95deae195ab625a26a620bb6b1b899505b5962a33a95cf17088f27b95d1137bbef02d612456f99e6a004bac3974d1f8279a2f0b79faa676a06d6e8bc82bce1165d9e03239f57f904b86b2ce2c0c7c17d9f5ced34feded318d6ab7f840ef2776eea24f038b917e24073bc55bb19e7c73d0466e32d8e6b722244aa1be592143958eb1e60438fcc9367a5bb88632cad1be08e73a47430ea06483240074fcbb18fefd603b5bf3146ff9bf81f760d7f0f5cad50584d0cbce16020a512eaf34d7ac6460e79a1716a58bf0dda13e737b4439fdefc32bda5742d0794d11a97987da481d4e1a3b3ffcb3244bf0860119fe2709a86d9175ed202667fbca84ca0920b1c823d8c04c67297e977a82f08b1197ee8af22ded94e7c19f7fbee246e2e6fd0ae87c9fae9866f009a792a00243a51d5077aa549ef13552a836645e24a6bfc847b166c19402ce29c894bd6b1f566133e8da51c579d1859befe99b0ef7f7bed68760a0f56d7b1833f74411d27e1b55530d63c0f9b983523c3cf4a862e943eff822fb70b7ffb30610fbc0ff40950c2b8cda75795b023"}, - {"0000000000000000000000000000000000000000000000000000000000000002", "0017e4809f32ded1b9e9e2820d5d59319a4ffdc57d0cbf79d52d86c39938c5d281336b93b647bcd9a49a0196aae2a01a20bf9af0a820b66d47cf76107f54260806baeca5cc4328eb61744317cdc3c192a2109f3f1981e79b6c6492ef903362c2df68b3321884f4382a1a635f65585f94755146f4f81d7d450208b639485b20aa35e4b86d22e398c83c5ed1e3053f325c5cf4c12c98bfea46eda495dd85b39323e09759ae709ccb1200a5412ec643e64ad547104a6f3ab3906db90e8bfd0a8c1c6500847e20efdc00f5b1a9a41d154955b1650245c19e596b5e7960767028c1e3a709746873ed684c8c95a1faf975e7dd7376e185c2b8c6507656407b01e11f36ac490884cf86a301e4b1aae2d708b77fc2459a13875b14dbb5fecd87e215d153c2336a19744b02d197f7a89b9250e137933781a2a1594b6191fda80b69eda0a8b6740bd801ecaab7e5f10b34f75a4c8c01276d9f088c4008e470c9e25cd73b62c7ed98f3592a62e2e6e15d085be787f613a23fb6a704489fabf40894f256491f2ba9253250ef339a9fcceb18de542e0f54c10a2ff5f4afc53202b161728b99826a312fb40626f9f4e371393b8e2fb2d22edc6af6930e76e2422cc3065c5213904fae8e7574f2cd8d5e10d05185550839db23d943acd3d5092441dfea1001365eb8b0555414854d4c155d5ac38ef7e9abfe13c213083dd4220c9303519cf344d3d4bab2b78d5a34624490768f2444ff72eb3c63ff1da779c8eb3949d59e91fe9c8f4f186ada0107d279ad95557660e4d0f0d219a035951d65e5ab8db0dfb1bfba3bb87e495055f2e24f3cc1170f913eace838f7cff45ca3ed1d31c4063d8adce9932a48d9aa714f7b77d039135c75b759b24e95bd5aa2171abd4dacd8e1c75af5250d15ef2ef97cb45c83b53ea84ce523ea59dff983550de33031af351b9aa9d0009f55931e0c3e06aac8e250271522e09e6b26721101c7a2784dc1aa1c355ef05489c71c251ca22ce1341db9513a021afce588d7b3d0a01ef20bb8615fc00422d0b3fa8e11c740dbc935d5ba6fb1718db656d41510666b6146e1194dddb1032116dacecd4fabb848f031f004816811e061c10ec5736f355796a5671c801b27a784c607ab6bb367d684436bf93ec9ce46baaea44b8f1e3b6164b873b4f1891fb05f588e71a118639403dd4dd812b53ec5cf4c815392d8a36dc228d0bb6106dba72c791b601fc46d93f621d7d1e51e8872385d1b53cacc87bcd3fbf7be5669aedc6b0a26a356740c31e979d35e2064996511d534aa6096ed86d6dd642305a803c7e1a02e614c88f29edf4c95a1a1171cabed31e1e2868beda5a974ba0471ef7bdfb226f1565b2a0c9b730d4c8628d9a05491191ba37011db499ee6e4305cdca84b1dd2cdf0b194f256ab7d5640e33b28de0120231abc9a82aadb8f2012531d3734b0573fc09d1189fe4abd0bfde581a69447f8ed1ba918132c0f0f0adf1744e42aae29ace7e2ff4f752fbdf1ca5c0bcf615a074ad11df28b32ae76510b7fc68ea0af58039e0c0c5a10daa1d2db634e115821b9e05326745af50c2d265973619d01134dd18483256937621de4ff28fd2c9dc306309c43b6f886e3cac325bb29dd3a3a0b374c32c49942de37f9e25525f58ae20565de8618b3c20b9d639124852ea57eb89262da369460cbe1e7b72e0fbbd1fb58a5f6a1ee46e344d2d506e725ab9eba4412dfcdd775caa5f36830d663775da4aebedd3aefb133a7a32c9e90cf5b424b358005c5f645a064dd8fd4145c50dcec076470b893f4f5355902224fdf32e6d22373e192ebd9b1437dcf2278b4f0bc31bf04bfd7ab222aa246371686afba8fe29ad7e9fe054024dab4b028e6c5505f68280d4aa39292d527865ee4365ab1f6"}, - {"0000000000000000000000000000000000000000000000000000000000000001", "002644d8c3ca46fb4da5e05432df8ce60b12bbe3f724ae2eea53f81b0dcc5c74253b44dbe5975f78bd2b1e16c3cd3d4a34d0ab812537cbe615fb7bb0bd5f74253592a0e48b98612528b320b6fb799e00e772f2a2099abc04535285ab2d98d1bff7383539078daa04bf0cfce901b7e21257b39185dabb5faea21f4f192c45219ace277fcae03ea8d0c3d3f26f8575279652bf283658bd31dc67198f7803d6b6e7ef1791ef5c709f8901455e316693961ab09df2660613b4054538ff349d098f9882c605df0ed88a0718b9c00ade028ddbe4eb090db98c3268cfcff0d221d92e799b1dbebc98cf250c70bae341373195c618f30e847f6ee56bde8bcf460b2e71c303a8d473e86d2372f79e65993827794bfb13bd19f7004709223ae4752c2ce5340571392c36171489d394db5fbb15cae601e638d3bb4909719a5cf235011dee69b0e6dbc905094a2a73a916a6bf9f36530117f1198843d25a92d4a41feceee5226d2c3885d0454aad30c01f9211129fe98c70504dca84d0991030038339e933aef033fc9bc788b8fd43d6c5bafecb0910788ff39a1118adf88794e21c5935915478d7c03a018980fb4e481061d580713b33e105eb5156ddbb002ab007ce5f8b6c056ab0d4622a5871ddec323d49e00b7c816760ef1947a8a77583142e65edf88b527b6315c3fe34fa4f7a6717da15447f58bcba09bd7311f8020a7ee68b0d8cc1915e33bffbf145862538d5e40f05d0bfd91d87ba41f235a0d771292350a2869a8a2a1e016c492e327341f098b3fb2e353b897830b662f52f73d35b0e27412d569df39ede6720ce1dd1bff9d202fbacf8e781d5201dcfa1d10adad5589972b07b360e94e1e88651608c8f17f2fde8acdf8de5689b219d0c451e2b995bc79333ac0244df1e9517439e5cb37c374175e6329bc03f6f8238f17df5ac477c97dea88400b4203197a794cd418584c7c946c7556be47b8d14082f2eb892e2b1f7cbce314f215f632491c36c3021018da5f52a85e4e692fa62b5caa5d051f5fb928abd193941ea334b7ed9afb0b75dd5be282245509b41570226ff444e9187053dea070571cc722eb8615fd10c519c6b7302e0d44b0de419a4f659d6ba7f27fad6fe0a28b5d0a78fac9dbb9a645652e65fd24a947fc24790ab6655f4b0ecdd95610dafa4ffb99b8a10dd418801aab8834f2df1ada6164503c7adafa99788f26ff3068d35c7ad0b3dc9d5a56390e2ea5fe1e3b7f8cb6722cf0f7e6be085af29a146e8cdcbc091f59b11728e35eaca4893cf500d31f503c1d0eaac1756f9df5d130a31d68a3c74f41fd46a221bb0a7c39cb688bb49fc2766f5912c509faf741194752fde712eb5421d15b80c050881a54675d95fb0f3842db69c7a2e8a7cdf8a0c585af0f3910dd57cd2740dccb5f7fd743ccc03d701a74b1d36e2ec63c4125199cace5fc1c23f596aea68655df1f9ebbb9bb427671050d6042a344b57e66a10af6cafbe29cb0bb13e015c172ded01b7f7fe41082dd11c14c72f5ff3827fb418ad756d0d65841bd63a12cdd6ccd318da27d04fb505a872b81a920fb58e932f4b11c2094cef33f9211444b9d7c69539a792c269153f87e38205c74efff235edfc7d5742a60ff53d1739e2b77de0d24dbef340c62976df1a59ad4099bad501b94ad142107f3d6d2d721805d7979f3de5bd5d8707965adb6219da97f5bde08ba01a7fdabf41f96e8d0ce77ce37ec507b2e0558135d599a2a84dbf721c0434a847d2fa0f66dbc2894b185afad49f0b033fb45b036a0662aa53a1eae340f20e0a468c1939d36ced1005b2352e9b824abe927541a3646e658a6298b41fae1f9f2dfbc64fde60c3c6d298b79af8b0b667f0d116325e536491e028cf61d7d50b79e25396b18076280a"}, - {"0000000000000000000000000000000000000000000000000000000000000007", "0019027676982fbf714c921f27cd0e3b2a251cd7870de9ac065952c0956728d1683c2881125d75bc3d9210be3e157396649719d1f21850307a88f5cfa9657639b4db0805e8f9e59baa442e30284365439970af8f0bb5b3b7ef9497395e3a53f17adb9de1ef66f0483d4d3c0c39d014e94caaf13c9ce2fec53f3888fda8720bc35c9a2944d0cec46f22e92757eb44d8e6f59fbe1a464ca0cd2bdf7df382b41c5dbcb7a553c12e3e94011f84310648c8e5a26e637b904e23e5a0f23248df05139688420f07b566eb7788e8c2b7fa2312b7741a01eaf1eca3ec1eabb43f0458c849141dbbe33526f40c3efe780cf66809d7475521d1d937499038d63d4b04c91b804ea06a851265c1f378fd36224c2237a0060f24fb3db5a9330fd7d961127bdc47e077ec078dda2d414791775e74df25e1390a334ce6b65aa138581b426e4300945872a59ecfc459b02e4e19834e59d34d00fe5ecb9c8a37d7890a27140e753585d75b7e9d800c2af128f4cb94c3d04063a919eb491928ca4a62220254e04e32d86081d779f12389a113a0a37515125531127310405adc3148387442093ccc3d5beaeee82f0b6b19a6f35cde77f6ea6108fae6952dcab7b0ef36151bf1f0252ac089726f99ba106a4076b9cdfbdebd13619559ef1bfa15e21823323f2553424aeefe039c22922b6cf74c5b07bc5e53ae13ab410d50314f4fcf01bb0c12fac53d7d1a84f099cd0f3ff61e21167d355be03b6ebe570bd336fb373f1afc4b3b57f7fb16090a393d28a3c2cec840fb16bd21d0798e0ccd5383bf31e4d776bd1f57abf187352cb257f15b14115d14a704dac26478875b79529d8a3e2f7db66af1edbce95522e21ce592f5b6c1e828245fd7610f5202e3f2770d099e2bd85c18c0abe26222656efee821ab2a79197122eb24700b519e6aa3df7260fa2a1d29f4cbb4ad9a009563c988d3512d2f1d589d9c53ff439a43fe10c40dea3f279c5875c5fa58b1cdb5530b2692fadd831d0a78d967f9317309b32303d9133f234df96355074522c1d24b51af1d49d722235cd1dade568d745eb6ed0c07a99977c3aa51ceb78596beeea9c5e167da34cc0f116e97138b7807db99367cb6d4063f27b49a2e6b30d597c372a048bb444d95fda2f23205998a324fd657e01ea23468f03bd6f5c6b17966fb65de9a33ee8b08ebe2f16c13d0f99abfb3f237ed9995dd5bbb02ae345b34a32feaba196b42c5b825c2f9d188deb2d1980adce3fe837b53d3e96ff56870b1de29897fd670c12b73c27620f3ecf3a74e344caeecaf2e5973dbdc9924c19b8f53544b69fa8cd5c7c14ad2ba0b8df10d83398a9f3fbf18b035d0d90492144e7b7675541a934025e7fcae8d8c43afd47664ae357b224e0567bfc46e2dfc2c2243622cdd31b2a9d96f79eb42a1e59c88120239342b440a358f684ec1cf3def120faf905f944f04ac0f7e85258fedb68c00e6101a995883eb0b38f920b4cce88a1f5a33e96645c86fd1aeda449df7511043edd6ec449759f396f8f799a6be1d3bd3871f94b2039a4476ae255f69feb021406249e8715eb22ebbf138a16f687e6694cbf33829409fe4e46e539f9ebc370753fba793e00e9f597d62b846a771950e3cd1c5a813dc4282aa0cc3a6b020a7a37ad5e35e957596749b066ca3a4008f3395f7704187111a0614cbd24bcb3b194014ced40cb6af425cf4054ef8fdc5d440394a78269b53547de340e997409536e2c5eeb196ef7844602edeb17f14969fa7564f7325e527c2e6701f96240606d915a79d935c24d148c689f2e4b93e4a561aaaf01e4763866f54cbc946db15e49b722351e8664fd0420c586b05eb9d0229ccf48101ba55daeed4fef8a8e52c5783667b4bc22edf4944f25f56ead33e059c6dae"}, - {"0000000000000000000000000000000000000000000000000000000000000002", "0008a13cfb433f57208832ae111b4e5ab0949819f624cbb55396cca90f703b233801414734d13c97c9cf110f7e6c1819f6b11e909741ccf7d349f8a5b2cb131e7f2328754c0912e7c292f0dd4987b3a1f1bd35dd06a5d95efe937b9ee769114fbba864420ea0db0acd0cc46787e9d6ab73e7bc94bb497d6235f31d5302550a6315a6fdd18f673be946c1b7d988f61fd6990da418460409130ee394a21eb4203ee6b54600645669e602c9c5f677977b0f1ef54352613559f3134bdb2b1b05871171b2080afca0ae01ca48500ce08b8653e0320fc4ff14c74b304eec7793198861ff91e3ea5a9ec71942369f430f8e9da2fd241c567bc042f635dab1771087b55e91a49885c44bb2a4711829ea1e317507ad15c6749ed19e3ff10a1af3276dfda8dd429f1f837d24cd3a5f73976989c196126a6e531e77123f3b74a55f56bb6b589ceda1b24368a1cad18f3e4c00de72a700d68510225cb4f542acd3d8f4ad5466a7099706c308a3aa479406684679fc10c5659ec24f4b2fdcaf081f3f89836210af60942644a1e0709395a38b3fb34d4c10db58ec27935df152b4e019dff2c53ca94e74450b78eabe2489fd355caa38d209699f5f3f7e3f2ebe1408e5d739c84f3b6ab4b236cad4073900985f82cd22fa842e6d9044c082a1765d46ea0712a8d977b2145ebf3bbbd2585c996727878487e24ff32ee6bfd6f7028dbf2a2c890c90ef516098b6e22ed8fabd98b68325a7fb21971df3250262d25fc339104de6d07165190402e6bef5cd5fc79af4b2f64c2329c90fa5d9118509c73db5a84573b6a343f376b82bb11536deb0c7640a6f6fe14410e6034fc8960dceda6766795dfa7659458ab7399b25dae97b52a540557cc0e704c338cc0617315defb7c6bfcee40138bfa975685f7e0cfcde362fc96ba6bfce58829df2274dcc4f5d3285fd9b49ec007d66edbb810b5c752e56a5b66b6e367ed1984d0822d2ec1ea549b19f194db2a5acd7ec3ad77297fdec0b525557d50d16df22149594a9c7b1f1a13d74326622191b3922b5254be0adf2c7ddde7cc5f83a105acf0391de2c7e0e5d2189f5a4b544c03c5a16a03304c7066db937f1b41749b956262e5ebfa3a7de3ebfc2a80a19d36862a309757690a2691630ba02bd44fe78ff108f6fdb05243b236df11216dbda7965cf7759d9320750194851cef8f50218bae9df5f9882df717c7aaf22a7c1dd989412bb4f79560e7a707f2e649a57d73c0d6bffc96289b3e697f882c6d3f79a9d737cda646912d963f7aad87b26dcba749fc1f6f6f6775edcf91c0915855572d1fbb0fb9e543eb6d4f33dc9624eda2b4496145891e53a4d961404e24a7f340d45305bbdee1c15128c881d1f8f5c4f14d158c39e4d86b73de47c38bb7a509ed5c4d915b5652d1ef9515e7a2fdec88105e40fcc60e52e89543521e9a5ecf7391c05b218e508e3bae0f8e6d671bfba620db4e8dd8cef4e70bbc2129a1e19310b3daacc31823bed12eff932b54ec4e079a6e4aeed6717c1a80767b28e403f9a9d87558c0f07608ff8e7294cbd53bde486b660411e07cdd49ae25fd4efee466abf41ade0070430cc0427092cda56270f1185899212f21709f191ee7372bc3c97a59cd1511e396ff86ae5ffe378d1522afe9d69c2219d1ad88f092295b0334a6d277806a2e5bb98b71970b35e13510f6d9c5932b80de7f58867717bdc0bd6b2905b38e842c597d20d50f7cfd7cf549e7af3ec67bfdf3e45945d0ca77ce61d891f9767561d4f57378e2debbfd0cd0fd21d374dc7f8ec7b9da3c0b9b65b69d628d5311a27a483ff0e4b959cdd7f93a5a1e68655f5a1de937225566df5520c2652fbd802ab5ffe8104ff3bd2b2de419a550b4f92cea4b2e5053b65feffcaa006593612"}, - {"0000000000000000000000000000000000000000000000000000000000000003", "003ee02a5c860910743b12f281f56d5db79316368712e7be92f31e7ee7773a03ae90cfdfee465c12e7d401c010a9ddd08dd3fb7c6098844f8ebe9821d54e43309c9b757a59c409ce4864320c21a1a2a931795997033867396642f565f85ce6adbcb9a6764972dff3540c7f5f03e78e41bce4d1f65cb44db5f9fd1e5e2f8e0d9f6cdb324ee98d16bc412468e29709ad916db03a446ac2f1c2efe6fb8a37a62e1a6cb1ee142b99904d06d34f5376b443b3bb7a812cf08d012dee6a5ffaa31a6a2f32bb53eb30d0d7f878b34f63d770f2ff23bb0cb78d1a75e5e76992598457e242a96221ecd8dfd8357db2c32c774427cad305ab5ef7b7ab96077cd5511af2757c20a6813f418431f5d8c4c8cb51a8ba9f6c1e354a832710f82bc609c234e7c6612350091d84c129c0944ccf1cce57960c1869cf4391d2b8ba987e3d316c4fec12e70eefa029143220cafcc5c5fe90a19f027b1d8ef0184455fe147474e6fe03f960ddae5c7b3e6fe32c289e90c3230f47eb2556612ec207d7910810792dc65c8b15e0f1d021258fb13ac9651dbad3e8477076ae4eb50c3dfd994517b26e4d9d9bf31f737a05ac7ad2b2c30929bb7c029a00303e491956db7efa0e7ee1e47792e2e3aebbc29ad8ecb1a115dd5cea2a0d199a461dd665b55aef26c6d7bbfe671cb3395a9a539a3793f4669a879910b6a1ea4e2ed7982d5d4b44043397ac09845df8ed1e0a0926ef7e1f673a1e71353b93275ef098d343a129d488514fae5e64bd36f65c214c7762d40e7532e476235564231ff5277d18f5713bec7d9c887ac845faa6e60f92bf3a17aaddfdb3b10a6d0ee5a41be3e1ae6a02c29b2e0e621129d385751d1ce3b6f2b2d06bfcb4c3592ac185bd9abc107bd22c0cf33f11582a2b8ce2b46e1071b83526da55cd574aab66aab42634d7fbeb66ba2ebeef85d833b05d03005a8cfd2c8f6e37ea20303696a807d810bfaebc4b16ebc6367cd2b27d82641821f4d8aaff29679c00e91336df207a90b649c2494133917fac3d2dd08fa45324ce2d5298cce54118e403607bdfb38e544e7b65770d912934b2cdc382b9417110bc41d25b04183e38534543bb4c75f3fc87da34a5d1d9c5378a671e97f7041101c3484bf1c27b9c5b52c70451d2121c7d77fb101fba5724b7572075dce9580e11e3556e3dbd32ed3203ebea1c08b505ebf84612671fdf26c922e3f626f00fa0eba1ae2495d37a6271301b2fbf198f6ff6bc620cdcb4244ad170b7ee701250bdd11c3154f711c5c02b4ced936d15e22f57fea3892f7cd18d514632b366074a51d02392db3993fee1ad6f794275b79ab0d76745850b3393d434291888751b326a690dbe3b987f623a42efd025d3151d728567e5edcf341b492f1e80a643d00dc104a2776dc43e47d5a0fa9282427bf8fbd1021c43e2a3cb2d34fc8bf6d7eedba5c5ef3d37d3f41c17764a0c9fd78bf4b3751fa3ad117df5487f118d047c45222f0d30acc6ad974277e005e2352e7f83dc0a3721d95d0d292b64abe8e548eeda66e7f65e6d01056ad6dc38987a75e47f944acb66badeca4bf8b4140c1c16e5bc8680b8d8d975d7674eb106a825fe7be10ceae1e9f14deb5acb45013f25b3ad1dd0237696fc0ed51cecd1e572cd9ba3719a13edd128b63a064970093665a1e51729615e5508d157ffcf324d455f055e26e7d69d705185ede1472617c1e1df275bea7fd3b50c43e248c71dbfebd307c3db233f22bdf056b5519d25153bd4b8719149dbff83a63034f136260b357d4a0ad8d1c9398d8e49a7044216ce3448a5527b5c89070efcf897b9e3d5bd84f9a83d7b61753e96d7b50a7d1fb693957397cddb4ae77470b07291b19307583e732a902f3e80b4ece7d5cdf3fbe03646ed556d156099"}, - {"0000000000000000000000000000000000000000000000000000000000000002", "00ad7cb98ec5350df9f984028f378bd9577a1411ac30fbe7d16f1f279d78d504ab81edf7cd9c4fff47ce16fb0e033f54e5838d5d6412ac7983855169b06d9f1c1ce7bfee0df431467e141c33f00c5974c75485c407dd293fb16d4325df0f65b25fbd50ab6db29b7d5222b32b23310f02b198d402bf2e30b03a3fff721e2d33f8149f29197496d6a2139eaac7c33e1f5951c7033ff73df944a989778aebc48171ed1961230fbb411b01aa4137c325700bcf9a6143fbf399c32777f946d43de843239a911c55365485948e44be81d92d3abea911176f1f3da9aff96c73a1dd653eb5cd9c993942af1906a1dbcfabdb1f9fe0b3153ee8038e7599b6adf22ec5ee4612570f1bffb6470df1c201e1f35cdd416d4d19ef6df553a90f74c089b9726e7d1373a2de572e4fc43f6328f308e3af7115c9d67d555e790f76cb4450ca75b33d2d1e436b26e627b935866e17899d32cf024c8050c9876a4c6671715938ee8d72c21dbebd8b0ef7387e5b0dee6df539581cc3ca94b38ac2bfd1b104eb7a3e41c89a188eb830e423bebf5d243d34e7301f0be5c644567b179d74e575e8450a4ae0869ddf0a02f035bdba5486c6c2cd121aeac7362ef520b9c77c22d1dec65a4a82d95fcf391d06fc179b18c0394d820e43aa10d0ac2b39777fb4c2f2d3d7f2588077d58e2906f5a4167430b1f098aa7c2cf4424fa0049da8a4025e607d858147c43846e463fcbaa426f474da7a0f0c379d9b4f0ff91911c001f05d1b03f2294015aab802f74f77ed01fdc1b52571897ce5f0cda331af1ba2061cf9cb2926967ddb7753378921542e8a531612470fd32fb2a1275d4f6f9244739f53e0e66fecd3f5a74b56278fc4aef7adace6e96f1f5142b34e10fefc1d1d89dab368e510d3ced6d37282e27f1216fe3531144c135abd9bec6bffc8ffc6766342583e28e352d9a6014b16041cc6de607cc5f845475a42e2e095f88b620d9d8915980ce0f557d90c5e39e7914776d9dec2f701f475e30bda9ecf6ac7b0b52830f7c0e1a833204514d06dd2f85df5078e3ed3f3cf23bf396511d3452005e79fc78b2c6817895aa0af481972113da9f79b551f94ad06d6edd6a3caa553593aadfcbd530e1cfac21b16251f72dcb11d5f96b4c5317a7f715549bd85be2065cd4f5dd3480d322c57b42247f30378e31c0702069598fafd5af9179550e58d2c68c9e967119a80411cdc714222d64bf1501a24424e36fd43b7ee1e36c01fa785d2282e416bb32d721c86adf9099e4f50af842b611e5fdea142d741cc266f56c0acaf45ffdfea620b011aed32d6f513e8c652b3536945928dc77ea916101bea4aa4134f879df3f34d8b6737294d191bb0c70b2fa0df18d8091f8853e432c2dc607dfd0410b68b0f4daec0315418897e4e743c8863bd365f5a5720a401c575106bd2b92d465e8356b11fa41de6aab8764127ff628bf75542c544f533c985770facfc445c079115724d39daecfc91beddca0070dd978f2bea1d9ad9351ad64b6b270d65de830621df5d69fdbbf8bc081e0a76bb193195c9d8dbc833da6d67bbd96741fffc4a0bb54e77828e38399c14427fb1c9fbbd459b9cf012328ef24ad7e1a8fdd6c2f79b2f3eb775e9503bd9c6485d8bf2ad608d5ba6d0f9984c6a2cbebf527aed860247e1571e50707723ba65ba4a71bd8610d0b97f5f51af43d36eef5b6b895b863e0cf5fd463a8c56f1fd2b205c94ca4ac8b5ea0e553d3c2f0f8b0e611cba602c1f13146ca8cfe74bbad4e052ce5aae2e2e17296408bb670bbe51d89ab6c3c0bb3990cf3925e35fb9ec43e2ecfb29d563b3a5d3554400bf7009b216110a420af670c31b926ca501a0a934364e239ed91f5b845c1801ac26aff80969f71e42c2f5c01732d1ed9f8f1a"}, - {"0000000000000000000000000000000000000000000000000000000000000005", "0037ded8811293dbaa31a33ffd68b335b4c83b686e26de05a69f5fa263ce1316328335601737265e7e9a03ee18df0ba244b1b669c30bfc38608941c28c3e340ea90607bd38d795f4df07b292f3f066cfa43b55941821474c500f5279075991d14057647ea025f931c12a22728bb9e0df9f1296d5281abc06719678be3e5426aaad98c49282774a1aa3924c39cbb60b775f019c4c7a9f0a971982414788168d4ade8366b5139f1570072535210887576dcaebc6f341518aaa1a08fcdb640d0bf5fee253abf17aef310a6e27878508498f878e27f192621c1d6cbd41c9f3a4b376086de0504ffed14efbabf6d177080be108e5ff384b494a7a40bbfbfb08e79c38bc24e1557e4f93efc8b4114939a029d81d1d604ee47ee0c28b4cb1152d81c0a38e503cb3a111333e7d86a1f370f9ce49f6b71fc7e595b7946f2f1d6d9997cdba9ea12f2d4e0b642af8e8e35c719f1e17020bfc1c9d6103e9297fe311bae309b1040dac89e5076c7b85d35d97314b403718a14d1d8b823bbdfee002cc948179060ca7d4c4fd0b49f054c385627cf6c30dfa698f630b8515288a3bcb33eb39cb59fcfe0d9d08783d585453579128bda095a771c89cd61b3d0ae11c0540eadca3db4b39b9924c0750d0ff17759fc3f723fc43881d0c27a787299bb434edb50fc4491ffa2a454cb62aa4dc6a61bd2d77cf55ec6692de261c0b19021c5eb273495017e8cfa2bb2e66f0dd8b81dc8fcc27fc666cde613ec1da1b24105e7a92edc664f00cf00e7d7e89e515abb5a36672772867898d3f6ef2761a1a40eecee895fabfef0972a2e61cfedddb86bda6b014f765c3014c34c8a667133b2952154fa4ef7ea080653c03a9c3dad798e1a366b32244572667cd1861151f9086b8a794e5a6a9766725665bb6a21bfcb725cf34407deb925342509cef941aa358cdb9a63d10539c0071fddbd90609357f4420db2876d16ae167374a4715679e5dd38b7c0284bcd396273cfe9ec04fd72c5c1bc20c17c0d1332d7fade3344dee91161c58f9c6711becebd3cd9b17fd5eb7020e5d2a9ac96270315961084a36883fc60ce5a0ee650b176ab371bb0a91c3ed2600c67eb29ac58fd00032a00838b564b139a9138d26e55e2bce1c9e65b45a06ec14cc288f13c91b3fd640a787fdd8685ac1a764c5abaedbd9cd77a6faf36f026dddd9f0a594e9d384103ee8f91e288268ff64403074c506f3ba109fe2e233f814c0ce8dd8ac182cef063a9ad36b1d0cd3d52b02b36abe69e132bb5e2bfe1c26b35212a390f9a9d902aee2af7535e95c75a9df02a31e5655ef419dc820d1d3ba9a252dc2cdd49df01f67bdfb7b60abdbf5b6825b46e1d429eb9a5c70aa064dc0686f98f504e9348907877768c64bf39988091f8f66911f2eed6d9bed8afcf55bed636c7cdfd610025b2fc63f51f183f14e6275f3eddb68d1959e0ecf19c5010ea2a1f1c1b619e1b99534be75059f5f31250b5c3635925a7641f969242e3b2a1bed4d8655903e1e7495193453022d6710a634b64cdf7dd6c20f970a08d63c9b711402e58448e22eb4197e3aa392ff75a30b594b5fc30ad835863036f8953f3c4f1a473d90e0467a2b229722d131f1f87525ed7c0f2989a1beee6b492e52931d5fddb3900bf558c87ec1faf4f99fcb9408ef8f53b163d6417f34e1372699f4925b041e728412a24e778b48a19e6eb144cc2673fd25474b7e1e4e0adc167c49c87dd1cca2c227a4bb9d358bec775d2b27b2052c524e71ce7a52582e4acad5fe1c6432ca1318a241d9a69c4fd9db6e859a12e28a5242eb99e6af2b4dcd71e80e3dc7673842c066d02bc4fc7589c6622a67e2b6e3d102ccf89d271f86ec6cd5e97fb8ebbc2b52c6b32a5fd30d74888466b454713e7a5d1ea907"}, - {"000000000000000000000000000000000000000000000000000000000000000e", "0009abec2a40d0fc3006733f7e46be61074c2b9a390b1f6e937fe594c74d0ee420c22d9979b15d9546c0036a18b10b557f07805984cc95f2aa3da1181ff23876fdb73f37664ff7e2483790bd4ea06aa8171e357e0ee40b6710628cabcbe24408905c60baa5f3395d57184d04de525eb91f64a0c6716af724b67238f8d2661e669fd3a99bd76aec5221fa8ebe2988cb4d71d55d251e92341cb2e3a7cbab532cab2872d5875cfdbed100861d44219e0627d8bef0599111cb48d7f24dfd070120cf0169c6edbcaebf95ad10c9c73203ef399f1e1a63353a2ff2f353d9d7c5e544e91efda882b7be723123cbd84ece279d6ef006023a45a14656a3bcb0fd0807e478c9187a07414291b7e430d467dd231fde30258e17ee6afc3b8bf9bfb7b4333fca92628e5b3a152dc81a0bb2505b01bf0ec3f6ec7c9c5ef21e3b9a4d4d7d7d40c454d0f336567b46ffff7a86f8f51a0b5103e675aecb30c087f6f2a04de985e9f5a7cf1819ec06e2c8412a1cbd95f08f50a4ceb25f847699b138870b74676a2fb715d3df71d1a1ec3bed657f9f39f108100808824b9a3c3d92e9131b835113d6f6191af2110fbe4653b222a3c1d0b8e12a38aba261806d4ead9f4278075f8ddf8ce10438a62546f4d0329cdd9631590fce9ddee2491c699175f98d575b130717ccbf9c661a6ce2a8cbd99379643252981727f196153cdb338607e69718e9c353d505d6a3cf8f75a3db24edbef62c0bf5a7bf7151cb06a210c53cc27bdfde021db10cf408885556ec0784e0b60b714e971b89addbe159e90b2566f69d4394a6b3a23ba355a9df3d64de07b8bf7c207b973d1552b385f90492cde0b81b623cdc52ee6d24d3ac68f96ad8d3feb397226d4231863d86b5c08f4ef94cf7efe24247a0adf9055f621106b7b9de42d55e0bb7629d58cbb79929e5fc12caf5226566bd3d9001cf4ab1b0335c55b242c07182e31dc8d4adefb28f3162c241af512ce93a884354075bc0996b49b5831f130d92dc701cdf5536f2c2633d56d4a6adb9580baa1c218ee4260dd4d0786a92e3d9eddda5bf2410108d152bb9d9d53702ebddd3d5e1e5543eca5b01fc9f12178a39733bc6a0d6a5598538d9dac37ac929bc6e771d6fd39be3bc6a7dfcd68421fedfa623b4aabedd441dff6a4dcddbf2c79ba9069d2bbf0e9abc849c916e02f4e202e1cb6b1f30c092aec9ce16a6d8aafa95dc166dfaa7cfa0e0059c6c01798ed315bd2b89b8bbab031a773fc7c43834fa35f36feca9dc79e37c9101e603bb184fd559050cd8c791656994ddf24dc8528d1204c6f22b07b11a31f46845742a5b08456f80f61dfa4c53c3bff528c193eb9ae56fe3eafc1a904a9f56fe2e90849d72a4b8494cb903c4a75af465037f58b08336d996969ad3c84cfda6053f104fa5d1cbdf9d59e002e5083cfccfcf636aec66d553d19f1dff3b3848e72df276688122ad0136e9c44349baaab2a60af8246c0b78631f2ac9b5235f83f1f631e206e0c638198d0c1135567f19896cb9775d728c8bae4857c095ffbcaf0501a9e5050ad4ef8f53c1ede25b2aa56bf2bbac7028a3fa17980dc77d37a853c8ccbd396a5c5437291841f05f39f66a096fc7afb51ea47c7df166dd8ef0a94c515bf31c9efb2f93c796ee3f3d0861cdb65a994c0acea900eb2ac251b3ad336ef5af4791322aafa638179cdb3678ea776db036c31bf84ccf34e67aad940b11b99cd4c51d393d7b6ba1fe97ab1b60bf62bb97c31f07171aae74923bfeca229ddfeb64663e7734503313be46225e5233f6f8e8f3c590f462313dbd4f68be4ab366c07da5394d6983a9794150ec66b6e078257014a1bd943de86dd9c67262b3b05136d8b74fee1cca2e2423984b69c315dfc139e358d6976a87a95fad28"}, - {"000000000000000000000000000000000000000000000000000000000000000f", "0008795fb2833fcc2616313ad73fe3c94288f4e56800d2ea6abf0ecaddc3b7e39c0168f761b309afda0b07e29203fdec8739de25f108c292761d92a1b1cc9234da0b86f3a5f5079e8383aade4831453bba7fc1b60c7432c3a0e81369f21bd13d5ea378e2943e16d78e24abc2671c5d7f994e96666e9c4c3ea7e6ec1f8359259d5f4a1acd244d25e8f3bb4ef87293009f5a0931319f01a6eb144b9ce50f75a3db5de58a75193f772202143a3edc92e3f9e1e3a72d206b6772a8007dd0fb123b7be922a7cb374643536888a981851e971c87de2044e4edb51af728e4b3daa94472773f0808b894342aacdb2541cfa133f162e4624029ee05ea2d4fcb1304dfe84ef69441dcd28db114647851a846a779faa2250fa4971109e94d1cc562d4562e44d4d15bd8c1be0987197a78d385ffd374310258cd108b6d6adf30de1708f25cac55b9dcd107f330b7c9fe5672539b687a0082b44195173cc2e591215754ecc0b8b9beaa78851f563d7e7a0fdfd3d626032f5d55c63e27dddd4a8407c9839d0b5f7f69c931609c458c403b0be4df7b671dbef2a48d942ed2ec5e520386b333f554469b67111614e8eb1fd53de992faa3ce73dbea65778fac88e820d174f5cdb0fa4bbc0602e788f3b9b9c13df8531d2b15332f8b104e87ba8f73a03445cb6d406d14e2422b30febc60cd34a18c00a3062acae58706d15aca470211dd20ab8c2892e8f074352c381a49eff39420d60597054e23864b469c1ba2e796d54d166b6a17caa9297ffba9966f9d75f5e7f5ef49cd3b19e459d1b21544b055cd147865d9e9d1c7da816e5a26149ab5cbda0d770ff47fd73dcb62eda1bbc9cdfbba2438335e4d12e6a92dcfda0587e36f31f1772c8ee8c9e5b379671059f78724ce2223b0144606d63bf50aa28cbf1b9a188f2d596dc9dd92d91b81abbb1b72c6f221db2a5001ad1cb16d5950994f1253cb8ae2a14248f0334a083f91057854a901bdd5cd1415c9af0c7daf6cb2e4f528676c158650dd2f5dc0f3114ab4a57cd95f1530e2311a54fd34f28dfbe710696a5df1e7065fda3a93ed11eb8ef61f1feda52bdc21296cb15825ba743407bf4437dac7c6d3fa75e64c4598514f49cd9b97b47f6e26b27695471d0ca1e18fe3b52857c232d44eded5c33e3fef92e011c5076b39893f09f1f73aa2e598cbcf02b61074b542442ab1482104a4e43c5f42943ded8428fb6174b03bf793fec2e3a70fa38ddda92eda2a4507f05c7b80682089c369443808545e5d78e3dfc3906b30a410f69d3ad5b4bfe9bf29507abe80959ade550514aa9114817e9102977063e730e585bda79e5d0d2ec00b58a6229b39d65fd49b3471ed79d9b17f44900f8193b9917880e3fd54a3f059b5e96aa3743794bc2799cc69f8a50b5350c063fe95eee5559ac6711d19029d3a7fb5ca79210377c166d34f000cf9ca1ec6c95cfed7b92d33f1cfe1b6c6e85e72e9639a7f5ceb5505d72e0575d2da15645f64e133ef12593eb01ef96f08d7125ce603881b66d810ea00d0bee46b87daff240dcd4a0c2b17215f5b19112e416b8824ecd18fcfea15e971e171a5f1c73cc9b34cccf0c4360ae31ed69d597ac430e2f37091dc0469886fead2af01fc9a63da5c382ea1861a8544e3d0d650cf74b6cd9e78797d59038bd3293f9b6a0dfb28a068d848f17c8c12ec05ee8461c79b7c23f155f1949a38aaea94b2b8333efcf611eb9c6b6c88b055e14a22f4443641c58cc573f49b23b5ad956ea053c57895f5458b4bf2a5a7dc105ff80ae201067b8abe7b857185faa461e3ba4d0872706214d8a0d371d8e845967ff36707685def004c18f19311de7d56954bc1178f6a62ef631a84064f731ef90c21986756c750b3cd2a5606876cd9ed6a1afe9abce9"}, - {"000000000000000000000000000000000000000000000000000000000000001a", "0045b2be2e4183b7359dd042906c291459274bd080080855a8ef426f57eba1f16546e80e4099631c08143650d412dff54de3c3752b53a5f6c2f2f5a839291d4abcbc95471a21d547891776a35cc44e2ff3bbddd0045a6740d0191212ea2b647c18b902158ed415dede273a2b98405e99e793cf061bb1394ee9d3a9cff0230f337fb3579680e75e8a94490168540a696b9b0a4e3fa3ee9cffdb0bdcf5fc466aa5d01659dfa2525fb20094c5050b16b5ef449680168c77e53c8ed256f31b017fe1b15f5d736ff8a5313d74e037f46b383097f1095305718a0acb55a2dd41c141c62b291310495c5d10498cf63f7113379009b3485d6f117a7eb2dfe20e0098ec51724fc47f89691292d5332f3d6871d5c27e2d8633b458d367f567bbb2f7a22b0f412748d2c3410274de6c445c653ae97d2140f52f600eaba5fc671d15e6f277cec81c889455722c3239bca56f646cb540013e1662058e9d5e958db77aa5df7ff9ef1817be8029f4830c9e8cb8c1a280131ce16005d72112bd10211222d2ae7033b471ecfaf1b5b6f71dbe9a4014e4bb14279d8bf09de3b9f873a3d820a9c1d5ba8db6d0050473e509238fd088c10952827ade46b9ad68b9a162346ca61165e1f6575fc116bc5df86262043f78825016e78e3ddfd13b4bb16126af5ddae68f5c643e47dc467d97a0da1e1099a032db61b46fc1f35a669c9ed6024340308ec8932a6d44a29a294c7b5a4c71df54071df77f13e6e19cb53bca03c2c55bbf99586cd0546604c1ec16a5c41f285721b51862dedc6de75ff55a2108ba2a2e19866361157283d4b1acde9ed3c6dfc2850c80ac322906b494d41af494b4ac65d1cf7fd7d40c0f844c581d10da159209023b87adb262281afae25127a922db4a751583b0d7339feb389bee082adbfc633d1b46c6e8d12d8fd33646e2e3c44ceaf4c4db9458006266ef6e4dceca6e9eb21c95164c12250ddd550c2000d921e7ce2824ec7646c280e31755ddfd503014148ff2bebcc73bef25c921d48461bf28e30b3568e562a0ffd9f99fef39e6e409404d634cfa6728b802a0129e92b46131f513befdea6cfee96476a34b5cec995b4073909817c65379b0760239dcf9e67e4614215b12ddfd95600f4e3bc87381fcfe53eba9a590b9daec449fca987d60f829de52b7fb2b4f0556a0333b1feb007ca6cc67e022f79bd3493720ebaeb6f3ef9ced0b1c9fd5d8e707a872ce32935187310fbef2453df5d3033867d5d960f4cff9f4b09fb8d85bd1393bccf8a02b9f7db17d58a0e0ec47768352638996963419ab7c03d6412a21c83da7dd33778fa9e326668608be414d1d0ac528d662fbbb244639979b758836a92116b6ad0dba6b9b5b0cee04d0c5b63cbbc9740265a938e0ed7ebe2d9f326a63d3711a2875177559822037d8b1810229376a9d887f4496d6d75fe8598fa2c0643dea911c7f7757bc0c68d6ce9dc391d34cfa1f64659dc7f51e1da451275da471d274f338bdf1b9bde2293565bd5b414e948725481b4f1525c8196c1da98a59ed78380773a372365c80a35eb2b2710ca72531ccfd78625612a62faf236984f7c61d58a07f6820f6f8415e163d0f68d310060b1749aa1fa1d873e2bc0344ea1aa0c6560bbf99459e89311648e621d34d066703ef7ad707042c02723c019c2bc074d347d5467af27d72fc1a7f154480dfb7aa54a1782509a8327f104ea492b6a0000a21ee639bcadce6e61c92919098d84dba37d7e34b150e67d047597f3ded98b6f1afbfb7270d25ff09c708228fe27a1009239cf3876923dcf00e9a5edd63ad193cee7915c8ece31de353ba5463c4b52d539794f708f97db0964d82c1b1d9323faddf98b8ac2e6a0e3e29413b6b68e247f1612c03214cc361cdaff7ff1d02"}, - {"000000000000000000000000000000000000000000000000000000000000000d", "00795fd7e8c564a9544672481379eab8d944d4f30445c25f2ea75af40d4461272eb16bb1129671580a160c2388f857d35715fb7a4199271ba961af5038dc3f35130d692c9c4db390d48af5fa7c15fee8887fd0c412d93aca2544c5887084e59ed2c7aa5e727a7b7b62226f9610fb2e2285d9556a4ef56cb4abd9719f87d820859e85165219c2c24ed45a71da0f6172f93a135a2d2997e4d66f816dc45d0b345368d8034a479daede00b5a3837140d5553107a4a2dca81b260f1e397b53110616bc6b9b63f3382954dacef745655cc3cfc8ff1151e8b957296d799c0662e0603c59d12bbfb3e97a247e42aab5cd198aedd4074e10dfe9eb10345c21280d8dd68017d2e7eff4b7b1ee9f48f9e1dca5500399305813268fe78127e8ed93923cb3d8b957e37cb25e19bd361aa1cd9e419e7a033d2f28f58bac2d5f4f8920232f4489b2c08be41e225149b59fb8c1388cefbb0166b83bee1c8fc9e15ea3d8f8574f8f25973f417c33e5ce5d7d8f7d3938e695904344080a43951b865128e5f6f021a515576b3f133d8c4847c955225033b0727fc6d0f520bdf342e88a0156d19472c0ca7f00f302a2e3844a9c924bd9fae1473745ac9455352b08ef0baa6dbd25f01cf7d90c4447a638bd99cbfc36cf7f0af4b6292614bdebe0c0d6f4ce7c384a7db0d522930c9e3c86ed2bf851f70ea16bf5491055f986b7f94f0525ac0a5a912b4a945120686d89be79d3d9bbd3ee1f332ce0a74a6d7dfa38357d42502371aeea1711f5124e60d6641a79654f73e4093b401b23e538bff3b02e4e16d9bc91f2fb509c74fad4ce19095bec993f4a08bd559389aa1bb7e5d3a600e8f2743a688f9767005d1d0486b573b6ef9fec1672a1da10a7687afe52120e524f576e221b67d5d667c5ee66b9bec73d3d8c9f16e1e5fb326df1a58efb9370b859b892ad063d088e00d7772a4c83e4b36838303e6bd36b1333741fb49624d19e8c04203e01a3a8867c6eb4973b49ebbc3dbe10b15ddfecc8323c8f1308cc0b4fc22ea251de0ceb1918db957f1eaf6db63ed2da3cf8d7c908f9f1f86702f926a35c94db435996c70dc6386f5380f17ccb4039cdf423a61db9c767e463d2caf0796d67b090e13d214f9b11c473ffdbba0f62d4594e225907636b6197263fc66c97ab32bdf70e571497762042fb3d9af7510696ff885ced48eb948ab2a5c478c434e99414ae7038674b6a0b1e5ad3afde840c057deef12b452c1078095d37cc1245755b939024275f330c8d166fd191de5e8b37431d27b0db5fa3676298d4829f7c151f31ee115b794e6d25444df5f155d34f452fe72e8d1cc7321e843a65c9d05cfbedea143c183f53692694eb504326721ef34892a011e582b35c554ee46a36a2b89ed1343513cdf41c88a9dd63062c15381296ce0d7676d201a2c3894d9ca0ff2dd5b11b6bc9777c48fee6160631452516744fc239f240065ca26ddf623c3fb68f9409abc485030fcf10a8d602ab172eb691d3905e30211edcc3f7afac48f7fe1c354ec85046d7160bfa84b407acc4efa2301a49857490e8591dd858fd1a39337f2a7c523e42628b874fc4360ede688bb9dc8353ec8e12eb80fc8c85ee1773f27165b265f39954daacf4b716023306b1486209ac2462a045cc2a1a838efa495506f2f504ae50afede6ff631693ad30fda4815cf44341ab9c090f62b13faed8744191535b41e810d9040a29b0f54d345081b8e82a38f5e56044be9d9099909b2b0d956a7e649da7efe5643ddf67293a542b16f417083d0baee92b0773af18c26d27b6ec25f929fc9c750f77953055c8a858a5d0a3cb3bb2b5a625f0519d061545ccb083c9c6f87716876545feb72e47639b18e41bb1cc5c8c16802f6e36450a9f48755a3a0bfbb2ad"}, - {"0000000000000000000000000000000000000000000000000000000000000004", "00175d369400ec71d883b7cf215b06e2263ab8d337380d4f6c7a19bce0e0bd7ae19be1975ee3e13aade600727b1270d71a50d6be65be2de24bee9ed1d605093056822ba18c41396a34858b9ed3a4c6c4277dd55600cd9694fa1fdeff842c03345af9f99102c3901f070b0131281c0e96447bbdd32255f3b546688414c57d2198724f288d1528c480234c571c1bcd3fcded31603076af4e7625857bcb5a25c4b176e12e53dab869c809f1db2e2146965cc85882c18fc9d474da934801340d73416f4bcf9cb0986153d07165b1f61af4776ba90abfde4fdca1fe253d3e01a13ca8b7c9150e16286f23e25be9cd968c0b78c2d9622d6b53e2c9719af9b628fc3f276211a8513129131e336fec122d00d4482a65c465b1889d449d093a290163ebeb22c749dd5e69494a2eef3a1324f3648f34f55d3c84cf01befcf3286499e64262f29177cbcea669f6e0c9f623f39a7fdb01c940aec642ccb7be19020b17b2b4650d2df9cc4407efd31f1fdbe61f5dae827ee8681e3d9f613b75a30422076b5bc78db0420210bc538a7ead22ce3c9ba606de265e44850404724201a0392efe9dffa394b6100bba25d33ad336712ed3f5e6c1be53de12d034175820fd3fef334df77bbb352673cad9658312f03bb8b823d3cea49cdaa13bb042b5ec5bd5b971a8f45c8d8a26da6dcfee1eba37d9e324eee649ce1625add180fc01d4520c4487b9fb52fb24127148f8119e4f7d687d12bd49bd3d12c9bbd60ed550797774b61445de5fd203eb6fdcff883d58d45fd1b25a1cb458c740f0741435f39b18e61025a4c79a458993360fd25cf319c1290594d858f385ec13560421fc7e1becc1f170d84d102abcfe54f78ddf17f3cbc595be68eb01a6ed347e3a0a30cfee883d6f81ed5fc4efb1d92cb29d7879429a248a77f36730f8c9c6446b72795e658fb9fdfeb345003b10714a3655efb8c73118e0bc37f15c7c32db8f03d7ba9eb7870973d7a342075141d6d09c0f7355db2ac30ecb035a144dc366f303cae45c020ffc34491e3f7a663febe24a097954b52c24cfc1be7a2d3a99820c9cec675f43cb644d05159ccb31167268731e55f480537e50546626bd9cb9690d56f40252dd397e05e915833907a150983f5ba3934c584944fa0d9cb5a72a1ee084689decc797d064a35870223281f62f3a69ec053b12216ac3b28329cbe170bd8ceed9d560bce7f31f170cc2cbce974a9e1a2436c56f856990dc5b632e29d83ae87557c3495030959e7cb18085d3731180303017151387d8c5ccd3dc241a35377c32121175eef8137164fb3106bfa695bba3dd532cc9eb1a483bdc1c2b583a5c5154ff8cb4a2941fe0c25f15bee4d2bb2e1c66e9b4f820ef61615176aa2c53b7ee45c2b4183a27218ccf8137fbffcf1fd31ef09966fd78781e170003477475fe85e4e85aaf70febf386f863002922e8e32e1f22ce78dba9b6e4564bd36b2d9513dfb3c037a046bb96446ded0b5d0d19391fcee98b9b7da7c45ec199f2c8710b1698f9261537b054e0d69ca705498320938bc74dee75e7fbcea21a014161f149e24325d0a2e750dc111289e7dbe2af633443a5329fedf7498f42b3369616899f996feb274b0f1b7597e6db978521038c1ebf55ba3caa54341165e41ba8091df2e1ab238084128dfa44d27c35b21e221b2362d14be5b70120d140b6b6fc657aa94d672749e745f17e22ca8f623ca10bfc58009f6b143ca8dc1eb87bbf0a9d052d8212028537f56a8700a3de1dae81c055763123396ffba530c2d9f27ae6c7edfd28a82ce0ec214e67b41f759ea6299d4becb607fd9732729d45a6f10576c5e1cc5110ec49dff91dbe15bd07554d4cf71885249d9b7bd99379485113dd9cd375e51a57dabd9cc96c01ad8f072"}, - {"000000000000000000000000000000000000000000000000000000000000001c", "00059f4487c3849231d731e4089ca7c1cf2b933d3e33b286a1285db525afed439eb9b0c9f79b5ddedf6f032812ea7a05329cc25d628e58a4eecdb6967f793805bb73782a85a011b5ebc0c4c688da549590adc26e0724fbc87588f4b0700028beba4b7cfef38299ff941485de4048ca8d67e598b23fac250428f98577809f151c08e7af61fe11dd6be1c81195a868b05e376edb3e6c240b59d9ec53b641b6e4f7448c71f5ad7523e80083ccffa98e926bf1e5b127fc8abae8bf1fd81e970340622cf2c9a0ecc01f016e97c2cc1e86805e3c4b01a02e5fc28a757dbbca923398207d289cf370529c3949ea748b4e6851b8b4e829525c611ed02476acb4148ebd322847b84ae61bd5027350b9fa506378fdac221d4abe5b242925afdc642d7223bfba4c01fbcf5a273d82ec26db64f55e9964e0d64b7eaa9fb25b1a8427da6cb91c34de21fd0235d874fb3d05e5ac4f8e8201c15e1c814afc8fa72110489ee3f9c9fdaef839cf0c0f4c9aec0ee57712139a3389dbd17aeddbda62a7106155ad1fc629ca9f8ee1a32c28e0593df55454662e8724a7f9551a854ed9f596776757ae2a50db0efa044a43677c09831b0f3b85d485ca88e738f43f12e05eaea32b812af3c9cc1c8678457033b6a1733e47a4078d3aab2fcfbba4bbf7f17f54205a30ee207a60422527a21e3b5a35e7d9a202b096e1d36a728a7fd608027f1612b645c29303fcd1f24d2bafe9198a2b3cc75d50d5eb61acdbedc8db082ea948a696d3fc56cd700863a0f03605fd17d96c661a916da34f07bbbcd1a41be723cda99315c54263d7559bfdd0324d1bfb032908e7562caf1bcdc94cb4141d47383e41e429529d593b6bec4c09ddfe03be5008d985f81e9b0f005d4d9e13a27d90449c911f7efcd4b9b5e3cbd2f7acbce2e4366efe4e539da1d946e8e6330d54d7699f66fb8b07001c369c376c5a95ef6132e751d674c981c7d68f6525da5ea9426147353e5f35cd7cb1b4ed9433581f94058dc86a59ce47c7f951b0b6b39e174cf30d72749b4c0067b4c9b75d35f2836727dfd1533e9389ffa6ac007a5cc2d680f43792e7209d45adf49083d98cf1a85345ee9ab15e08e930c4f54cf963c1f2540c1ee61314f4b6552f7654afeb613a20ebff714eb4301af3ff187274fea9e34775e036c2df295703fd215879fe7503293d629797da2babce041c10c7a931cc095d814f3f9a9d7c84ae944df079150d91b6dfa6218f92497f05022e1d9b0be919ad6d90525e588cc45be70ec6d0127e02f692d7c4efac4e23cced7927adff6db705e3047596bf5781d84aba4f2a921c61db0ec4e959246f14b76c334595458b0ba1b494e4dc7e893a31934d0b04e1d0f803cc8fcde450b304b2cbee6734ce99b7191a1e1be89c0937ca87bfe223d57a4c659e43ff6c5505d8ba74b806853c5a79737a45d3814273b5fe3b7f09cfd2e8ee6ad25d80823c5689f6ae6383b79d436110945550dfd774156d4a92e4ef6bdbe8c05f3e1f8b1c287371fd6717e39c0ec3ffa4422dd926608b00b00b2b28fb166d5509de0f42a57bb77801426a355d3e0c67edb180c920abadcf07219fd81c71fd2ef564af2848719504d1516bfb37c8b105dc68e6d8d739dfcc4a30f747b0271bdda7c2e4cc40d3b4f9af707edaca0b24f560dfe416eb2d2301bdf068e63a5b5ff7df1a2d8612e4c119f081893c72d916fba200bda32deebd1b048575300f60bd25e812cb8fcbd3c92639b1a7744483c4ba2cb02195874a35b424b86b51d2554f0c4911ca24a2101163619ab88280ecfc9e2f39505ed0571b1bef755cd8ecccd69633e410ac9438fa91f828b311d1fd6207907b78e1652acb47f863aebaa7facdc83dbd158375e9c9e9df86842fe240dd011c703aa10d"}, - {"0000000000000000000000000000000000000000000000000000000000000025", "00cd1d2847c3d6acb2494275665edaf5afe358551f54a89dec5472c0dbbfaeba9fca79000eb1c799f6220708c4039a07d674e90d6838b4685e929d6317c86116c5f0cb9608950aac35e355e6ccd86343545ebb3b035fb32ca8814f63377d7392c5468d15bf20d68ea529ab3c828d9c46ada81e255ba5559b7308995cbd200b89e9b65b9c51ef46b7a45cbdb3b71a17935a092125edb17e79fe42e9feb5f38cbebe17c58a041df417067b005b3ad59344c95cb0c6895fb55585e9515f7a2b847a24706bd54d5f107528892a6b39c29494dc4d1dfff7532191a587f124830ad57b96495b963b08933c590d8cd8a05cdd6ed4f3f7eaf3a955789557af620f5df0d192e06c6f83cbe440ab324d41476cfc853516adcdbf964dc0ec7aeae44a4fa2cd4337e25a0d861180776f12d3c29be2c9723d609810a61281f670912c37560335e9b9f79e911351dcada5154b8b3bc42d04bc162be9b51edfe0920105975edbb441fec3caa026ce01e1b2519565ffba04f85775e27575048e171f20d4df03c756cfd6feec434487a63e793b161c39ed3702b737a6d9126f9ca1a42ca7c061e291d6f9107a08e73e9bb15b73f1d14777b79ed8622abf2c982647399c74d07b9f7ed5ebc863c60b7ce26d1a1694da83201ff1f622a21ea76000d237bc65447e680477d953364a1bdeabe5bf25b577390105ed3b5a62afbb2c550cb1968c37c42317214873400177f43efcbd97f1921162d0c842d09218e76eda33c6d2969ecc735ab6523176ef428a57ac7ff18614cc2f39be5d54f5b9bf973aee5f669ea202138aa9e8fccaeb7bb70d1ff89335108e2feeeaabf837aa86121f1e34457a1a8c9911a83624b78472697cc7c41a8461a12e1e3964a21a120b133fc9e60904f8185698746142bbddb9ef6010ac971bc12b1dbaa8fef96d27326310ad00f66ffabb795d0104451d4a532e096746b89492f8d0b2fc96586f29448cb5be885b60c13e4434d9dbbc27ff9c96feebc8047763ddf734adb1cbc110662e431e10b82eacffbc1e969b2f3fa54d5d528af3074ca81be9be69352a42045696c0235327a397ec43d9682abb99adfc54104c08495ad4582190179a6f77d962c78372387bb7f1070746c44aa331109bb1b1115414a1de52e1aa3e74571abeb74b5e6ad0636e9b144a0150cb2d8302f9d4950193da5c4843a1cc4390c3b4f679b0b1514a596b18531bdfc4b52b5231fdde56cec274eade5e819bcede09c5b0ead65760c8be49459733c4311ad4f637461e2b0c4c32e0af6349e6c7e5564cf4b342441758358e01d0231fa0424fcdf06d354e1fc71b5db2e4131e9f18972229c8b7de67d54ca4974df4c012ef28dea2f003d3667b2e227e296b1116bbc0d7d841e9f9d488bd1e5d8bb1f85e878bc178cb99e967b12795bbfd5ad002ce7afc04ce14079111c4d225d59189dadc9c908a0d2be65c870de2f6d530650a557c834d985abc917b0836d1cffac42c80c6cd74f3db675d0dd1802fbd22113c8bc2ac3146cdd785c62a83593b924ac2f363d01e0034d6c74cd157024f729d08178924cd56b279d92b6cb587ccdecc7ddd76b5739dc1cd6f3ae9be8e712a12f98acd9a5653a24d0b642e7e3496f43e9f95622c92c7e478565ddee4ae72c9c23ee117293afa9d86035411c3cd4105b9e053f0b357ff1db17c3fefe0060580b2cebfe4af1f32b5f39298a586f9ed191ae0cd21dc23bec40a5b2eeea2e5cd6e54c799f8f6711874257d9bf9304b1dd6a225c70f7fc73361c686da13840bcbd8bd38ce75f70183246198c6dcf1daa99a97f11fa29d48fc8a83a0571947d1e1d4c17a6af7bd45fc1777499b55a47ae1c416b6ae03711aae3c4137ea3121e087138eaee2398d3bf2ba223a8372193ed4ac76"}, - {"000000000000000000000000000000000000000000000000000000000000000c", "00eb6c9a504bea8685afa0268c358dcb2b49fc2fd90134fbb98410287b4f8de8e7f7c82e1b96061e411d12b964163c51ece711b3623db559ac91de8b782a3b1db2224bdee84959d66c16fff1d6f28abd17d90b2b103776672fd2dbb6af5f6288346d43f50a84c919d01383952a34888cedde0cd1af2d8dda9497b292cc67404a04c6402521d54078987700e574035336bef2c16b4dc775f2a7e059ee1ffa492b75e7fee4fbfc7ce00499d5c4a6c73bb8c01431db8c3589f48929aa1cc84df3156036e87e1594ac272d3ad3860ac334bce77c0ea3e71c7056ce55de990344e3ad502d00b392fafb28a69c09598c75a0bd368519da4197f9b1949a47030d5431c93557cf9bd9e2548ed02515ae91177a687b11f9ee802fd395b9ea22c38ba27bf4ada938dcf719214e0648f5594593328802eda63740aad2bc5fe60634b61d60f965051d7666443bc37638be1c4230f3a401d87743621b02f76159683db85b60c75b69dc0fa204302f2d0cc1d7e23b8b12d108b558d299527fcb1b1008ae965fd0a7bbc16ac43e9ea8b9a61d9cdbaf1c1aa695b5a72cd1236f762773ed70c0c636b13affba06690bc587975ab91cfb55d7bf62e1866223fb1cae13fa0c68f2532bd1d00993895e406c45932e97a3621fbb937a5a0d52674840f5a0613df1bdbd52dafcf340723ac160d0565570fea60bae394ef7dfff3f43d8074292d8395347b55507c5f3b0723dbf11017b78a9327fc7775a90b85725a7154e227c222690d835252b1b888976eac7124d00ad831899c7e976754e5c3e972cb15fcdf45d32e97b6214adbe573fb553c2af47630afedd652d064c46e8f6e4d60236d489fcbcb1adac27b779403b7e73c7fd0815f0916edcd5cc233aeddf135a4563f2d64cdd665b228369b37cf776103ebfef34de9c532255f3f31a3f362d0ab55adb63e5bf7dd000eee842550f5ff59d44c0387cc21074ca6a1a3feb0dc04d5499e0da3f7809113b3193a2c0a6a24f8a760d158449fb5231aeaa5fca7bf467137b18ce9a5d2f0fe5548e1f4646323403541268d6793267febb0123071f9fd247881422ed9dd1e0a9341f30787a2460332874b43fb697e90bd3333466d761921d5f7b8b48ef0f5c08a470992afedbe343d72221cf42ae41bbbba952ed2499e8e49ed38c21f66ade75ab5ede7c17ad1501ff388048e02255bccb5282cdc43041aa8d94287c0de6e08c610bcd75a26662c6f66cf38290a95cb55708ae0f9a9e4d3bb1478db352e474d50390bdbf619b09b00f729a4bc8d38829e313544e684185140d2769087cc5221ad1731b6d9d74d570abcf4a0389d527f20b8d9c985799d9477c35043d972669021e1b7258a11b6027e6d94f13d7d0d7b3c28052d73121163937a61b70a2785f6f25a5a2cb0427234cb4a6b7d0b8767f0248f3847bf6596bb66835f92c32dbd5b8d5132d5e30e2c504e399c90560f0a39b1c601459b88590d2861004020f3ed526e6bb27b2623714d521b03bf609853de9e5e46bea799dbca1547883cfa5ce8e24fe4394058e7559fb4f542787f8d4568adbcf9228c616649a29c4215f4793477142169373daf51241eb4c1de5cf0c842af3d8851d9920505454cfdaa60e660337d9922f45ac0228d9b5d79cc8c2f971c98e66ef2b1f46f00af3eedb92a59133b73131b4341abad595717f9f7128b90d1324119a45dbac25729a3a841eaf357c9fe2112d7e11859cdd53eefe41ca681e0b4349c0bde9f71593f1f124e9f8c5cf89cb29c6f1e44ed8309d74910bd239fe95e708177011d1dfb3705635746e3dff7f45922fe1c06882afa16827c827c8fecb053978dd3114231e147893c65dfd4cf1e34da4982eb0857eb820589c663690eaddede56c6597f8eda6a9d7db97832c"}, - {"0000000000000000000000000000000000000000000000000000000000000009", "00018f146486d3fdf62804688cdb89117f2fce32fe0ce2c97908642a99c234131dd85849a10f12697e850471774935a93209e841059b3350b3017ef75b995f1ec8af4dcf501d11b9a19341d4fe0ba3ee791ff604077d0d640c116fc1415e441e2f33a35191eb78104a2930761d12e830e9b921f300411fba22488679d1181dce495e375422051fd8a3028ce46df92a37b236722237aeb8b421eaffc15436172b754ff2693456b1a107ceb2c8cadc2b0712dea2f956aa0a16014d94ea4f29c06e16c5d748af81acb92e345088c760ec1ff964097309ffd9bcfa9ff2b860974311d7ad7933b4a2e918258e1ce5d9faa54b7da3a410a8407afafc7dcda107f1b25bcf4c1087f0a393ae874618e4f2246bd489759cbf2d81a198f56ea7891f8afe27e28caffff9c2096769b44455fc2ac5b7843689c710e1567858b4f733d5944b0e5a70595314b3dec76233eef2f5dff00300e4d09a7bfae221fdc12208a9b57b1ddd7d71873a0729271a6f83b28f1496f3aad7e3d059e889faadee0a7b1d70ba8ece9b9518923c78ed95d0d5ce9035901d782e14aedef226fefbe2f32ffffbad3cb3bace4c19950903fb07bf904efca34bc270c15d53d8aae79d287a84f3b9d5bcf1bcfa4961b07a9e2ad3899d6cbb1dd65b0d7823a249dbb203173c47d17cdcb999b21e251041fa84717cafd8abf4085bb2aba5c5546fa20e00f740c32902712a2b701931314ba30e6c9c1f96542bf0b970cc1ce6adfbb777ebea4be4976c781f2a9625c12b8a428fc739ae465424ee6bba5749bf5df6cb3045532ebbcc3df347844816b146fc92a5d8f5b4200b0b7aca35f2d72dcbfcf2cc63a062b2d5fe1aabca0ded3f97fbf7c855db23d7184ac5d2ae5dd5969af71f1c4d45f64af68907b5734133561938e96bac790721b82c6bb7113ead9beb039334d6cdca3cd95c1fc701e315324988beef888b8579b87a0235cdaf72fb78082caf2306b76987cf2841530293483d53c178b47036760e54e421d10df6e955ffec3ce7369e0bdc1fd437c02294d0dbd7d327d7c5aad0306fca2fd85808aa1123f525a20ca2508a10a4ab0a792bbd53fcd7039d16dd59d9724e9de8bca066398e5ef477ca257f84d33c69ba56b39edd9ffa8d34f291f5c5aee0a47cde3b50ad47a14a54313aee70563e0d504f060f4d3d07dd080fffc043d3cfdd43dd4a2c847fe1da8e407dc231288fbd202b340875b4a023e2c9e79936057bf7b53f149f71e365b8387ddb71226ea14c3ed1d28017c0ba1bc55d4a716558a17329b2647fdb2d1cad42dc074d0adf3dc17e02f5b7758385b2a0d34da17b8f8f706310bd5e5a720c8e8e801fc4ad75ae5b1b63fa1fed942559b996cb0f6d614839540837fc628a85779915ee31b03fe1f79f8c13b78b43e4bfe25a66b830bd176a02e1cac49b41c59ff239a1d51b2c504ca61f35cb4a234462e0845a1a50fd8282ca524125796aee7c098017a8e5d59d165e13da80332b054e3b8995bfdc97f33a75c20057288585a91833e96d402b991a1faa419c1d26824be4c8b8636820ea4b917cbb5ee5e63dd88f2c66af2629f2eb8baba694dbe8aaa641a17eaeaf0523208a3e35cb8f370effc44a83f131aef04cbac951327fee162c1d902d18cda53e6cd41c46b7bd9c59bd03235d7d5ae5343b8e6781915229dff53b154effe923b435b2b0af17099bd9a28fa7d7d83e89913b5dc60eaab66b9e0f9abf09c345d2a63c354a19cd3b5025157aced879171b6fbee9c5f18fb519ba54d757a2ed0c66f3c6db765157b638b57c54b8b9bd7ca158411d43aa943500919a951f23a79c25f140ca7953df844216a260e448d954e7d27f446654dfe3cb38cbde03e93315ca7dc88e392484c9b5ef6358369246b2db6f18"}, - {"0000000000000000000000000000000000000000000000000000000000000007", "00400944a7c7bd1e4279f039644d49bd000a1bd9830e57e35efae00f5179077192ab2bf05cd37d6b38a423af21e9076d6acbad2f12d5cdbe598d776f15395624c3846cafe78e7b70d2833a7e501fe2bd52dd03c503da6731751784975394f3c8f6b54d1d7c12bf5fe70fa4c3e1f595b8a573a7f808a455932b3c677a3a561f9bfa7c29a64a3399c1125a996834923f7ab9e1ef5bd3834f262a9daddf1b1a91cdeaa92ad0025db7dc03b1a5c6de2bb22bd9aba4dce2ea66627c6cd60cb72241f331d2ae3759b77882c465aefda1c48d7ae2760757632a1be3d0ddefd5d3bee7a71cf75ee11d69cd09e224388f57bab7952e122181a3c50b4e23bf4cd206941fe4cd8f7239e8fa121796bd0c45ea24b6304739c7143be3f01a279894ca9debfedb0b5f8c1c7ac81d1529b726c7fb36dd301232ff996c8d95a3d6153241cd3ccbcf30d9bd93a877196b62410eb9affd2828006aab2ff491838d3939513038a6679d243f5a2114184bfea4f8270369f44581f414a81644dd8068b26800ad8567072ad42b77dc94818ca6d829b80075747309afe1a2b06a7aeb7ebf244ef2d3dfa1dc23fd236111b10ca09398ebcb781ce1f4ff1ea0fd31c3316db425ab1cab029735efa30c45fbe1dba79bb21b5edde51fbb591cea52b064f82498a39e743e0acfd1b6fb66320b3cbd2ed3ac29f338b6b12df4811248fff821c81509740e798a3193e4f182f327488625a0e1f4c65a1788a1cc674ea80110e97584e8f36cb9c2475664556fc99654246aabbbf68729b40f6ef476eed23be5c282f91cfe6b6b2eb7f6800c237fe8038f49089c384e1dd30abf48cdc5c7ec8651fc5bd92e80c20a32e7e23329ccc2696cdbd56be4a48092703d1d3a90f6ae9c208aa53cacdcf377207ab27f463253ceab241d142d3ac0273e913ca3f3f77459848ef31566f202dcdbad00baf0921549b2a0a258f29f8c251926cd7d18fc72030cc8222ec3bb732ead50e435dcc8dac3f397e9591bb49dc4646bc8e96dbbb79c0872f919f1a57814b14a3e1e8e9495e098b420f7f67956cc572aca7ae8fc057e12a7bfc3e83de57ef6fa53b95ca7b9f0bfe5f13006c583c1d761d2d95ff5393adb5942f9d95b0bf117c8d147699e03fb3586d7d308e694ca4fb6137aad1e1cce2af4cbf16d857e8342f82e975d4ed5d16a3e071970d81c84a5c4a27d73f8a0eb3ef9bc04bb30a728e12f090bcf9cfdd6ef33edd06df0b386d2bd05bf0a4b6e83a6d7adbf249324defc4fcfb9fb2a30b3891457cc022de92adb9195c40c86fe47e529527bce9519d67b5a858e6289992612b41a6cca0d3982f28da82fa0bb90d7911b9eafea27e6fa4a38e6788ff41965288a5292c2589dff586df9a5a85c5796890efa5b055796f44f4d57cf07054747cdeedacf164e3457a66901c85d7d24ef9b878a657569ae71f7df4ad0be69a507e9cc66d498ebe0df3754d766323a59e57af2620001e6e716c8087912f31dc7ec94dc8183973effd78e030c8cee766aac7ba3c9e6f89df7b736877ef72322038ea50bf8d9b9e6e34a344dd66aa75dd76438109e1bb25761bd140a074f7d635ab04d8875b238ff7faa0a614b8cacc9ba050861a3f5decf465516b5f211a81e45cc14aa53d92fd29d42a4131ef345904cfcf7dd046153416c9b2e3f3423c5664e6abec608cb3bf4971b652114f0596cd3244665c24bcfca197360bfdce10c0d2f780f46a6a1e545c2c93e2e653a7fd3ba635f56674b95be18106987f55aa2535aa0eafd34ba8e9204e30ef7620baf32b79037c74be2578e2777f8bef7240b0c3e4d57f57df80c528fdbb178eda85aba612c21c1fb2c2668b05f4c20128a5b599fe74e0e5e509b4a88c30a7ed69a3f4697c7744dd980120866345377"}, - {"0000000000000000000000000000000000000000000000000000000000000002", "0070f0e41bc13fc222df63cbceb8ed76978dfeda730133b1068282de94e249e0de5f30801136229f9f6d15948b3131a17ff7ff5c959fa3599d997b0970f23e26dab42a2d5e00e7afb9aa37e0d5826bdcc7bfc9cc01bc0ef4f31b90c1649625fb5d329fd2a3281802ce3d8f3490266fa0b5913f5595d636eb91f33490d69f10db398894dfa01bdc8f3709cdc7eab695ce7ade0d2cd7bd02a3e16dd38d072352ee2f07654c0b2ab26603c99e74b8877c6db20c42087152a7c63f851fb8510f3eed54224a3d35898186d587e35253204fdbad590b485f90b54b5dc677381145c0f72c5d0656532b3f1df8ccf4394fa8d72d43532f15b35f45287b767c39093ecf57f008a5c9b4e414824bf314e9c68ffdec313fdff4a9f99b44093eb81a42635fc736934fb541a7144cbf90b0dbfa3f75104231dca35120a10af6087a3ef29a195ad88859995fe4c1e22ea8015c01b54539028f38de3901afe1e901b6d7d3ddd43a21c972e2ef1253ce27704918f313c33919b1efe6269fdffa210e095e7a18089331ff1bc856ac1bff24620b383e825f2325cce1fb4bd2ffb93833865e570dee2c2a7e32e6076ab860210bbfdea7d5616c2f8f6ae57889136d1f280d01a4a2924bf13aa5241022e7b8bd76197917c324634e2216f90be9d860a754a3e7f952e2c59cff2e4f2f77864698e598fcefa57b3556c2f6600d9454eb0cec00e7c44dff7d478555e4e0f9c86620891ae6d52bdcb2c035578ecae7c3248a14c2548b513cde9b1e10baa3361e474ebb51cfc1b2204d5fad64098cfa804b00b48b775c945aebb2659d404fec7a41429635740d4627412a05f5492b42c523b264c94653e25777af2b3dcede5c14fa93550d246bac75926dad3a12517c0eb25f947608cecba52d02692c56489986aa7c8c231bfeb3c747179f72c6c384b77b293a472f4eff1b1d00ba5076f9cc86bd54bfd2f8b33da6758c91d4943b1a9a5288eb658ff76ba14235e0e5518979461c7dbe01832d4a4fe543fd2d1330d8e17ecb44e3c3538374405ae3c97c52ec8acf2aac28f47be3633ef49c40d2039faadec8c94001dbddb3b7832f43511db6d75b1e155c7da0bfa04f6303136211ac98cf0dd46e9098181b210dc9e1a29171b8bd252c57e60e91a9f432532642fa6774f91d1d2baa4348ba1cf011ea3ed15724d403a824e7b5647bfbf186c05acdd84f6432eef9d8181563e143dbd2f54128a4718325ff0b1c9ab99af7fe06d86da7b0f35ffdda9082cb58a7eb0cc34fdbfd7812d7e126234bb438d6c7a47147aa08ee936dd84a23230c9515179b1c37188d3a8c9c7c4383d2de5f5beb77d9ae616db70fa5b88537b2b66a68bec748bd15003c7c2748ff9cb2f7e8ac740c4554230af5acffe44b472d559dfbfc9689fbd627475fef248677801e6c8c0a5678ecd2ebf7afa82d05b5a1d669d5e8053aff7724800e748ab66309f56d84ed7bfb89eddede5c67b3190f8a2fcc285d3fb8cdba5e02de7bbfc38a3e5a471f1c1b00b6e5fadd456854350bfb5fcb7d74ddc9770dc1b6613c605d8b3c0623d0f128bd9d5098d7b35f121b922d3ac62b0f7b12c5d01f497b1db7bb38fdf70fbb629f569007139dbdd3fb2c4e5206960b18a3752868c48f6719ed31fe08a410517a51d51537f893760b13036d0bac39497f7c011923756a4645e1b5e218340c4a356d5e52f7a24f84eecfbf7b3db1d4cfd7b71376c2553b093af37dbc84c40af6b8222d09b31c421c08ffc552d0f293d2d152eb8bbbb26644c4b248ed135c62e09d1ff6cd1274f1edf9dd2eee3bc1de5f781ee89d8a464a26d47622335410a5259a23fa947df113ddfeda29067b57f18b81c37ce3cd9a45b3b71d532829825f780a707fc4abe3a17faad3b92112731f2f"}, - {"0000000000000000000000000000000000000000000000000000000000000003", "0036cd9af5ce49bc7b71e4beb2d83bdebb4596d01417a576f30cf27373b876e1fea2234e352bb891f9780f4d30dbfccb783cf002725c85e0cffeb395d6ed462aa9eb577d1e02ddb1307522d37d4606274c5ca5e005d902043149f6ad9c05a7438640b17e573098086a2f29b459fba089153c85851461b90465dd26dfa1271f8fa94a17994a6bb13eb405114145af0026db326233b641e1e6d55aacea7e7982e54d03a70613bd818d03887128e76b2065c4df22513693419ac0e33b3da522bafa2068933f5f30b6435c01e528c6b204df99922bfcd7e803dd6e29579c8414804beff24002d829c23392e718cbe4a5af77d045f79b40fe320949f373b6081149e1fe98a3fb309a95c1f5cc9322c0895f71b9150cf4fc3da8024b9a342167f41cc7267fe0d876cb1d76043bf996f9c505d474b96de300458038ddf3b536d40c308d111ef58470a4661aaa19f9d7b9956a650707045f5bef168ff0ab3486ce7198b9b1731a326c080812b60d12c5d8f19f9081174fda35d59f0f7d7a20ce6abdc4b370dbbe6b94615eca97795d265723c92720ee767f0bb424d31055ac784f7ab1ff12dba84a1474b6f8b864983dbef0e16196c3486866f15bbeb0373f7dd3709249bed41305dfea68ae91df617c2e631ed67b2a061b0fa322f673be18ccab15664dce8c676dc55376e05ee4f1dca0ba5aa86d640e9792753b140d9a6f6b58d8004ba848e0e8b63c02465af317ba2d2c50533bbbb8713dfa3c73ba8ffbad050d004c4d8651a82f542695e7bdeb2ba71096436da1d0695fcb2275338f2358e4ae615057f986066fe3371df03c627c1522fa2182979c21b27478113c6b694a125674cb2628055b6ca7caf492af8d43c518a8966130558e5741172286a912add0f38b62f2c2b0add9012dfcbc0b5d2958341533269fb98c592b11a5f06533239b5996d100dcf99e545f10ff97f9e84040ec681a7d12984d1f23d10ce3848dc7b2d626249c10311931369f300eab01d192e84474060bc592930f53ab764595ca124398034ace351be9ea8166d3d19ebbd8cab4c14f35ddfe05242d2a6bd274d743f264329e7d6415241d4f3e3b1f7f9a107597e496f4feb62d24c34df9bb5f9b2a59179da1772462aad35e1bb1d91c29adc6f668b933b023177dbf1a9209f36a79052837f6368a99d8d699d30469e850535448ef4e8956b88ce03331bdf47996922f523746f1db50373b4067edf35af60a024b764c532348c2fbdb19d782d25ce28fafb8828a2075f9a6a6472d636ac556285dc9cc7547a449787a2d9bd22c740c42cee3d5e3d60556d68904a0fd013f4e121ff57117bce22fc153c02cb82865434fddc49a80f0193f600e40a2b2c91edc31a8eee4d3776c06a711b8db48693ab33fa5f9b2cc8fd24a553fbd3a949999474e6786059c5fd34f56cd1150d2f2d8d6222d19ec5cfe418f331b3ab2ef18b957e765c3f38e2fa726c1379717350901dd97c0e0ca050901d1d0b9226c659eeb0fd739166b6a4e8f8f11f7f829f1e42512129899f0c6afac05d321b4bc1215d7ea0a024c10f563dd794cdcd38f1445fca2c7a3060bb8d6724499a40fdfa68cdeabdc20e5d40ddf0b89a15a5b060f3c54cfdda28b7577d131d53b045a65321978bdc3c126cc2b86f4fc3847a505cc7cf2fe5c09f5f67b15a0603dbad2773d99b83d2ec3552920aef18d913e14135ee40c321ed9dd4add10240b687f319a1fbf58766d3bceeb2dcb375bb7c0535d2eb4f52ea86dda6dc571212ec28e783997ac4b0b6e8538784498ebe086a3361e5978b51bdd1a41d62a3f3c3f96d8cb7ed791360ebf7794ea167c7108730f1a83cbcc88f5b567a87563823eecf6dd5c77de1210177201031356dcd70e2ba1677d4d67aa6e1e027a"}, - {"0000000000000000000000000000000000000000000000000000000000000018", "011c3084568b34718e3d714f9bd3b44147e8eb915a064cec87628ba72f926fe670b13e5e37532bdb4ed01f055df59d15244ee9ca12637c4078f1279eea5b903373ece5e99a3584e74d9526dca9a48a2320ba4c2a0c2e8f55b84a3747838d8442f34b3369157c3b6555121d65c6d2ced3208d99820879d95565c85db496970d7bca6c6b78f287d84783e723b58015d6b01c54df12dacd7345f87291dd0312d7671af919258bcb6fa8067e29704ae810bddf1a12905a957f6ec0055741d508e542721be17e83928b91e66a5a6ac524661f0ab406be395d42494a752602030ffd9ab464e36fd80275507377e393313a6bf19e356600aec386d8ae5d98de1317d672f41cf70f538695a4e2bb72174dfffdecea243fbebc248e3399e8c3260cf2c96eee88a0ded5d932ea12a8e25f685bd865eb1897f39c3f5012db0cc544008fe49fece661a522e4617db3717681039bc3a20302410584193429b0162a3514734a32dcab5a75570ff9aed331db454d8dc0b6c609d17371e7d1bbcdf8090efd4ece15abed9b37a0ed047a2a84bc86731b5b2d8a0f787e4d800f195e1336ed7cb564f4eccfa33806c1c2c64126ec336302c1fced5b6bc4f7411e40b34eaf1dc9cdd66dbbfac735d61ee97ebe9ed7f611d910d547bc890a19da57df91dfab6a7468a1d7fdaf4b15b190df964e6d72a3d472c3e035a79187633c7e450679fc1dc94b3da717291246cbd320f0f7aa9f2b5713d634e00549cc089257f1d3721f2b361aa6b795cf1593d138f0f199e5c6a6f54f2ff3e2c286eddeadc32550a3d217a03a8789d3f3f247d276662ee7df206e11e1ccdd4063e5f15106e2df60d1f172d0b4191555364b648608d2c96cc9bb668ad8cb898f29df5c6707127f44e5ee4fed634658e752a5d1a855f7af5068bc23cea52e132cabf5be24d342c62166dceeb3d93d5c0177e66ed4310e45fb4de205b3cc3262ea8a7c2ccf197a2cfcf09d8fb38aa38656f9df0cb213a473d80e02b7535bf08b2ba8b7f5811109f0602209d154c73559f1ef9345e1016566d2cb651ce1610b73e93d96b20cd5a2afeaebb06f690e01facfd21d6cfb0071d0ab353ca5674d4ef24f3bf00724bc6fca5a67ad9f66e00e70275e0d55b391964a44ab466d63699d1a5879a21d730ae24a5780d7bb6b223792332ea161d9ec733c0288f929df22a435c3b0f119c7f0f9f6667c13dc1c1a73f5f3950f7ad713d358a4bccb86becd15dbc3280d2024ccff0a3f6ef2ce2597d452295f7388dfda611e580caa0c51e57dd0c152f030bf7488d0da0d1914105fe9ef0654153b47c1688279ce38faf982ddc64f27f6d95e2adf85f3740c181d0049488edd1bdff9e2231d2c19babc755ff54f14f54d5962ae0fb4fa187f4740ecba8427e7c174cc59192c7835be5f66dd7917045c8a0c20ca20bacb1e81ec1923684115ebd3b84517a3e9d1b051b28765f7724673bc2abafe8f1ba3770dea29798cb29ca3af10b59673634fcaccd817b65c3f7f8b2d936614ad512894111c2e4f6608eb15f4da08939eb2441c9757774252759ae229e367689dc2f73f72b771f456abcfd1b8161761f7db95fca699ce9e14265ca0ea9b8b2f5f5a7487dc62d02651d51336ab2d01ffd37b0bd0d2dd88b5f5ca7cb5da30a55c028806811342b08c153e81b9b3cfb540ca0cf8211981970a45377a1e857389cc23e7558dfa41ee1d2c9aa34f33872c4d66b90007fffa74831d709d6b33bdfffabe3f13530ccdd5e4bb7d9c06cec0c88fceafadd7e7b212606450e98d8e51306c056452bcfae654e219fec61b973e7393e310b3c39021e276ab60b88f46bc73c719d5fa278b1b506155f048e1c4e1df023a257490e32335c63d7f5bb371f38a568a84b87922c656ddbad9"}, - {"0000000000000000000000000000000000000000000000000000000000000001", "000f2fdb5d6f0c1f91ca130f7f65dbee1d17db9d0b293044f758b0cf5fa900a52ed8c0d17974471d0e4f09cbdf4ef40a605b326e4731457ea876543499710967e83dd88734bb39af8fa894f16a985ea33dd5a7611d628b806e942429bb0cd46fcaf2ccc9a25eee3a524ecf65489c987dfd2d7b759d625d66fb27e3dc371226888afaae1cca1b0763348383af7b668c2cbfe77c4ee0cd6fe7e38ad93537f8ca5857e4c27856168e9b016d4c8948db90632dc1b3490fa3a7e9c6106ff8fa20d85cfabe4d7b2b4a2a1549afd75dd9574c3115ec187ff4943b132ad3a1a244057373073df3c13073ce1d417563d789be0a561762f81ea50b7663287e4b4206db5467b891cc319ec8a2eb3e3ced59d7367ae7f32a887a0a18ce313bb01365f20859f6122dd15660b30e1d11cb71334073d2cd5494f5c93859d920b2864914158991614bfba27381048f62e6c4d5c850b513cc0071b87ce1895cc5eb9fc2c53cbf11c8dc362bef9919edef9acc49a9ffb16b257773ceb571f0dbd1845b25385551f4a4ee1fe20f498783e4bff6e8d0983f7c2e79336764d37075d4244457bb557895230eb4d3ca05a189c74130215db50be2da04d8c720d8901942f74d154b25e894fe19199e5773b842d70a57ff1efce20616abec16155578dadaa2660ff3d224a0eea5e69b2c6c7cb6cfd3ad61e20a73c79ad9a53d73f973742005d9fce6cfb16707f0d1f4ca275c797a9e795ff80931897e9368184025b360654011c3e4d1da2477cc6c1488cf734f99b897a8bb353e91650442d1bc9b27e11bf22748c6625a036e8962994c40f486481d34b278108538965ffa9f87f00321251f98a53917a2af8e0924671c2661d2158785e347572ad3639738743a84312dae37bcaba097cdfbda05c909f3e02a80121f9d0151261ce18d165de31077bb33066231c75baabd821400495aaeb1c7c07c590b62b4e1f171bd7a86df50d43c55bbbfd7d5262133d9451c484daf9aa5927e463a064183f860c5427fdd74539162b9c072f6423ac2bf1c32f984744eb3ed476e1333ced970b631a4fe454401cf60db1e6115d77ee033bfcfcf11a1bd191a6a643fb8eafc4c29203d88f227d1d8cb6d462f5bb69615183a33a723885f655d29689c6ce6ef3ee4c17f34202e5b0a74718ee64335fd043ffebb598927a3df2f7e006ff514b1cc7270b693902049f7c76c233d4d43600a5b0e99dadee2513a1834c96dd4ad9b55129d96d903364a1d7a417abbbe12c310f31dd424c58331e44306d271eef7a7963b4eddd078a3e2f2ec2325791c5a081e37c54fc292276803e1335ce68169576f380d114bb84b647234bcfda63f2948b6df81da981a98f56e1c8963e5c1091ba6afa08649a2d742d5ff32111db41f2c5bd3c4d2db4aa439e8301e48e8362f10dbba3402b8d7b07415f6118205d84955d8e55a588b560e01238322bf114c0ddaad0e44185446c9aac87a770f9407f127689f49746bcf9962e631f44fc69bc39c03c54aef77fc84d8e05f90af06494ce325cddca4fe8b5c0316010750d33dd3597591d3eeb8aed54638f740d5393ee4f34f9553fbc7f1d733d16c7ba698cab643a805fe5f6a48db69c9f9f6b414547ce729b11c7f1d6c1b7beea83d265e6bcae0b4b24645d27a12305f481805c64ac05116c2af493690ec2997fd1ab7effa053c093060570b8de4c3af23d2ac8d96dbc565b6faa29f12301e6f58cd408e9c0246dbd7fa488aa6ff57e0343f50a44f0364979bd69f744c9af1e90923042f6b420c5b27af0221bd8d9cd544b0dedf2e4985a59cafc314e656e29be83a238931125947480ee92678ef5d4e145d60d563cb8eba8828b49d2f475e0dde2477c95e25f8d393a10da0788f81654e7ccc4866c4357caeed"}, - {"000000000000000000000000000000000000000000000000000000000000000e", "005be5e81385dc5edd76866c47b5bb46bfbf1de58353ce6f01826aa149b1939799a553a102b72d3bedfa1e137a47ffcff83f2f2a280a9f409e4b75cc3cb19524b8e71e00b7e659cf951429ee5d4e627f49d416220839d3e809cdb9e888a1f1ae625b31b07944d51cb94b8e4cb4b6d94f79f19424dd8bad0311a009f34e4415346b3d3da8b91b6c7a21b3f0100296371fbda5a530b251cd2e134aade1f053a61def7e1a57467ec8d507508964a7e64c5bcedba91d6d66e30eddf01f18750c08e71b408b3d34d51b624d7d1798d569aa33dbcb14543c18c768a7a1729f66598f53fa5b15357e0aea1d53a47182da8fb573cac35c8c20229d1b2d9a6a790a4446096795d309856a65457dc8576a8ce65e84b369a2be52d4396949ebcee9c410efd11b1602bb8a614250f49d2fd6c087e5c4c74d046f3996b64e3ae3884af3476f48e22d316347d958c8cf9816625593f574049c8b768fd4d7f9494d634a23ada20e81b315b856189b0d7b5b562c394f3b61fc3742611e83211eae180d3d5d2c9c1b8b89aeb1628375c856c9165d16701523384a8ac422c66d26bed3e7e3ffd3aa3cc0377dc1051aef8503c5a73ee75273c23fa7b22238d338f7fc1d062579b1f09c07c085333f13568510d34c5a94671e236c0ad8a0d5d5e68bd3c0e8ee67ee44cab2ff2222b40d48b3d22969cf09561c4f3ba7435e831df50b094a9f56b8194d1f33ae1547c537228a799b5f0d411f8c3d6aae58cf68e8e993ccbeeeb6574da45ee0d70f0de99029099165ad805600ad71d1edbba34f061c68a17d0dbb2f0aadd805fc2d53f9cb7f2940d9d1640bf1921cc366926d707ce2c9f565c7d4f44496948e0f75f16a0be6314fd2ab841aaa6c19f37038fd21fd1f1aa9e1fb6d10699766a25966f5b244f84d9f1e445e02c4a1646ff181e227b98b92dadf3b050e7e2217031f541c014da08cfa7750fedbfa6054a0edf74a65136390f7b0d594f976ff615105a5a4f54b2a5967850431aa01274d72b695298125ae5381c8afa152628a19b64b4107507ff3c66322d055f897b51caf921b67047c0ecce770313d82dd31a7273523f0b86ae74855093de3e8ec60d6d55e419610e566dfb5cfebd675c3210ba49ced10687ce10e2532a6526a367ce2199ddf54f9639e569ec347e6e4c6dca8f44d1285a7fc1a6e0b461d05fd4ec7f0a357f2dc02cba1150740cf23d40faabaa2696d48b3d61cb4df4644f14b2ce51e022930c82edcf34d643dc1c72614ea7e1031bc2cbd259562f5e44f732add376680a70ecd7b20423668d225bf0cf12fb8779eda0f6344759917ffae9ab2c45f751f0ecc379f64c3edacc66dc33b8bcd8586236b577b8725e91e3f879af2dfc1a1d7ff03e35eae9f76dfb5eb4806e6ac26e12f25d74f74ba5dddafe34e159bd47905d3812ab8eaf549a9463461a47039e99d62dcc12e228f5ff518590d4ad61a17858362ad1b9db19e90b2099dd9ec9e979605ec21848e07530645536d79afa2199c45a96488331f54fb83fa0f51317d8aba0f3ee10fa58306327eb449fab54139ad60a612fc4abd11091fd70ce13bd97aafb27842a69a54efd1296618b7ee147c0c7ab64a4b1bcdd4f2c2685b667121eded5331379792c5f43dffb5f274f5d58ac073e6c887370082085bf72df19f39812178316bda4419518426b5c3982ab994960b237c25288f139adfeedc4143fa2a8f77276cab5538cb01a1619cd421ce553b6d3c957175f64172f4dd0aa9b8abe52ea44dbed672664482f3703c09859e74ad1764a1347571ea8db9fe26db05fd5c932e004c6d65cc6f0ab8f633d74aaaad55af69d2ac1d0ca99d92858c724dfd8135f40ef309ee978a99dc560d7a0131710507da3454811f7f2be0d06546fa16a7"}, - {"0000000000000000000000000000000000000000000000000000000000000000", "00032058bfd424378b8f2aa35072156f08befe10cc009d0e53f58193d8644a801d9a1ec9c009deae878f0921423fa8c616a59b5c342016d4fe7289f5d96a800f40816054131dcb1964a25302f09a8eca7b3cf60e07a2e3f6999e3c63691e5b0134def5db8b5a5ca7e9122102115a556c87e6b4d36a8662596d007c2f7eb608747c0c6d9c1c557aabb1f1f7e1d9a17f43be919b0cd1aa365b7152f3ecce32041350afc92d004e1ae305c066de49d83f7ecbf5a3368faab0c5dc79d23c390951cbbaf3cda7a7658140f0cfd04a2a2865de9c00197e4e32217b3445f61a74422ccc11b67c30ffce8d23d2571502d35884d5d88572bf79dfa29b77fa276809a45f93f79c438b576330d6a12a8fbd43d72c50020aa12a61efd6c55310d9926324f7fdf90740d07a5e0dfdc38310f8e6e1de394315f2ac2cd10b923d58780e1f2993afe3ba3ffe3217fd7c689c56cdeb5ddc5d006a4f9973c92fed26f473d4fdc687b98415bb37620411430ea290e6234879d079d489e11141678fc0e6179e0c69fc8d38dee231c302f372e052aa4c1a96ab1935457e590d60fde190d3a495bc1c9971e956f983055a21da741df739d7c2c1bcd6cf9d38938307806209c8a06f9653672fa0a4629834b06a161ad897c3780bc9ac9b52454eff3787d59728ccd49d80a77e978042a77e3d2a1d7c3b42ee45909dbd90be5feefa9224063103cb151d17f93660312fce73f96636e15423ab29c86360a399f80affb5b2da6c4f623141dc990c891542661d696896a58570b2924559537a4bfff4bad31f6d954b14f8a013ec6c32f979559cfa46cd98a69108b2e556674dad4998d376062fb3138e3f103b77200c238d1c095de70ba3d72406fd2fcb09f47b9e832708bb15e938871fd7f27521dac9a218e382b3fe28a619b8b7e5c7797055f698525b892170556bdacbe086022094ad00917c7b6e65c22c52338f0d10f47cef1a0a493da53699cb7dff6797dcd1e31c9a450058776d047770cc8518f457bd2a412de665d90d5a40b61a9106c4e62cae57e9c9ad4164680128781590d04ede8b077cbe57414adee1138f7472d77631bdb8603a20401cda61b1f3649b5fdefd438f1139e00f3bf67c7f221bf03b0ba85c0ac0ff2e35e32ebeff8a06ea942bc51ee6fbdf24cdbaa5cb31f7bf5ae1602ad6969f0e9c06ec3b2056093efd3ee5d0c71db28e14dcccff8c483d42bbad4f6d4291842107ecabf1cf263c7e7452be1366fc2aed4c7e4cc9f3016dfa3480b89bf81b67e1148de21132e6678368d539a6d3fc6dcb0b0f9cef9912a82e63e11eee7dd3632254124e8ca5993e7f4b8d2c63934517d3b5e7644a35d02ef8e222fde33da3a316fef7c63747abaea8f9542503406709a43f5955f62db8a3391ba6cb8dd66eeaa7c157e31f70499dd7fd0250e3f1b8abb8e7bec0c12d0cf2d9454bd8146ee10422958e1d2447b7d6aae08e5d74de65445d4e2eeb0c706ffeab8b621b8c9ed3ae44fb4bfed2f9f732a32c50576da157b99b3716671d8c7b030e0b8a90f8ef05d06ff3c1d940256a7bd591295f37564410b62b373a1833eb135827c5d69cba4f4d781d7efd9fdb80c6178bec2fcc526baad98a8479ed24e95ad410d6ed7f4568c697a11751d55aa4f4c81cf08eca2c7bbf660a0610d631c552f3a9f074c6261763ce22e358bcd98d154613758cd33b71dcaa75d4c74e5c567a98fba5290b5edbfb3ecb0f3b8f9cc1278734ee3291535647bb30a45f21e0923601104d238d896112a1574d2ad0420ac99795d097d041f0c1151599b5d602fb8e7b3b0d112cbf2bde5ebf93ca21740ff6bc00f28f603a11541e1efd938274899df7ee35c9d975737ec5cd3daf9d3b698331c41cb75d738886cec1c35a2fa23d5e689e"}, - {"000000000000000000000000000000000000000000000000000000000000001d", "001a3a7a00685d857fbac3fc1fd730319799fce8b21143a08ea3c790b1f7cf8283db53a260cff68d778300a5762845d25135891d66c83d428251c57997541b1a070b55db2d1343990902ada7b01cd5fd75b66fc10653d09111536f55d1b764019fe6677d80245c61a7547ed6ffb523237330c90552e269f689ca22f636390c00e7459cc5940f8bdfa3f53c5357319ad8fe28cb2688131bf34fe9db191b13b8942bc8edae373f5bdb045b25ce1f65bdc1c0a3912346ef60e4991acf87491ad60d647b49c19ed77673132e566df8e1d18e07e4322f9a8d2b5effbb6f0193961c4e01ce562c55e77e581caea203f77071e7e2599305f0b7dac219ff035f0f051b99368626699f75c2f2f978f5e0c9a4cb36331ac0e129fd375b71eab24556fe5c785f5bc81c17df1b796d1342de765541fc15e7fc514e65ad6e59f4d82664ca1d59d131a2db8db3ad0066bead37ed4f522503b22cf3b016a10bdd5de03d8869e1711adebd46152f03c46a3416e50b0d8909277cffc84e5f4edddc2c0634b9c4b44a77968b27f4d1604cb55a7d69b7eb6c0f744464c79668e394d1b12e184d43a91c67b087900e26764a6b9b6fcf1ed0e11eb4f21b3100e9bf473e23da077857d1652be4b9f4e3b843eebae5a65eccd820105bcfaecd5a8b7efe45c01942e88b2314bcb8d731387f55ff90e26bd8bab455f4ad7dade3f2fcab2f054f9716b2636649b3cc508e177c8e4a1fe79c6bee1286d929136c12b578e037ac4fc30fe2e0feffed2a15923ad0445bfefb0e49339586d2f51fca9e9f3fd32b5ce21ab4d42630e42a98a1c8d2001277f1953f6f097066a079716057ebae125c3eab7b7a661eb5c6ae101074fb323818fdda4f01b017344699b09634ff651298b9d6b5d7bac57925b76ede7b5f7ae6aa98b8a21cb23da7e9b35961edf113baea599b2dca500fdc3f0043059a7f840ece9ee4f519a6b05fbdc4fcaf8f3143430ec07192e61f97d6956e5ef9aea5672f7541b21282adc8da1b1141287b33b92ebe99b94d09de029240141527e11e6dc1a405b6f7d34cfd66317ff1db2f00e6a1fffd423eb9737cd0da0062ee786ff42865803304b336c79f84e9a4cd355b3cfd3539e64c13feca071ce55a1453d6138223030f7cf4ca04d6d85cba91102e309a705c3fd3b57341b67c4e2fb0930caf77440218242c1dc49c5b09935a1d0373fa837a18be94920fa3ded2bdd5cf6bfa04b54b47e55dd20789b542240394d0c969b07fe7ccb16275e15cd28e2129f140240e187c35335cbb55e064f2601e371ae755bf5ba3f9099fe1981123fee3c18651ab08c238dd9b201fd7bb364453d1171914758364b49f2874939d403c9153241abbba505015af5ad107d80e79673cea04cf124e4a2f5a1c9c60da2b4ef3bb8b7dce6edf33c9fc3e698500c9c99ce602a379cbac82f98a56bc9d9153f3c6b81d028123bf0939e7e2e1f1f9ef2cc8a5623e71bb710ee3f88036d96623574472eb13e8330637fed58dc86b0a476447dae6edf3ece6e81d7b154a9db31c107c0150fc0a2ec13b01091690bffa4cd09274243444fc060965371515f099978c40fd9531855f27e35acc9304804e163506a46095adf3e23a3c192d9c651acd150d814ac1031c6b03388c23306c7ec08513454981c6015196eb674a8c2f89e8f5119bec0452c31ff7a3ab26a984b432b27d85bfe995bb153ff25eb765370ebc0873f68773d5e463ba7ac4e465ad11d960ed4d796d28267e930e21f4e7766037b443bf261a697a17b1bd05d69bff91ae7eb97967e23e69a0e1761a099b7bd73e1dd3ea63d16770fad1b538cb418e562e6435488c17c11109398d3211358201bf1eac4dcb6fba3d49eb2fb9ee597f5fdb278f3eb34a4cf9d2f7742edc81d2"}, - {"0000000000000000000000000000000000000000000000000000000000000001", "0029a3fe65545c2fda32514e1ec1f54e6e6db8ed841e4a3ef1e214bdfaf136d88512dacf52b595f8b9a1216cd401595575efd8510a794def5adeecfa981d7838a792c04c1fa999d908f3e91ad3a0da82831e2bea0247cdc11d95a6f0f42f42e39e35b3a4d4f78d904f3ad3de7cde2622b9ae4ef3c2ab539f319ca51f4ebe033ef9c0e18c697bed8cb8b9bb4ccac2af061c41991621d663b7480c18873d55bad8c529f2b3eb1e8ab4022996bc73878160be3293aa17c526a111236af16e22aafa5e9996eae4fc4856405549635307b118ec66041c25e67494b1cd43fb22f1a04dbe04ffbe0996f31977dde36a968e694195e1cea0e33e21a1b3d71b9a11e99457e914cf0379adb3419c2a400904bd8993b62fa7ea13328f0cf79e63950b89b6b4ce935c3fc6d12ae883176b0ae5cdcd90f4cc76f7f95a3cdcbd9b4434d664ca215e899b476a64361b7a497a825b5dafb401d683dc3e2370d1b19d5700cc51c28afe94994dcd45e5738ef9b224a7ab8414b0452b36025a3d9fc3a619e1a464548c7e9d107af3e395633b3d56197ded7c46615237cab58defb150e522c4f158f64f465a247b0424ff2fcf0cadc2e1d0719b90b01169ddb5db1c750cb5cf92b82528bb9ae5f599d27d73a191721644e00a5e294f73d774edcb00d1ea60f479d1fa7fd1b38012417ba937e52d7393ab259b26d49bd2dde1db408605cf7cef3c48daa4f412f2dd497b4b52bdbc7b004d0741298fec5cfd6f415e86f2f7d644b2314c9ac378169ab273b7ccc50df736e76f4b6e889a878b34dae7280cd4c4aa2efbc9ee10842a8c390bcba3523fca9b07b0c69168b5356fb6af571e4d57f01b68f2bb4fab1cf24204831a24396d063618b4c5b37666635941b909067fdf99dcce39945f80bfbf135a5cc0b6d73d54125fca2bd3ad1b75decfb82997c5aeea4675f7149100ee36b4efcb9e6b73a1409770dca0df641adb4c3a0a60df794ac8389fb8c1a0a79e70211454a994f60c0ae98263b48f8dd712c0e859ec5f024e755bb9da354da0c7d58ad479337582297de8fb7fd264a03497ba243ceb2df99ea7c14b8f047baeb8bc9e2d003b442026531c52ad8d27d49ba67407e3eb2d0f0d349da03325a7176f52e938e74bbbd7f22d60b43f01251ced7353c7870294a26ea1815596c119725e4602d4b9e2ef0167e580f08cf1d0eae692411c13f6856f271b96160658c28a83ee387bf069e2041dfb3604c5205dbbdc02b796075ecaf17a9f7a6105ee8fc4d8dfc2f8529b07809b18610feb44b08024d382e02dce0f559710290652340786865d0b01c0a072da9fd001c7ce397d60098658df98647313da3bb437a5bfb9329950d5c60f0cf49c70f0927c4ec54f7493a9bc73b59a04bd3a6832dd5e4ab48e0940a8ba4abeda7bf23aba71d9498402351d3a85c3aea2b243f21f53f12899d281b793556b874c6b67a73973496407185ac92b01d04cb9c2e106b0f48ec1857f77d31fe76453e6787a1561b84b200fee0b35136b90c1830be1c4bcd1e998fe552b0a0508e00426aac7a46cca1426c461ca033dc0061418740a30f0a5ec4c6b3994ecc0d463ee159509846d8a1718e4ce11e553dd49182ff452bddb2729662cf63c3024f56fab0fba7881de88e354b2d840ad9dd754237f0c00cedacdcd3863fc7100eca395d5fdc20e58b1e4108e458c424a826cbf5b738fa228207e42153986d20f3748a5cad685e9f40d63ebda6c2fc97ead8e6dc97a1b1e4147eebfd9c296694a63eb5a1b1cfcbce2011aff44978f153a15ef0432b3035d5e6555865453c83ccd6280059bc101d3cd3ad0ecdc17f2f9509af30a277eac51911058c1f10d473cf0bdb87ec7c199df9b5fbee7e778d89fd542d2584e67f1a706d6d2ba1ef5"}, - {"0000000000000000000000000000000000000000000000000000000000000002", "001afb14889536536d61e00af69311801a4b53d972110a8a043c4feb994ec9b1b5d5ee746a5d55b454c7157798aca0b596cdd8b0a5526b7af3e305505ab65516b82906ab2d6a4fcbac04338d42e9ce64719fc8b709690c731ce946eb75ee30ba4a56d972c8213958fa177b0161855fac3380295351df488c2e6dfdb4947f0a1f517c75d92834cf8c5594dec3ed09e84c37e67428623f1309e79063caaa55248dccc9b9cb1998ef29007daedbf4e161bf2a28021ba1235416953ddbb9b71529d4834acc520ed78b224fab652b9d01dd77da8613a141c420fb9749e7fe917be35616e92ddc7777e81dd3339be65e9227a88213f516fcbcba2661d773ad048839d193663d29476cb3c5f94e108533998f765a0d3e16a417d55e8bab6349c2e96af7ab68a59cc09c0b7649371e58da84f13844a249471349325b582054105c7f486e14dcf72aec585793cabce2253591c4f301b2d0d63c5aac2137eec39a18d55de1b522939f1a7b60c7d1cabd83b9fb372a8b32db7fcebe25b86e380961717a8e8a6039f3352397079d99a92ed2120a8f0fe2b6cccd5a60dbb3e63453c12d53fe007dd16c19046b5d6d2c1c28e1e041012867adae6d210d3cac84275ca65acf7350efa1d232f36e574a7fb4e05df90709ccb57f8d1001d0a4e98291fcdbd7795d2f9f66560b42a280abd9161ffe79c609bcbb8c8b330c1a23c903a198458644f727550984077e38a8c6084376097a27495db8d1ccc5536a8de306ec333e99807cfa7d7f08ef4e722c5be94d4bd223a4df749b62f7df7ebbc814ac0b2e131748bb3fd591efbdf5ccea4114b54ad307fdafb278ee4eabb54325a7abfb13ca6e00fcd8520e7372a0260f0404d79c24acbee661fe48bb3c87a51a7e054be1d66d35150d18d0e9f8e1f68dbab676c32ef29b78ff216fd157f8d549b778dafb263e3fe3bf0049e4bfed222f7f2d63b18c745b89927764def27c0dfa3fcbbf658023cc4b619ff419c2394a0ead0a4b14f3d71d33854d65e6fcf252824b5d04f0f58ff8065fd916d4819d58b32633362b445b194a6e7bf5eddf039433bc140f39faeda911ec8140fac2fa1e19a48111332c4c7e1c168d5886b2092540b415516dda7b12370ddf8575e14ddb159614309556e57540c61714b443a32794a7274b4bc36fb66ed2354141be53974895043bd9bc502e5065851391bbb5aadd01f162ddf3be340df43ad72f0af9c476339394f4d75262e073f0140999f988968297009617c8c5cbf57f6e4c4cbca4431cfcf3c2621215bd8bcdd1dc377bc10616e9bf745006935bcbdb9b84578e0ed564b67ca441ea49d915612034d6d70f1cdc911c80e298bbb9f74f21e2da7a75223c399ac5631f5729e4e424bab97685c92955ee5e3e741e2c3f13e39da9eae68976e809bb00a8392b6b00ceb1fc7eae7bb9d60013f00d67543659cb3444a220e8652c41edc2d5f4e7e2f0f6df1ac4bceb542f340da0092de178207bdbca378aa33f3d6204941fe2b02f580bb6715a297b15418aad3662c32b14861b6961015329021e46d70af6a3452be74c4e3dae98b21aba1ec5c53383d14338cf079348251f5e46217372eb75091723e8de536f07edb4c0de76b3fc253da2714ef52552d6f18510947ebac01c77567abf979ca37ead8904da0168091e91cb974b00c5ae33565dd227120e43107d24dbf7478767f2c926d80a70bdb5e24054cf6a172cca39c022a02dcb26c5756c7eb3cf53febcbb6918d2b694bcaf5e71eceac32df85603f98f11dd033208c496e8fdf2d8c59ad454276960f15e10a2b732b70a737572a5d69410d9c794ecdbdc1bb1d576772f710f133a6a2bc53f7eef8936fc7bfac1afa16dfeeb66176eaa8e00636337d287932b1dfb615ea15ebf1f51"}, - {"0000000000000000000000000000000000000000000000000000000000000000", "00c08022130723786de7f0dc1266def8852644b5743588cab98911b9dedb5ef43e1a53433e4f4953d863295b45b8ea9758d2f1c4d51821b9c6d54cab6b9c244673d25e321b040d598367fe186a272b11ebf97ca605d02277c756e24b20a82466b15b1b298db214eee12e8f223db6b171b1aa21370b746ad249c50814821f2c8a95d77ed47d77776466c82dcadc29eb945210f84331a3cd85ecb8f17a5f293bd5e0a1bf25d89c75820475c966e6b3c1a3e72e60491c2316816136b7fdbd28a3757e4ce590996de5338ce1c2ead5215dd8049316163697210f62358feec1b9dae512c876334f4a9531cd3a1335b85c1bd6e9a4a2c1a62d0dad9e5ef03e13d9daf936e74afda94cbe2682fbb65bd9f6ff55e45ffbcb90863a3e29f61396c08bd1084e4ff6d9d6dd2025e249795567299ef843954cf9850e18da31c2de3c58ae56fc12d90f810709204770aafaa3cff7b28b013734fe1a140507233fb1c31f683682497113d3971ee12e43c37224d3b33526545e35310f19e15a4c38095a8975cb6694bdeb3c5242b2edd67da7653f92ec2c92648e8b9403593279833477c6b20df5d178f20f0632248ecec794c6562a21d16b4d31bd452e13ad0f0e31d920e2a5642162085192fba4deb907c694f0c21bb1da64d76d6ec3d1dfe1cb7eda769ad19f5a29132687f7f72c564fad20cf96dd784ac38de5d7f427a20229589165c7546243ea004f9ae5c25f26edbe5c2e1a4f5aec401ab39b716d7282daf1de659793af152d082641792bd6fe656343a17afbfded4069cab975b81c33b63dd6594f0be77ce1d65dd99794e14009ba3a2ff11a3e0a5cca1f0bfe37f3f0461a628c22b507eb329f3d3f90583550dfe6f3a0f6595a6670f27f72d84d23cfbd69a976b3da26562d05361046822af46ad7a1fe1de9782c80c58ccd1a3a0c70de2ea738fe0d5401966ca4155cedad5711643124e53d5f765c5cb18e17bf6d63f591d01b9a124d0287f19b57ab08be383c195d26bd0427d0679cd4d74b716aad65fff7977eed31c16af3cbe6a51bef1969377ff5eb6f4b715dc24a04ff414beb5b9030f8ef446f48fe50e5e6281b26223874ead3a119c7b1226d95ac3cc1fe7af4b4bc59be67b31c323da8401142f0383f51f5ca56b1537c132d84415d5b29ef80997fa03b9c69749d1f7eba5c9e6306ad1f89e0217fffeb30b1340a0cf4949fdc3410874b7d4316162d4b1dd66fab0a4460ee4ae4e8fc5f860d4ef2f10851ee3732471cda867b3233b5281e787e2a5b1b201d70416794dbe59fdcc09d160fd774631908e171aaffd59c95c1a6a88b4d5113f3f9f67fe5700cd618ac170db1407ed02108af1e6461d5cd727de3103691dcde5af2593a835643ae633d468f28ff7e6137e506dfcd112bfd0f2ee6ecb0bc143b5762dffaed019f3e90869c5120f5ef868cd4440d2df6551a757c30561c0c0a91d6d49836050959c98426da095c29960aaf87519d044a6b5f1cc28b5ee9d5cabc2d3d4fd213ff7cdcac9ee03bdb4804bae454a5db00c25e0f3d05e1c346401b5869973873110224c81f724b7dc1661c3719a73a0e6f975b7c15f7feb82e4e2e2a71ab1b13ab098891d525ad4ea69236e8e8833e707b37b84e2af4db413c95e7018fe3365cd83a5edeeae5d8ab470405b30996d7cfc52ba7034097761889034afeccf10b347fd86021c661315710cdfefd17497cd8f1308617327ee7ca0a462d9746757df0ba7c927db9bc228b39bb734a26d3c9bd3bd7d84007ee983305569cbff009bc48ac6dc8c6f2cc07796fea5a2df6cc96ff8a78135785dd0f2135b7296c72a3b869d2c2daea7a39e70aa6c8c9648ef629091b043224476ef9e1191dc8f43b835411ed76677fb82bb60bb640e876fc3b3dbfe3"}, - {"0000000000000000000000000000000000000000000000000000000000000004", "0078d87822909a0ad4afa0388a056b3444fa69703c1c799f3818542ed93536c3280b35130b60405ec2ba1080a57490682a4dde1a979016df0f7ad0ffba4fe7224573ae4c6451e9d0f4f9e4fcf09392d05717ba8b14361c4e1b1a48f9812e627192e90f9a4fc6f5bef41d36e4304f52c79955a4f3d46c486f25b999169bbe15ebe259890b803ab079018b26e9724d768b93c08521a40fa84da6eec3584fc2725bfdd3371948de31af0106e8e5159089a14cfa61fdf6fd8510bab4b695d84c5717a7389e1b1cf89d55daba44ead78069fd12f025fc235754cd91eec288257a833e5331fa0e39fc7334b7df98df8ee203f12c13dc483604863aa17408980840fa9f255071c3354a225c4a76089d38a2b3b74c202649f66d4cf06ab34e145f56b552038fa3fdc9432ac155b6e19b5e358bb0458bd1eb417610e0bf306c2d7ec577a592ccd15b7655bb53fd43b2ade2778d4702236c76a5ce793b26c3b44e95a419224408dd18bd2e74cc07d26aa175a1b4c46be96b80a5ab37bd8e9f16c3bcc1b9d6770520c4d6999b79a47fac6addb09130d4a67e24d45fe7b5e5532ffcf3d63136ee9ce7e6194dea294a126362ab23d1b6e48f0981f03274c31125dfa4ab5fdd499933eea48d9afae1d52a2d9395d2224dcba3cb11de4765fa24e0abdd7d759b697e28b62e8b8eb966136ab6ec3e2520b256cfd19c69f0be3a06ce44ed0695bb092e14f108af6ce2974d399be8bb58bc0702b8e5733b2d40784177cd9227747d5db0570ad50621fee513895302117c10e06c0d950cfa82b81e56d538fcf3b1bfde0fd1e9f8d58915b59372ef590893cc5ee8901517be31759e35c75699a78d53801c1b6fd73c3a1735459de701c8fe4e08fe05c617cbaa161e4e6e0e8a2e9b2deda1f1827bd60cc95bdc18932ad2874bfd50b89760ddf6206bf50969d499d3357c011b75341f4833849c3ba0cc87ae23f948df1e90d369cb1cddf069e8a5bc6357146bc377a1e3f2f48a8312db7bf678e89ae3dd4258eff07eae6edaea7a698b2067311f9ae8ef63c2cba2e35d41ed35e3f8b62695110f743615c8cb65fe0651244fcb1875c5c593774f27b026288fe93e2b915fb5e2185b87ce2cb61e9ab218f8d3c04187342a3d53757edfc22b7dfbb1f2ac4e1ed053408ae0a273e0bf2355b4c29d2ac107bd33840b31a6c7e0166837686dd0e1e0fc83008c0abdf6c80bf5f2fe1120f06b9ae962cf30e3d6a8f8ef11557112534add76d0ffa9c6f0819a34a95aa979cddff05022820cbca4528fb49bf4250127f363bdad4fde653d138be95381a0038d2780643c104082066774dd92ef802cec0ecd328f09d6c208c2fbef8c1ab0b57f0da039dec9d49b21f9f9a716342f93cde44d940092f9b359aed437e27920a3fb3e35c70c5c38ceffb3db64aa01f6605cd35ddc9d67e5b0384fb5ee9a326cb590d4131d121d6850107ccb40239bffd232d9c7f037fa9e09b68f69630fef0ecffab1a9826bf3151082b3cdd412a663670821ebdb7cf1a4b2f5676941ea579101c603f7aee2f695ba3ba1543516e0dc9eed53e5f1ef30098fd348621870d12524b0d49e3cf5b31aed5ce01604d2943d4c9efcabc48ab0892ea742c677e7360600188bbb10a82df4fbda8db339c53eb89a4b6a163d7704331249944e1c228d863443542344e187b417de721e96091edf10be319c0f23a9545e25b5826af3d65307af27d3b74f0f60c8e150f9f9ae88747f55041f381766246e5205f1e0cc8e93abd7fa7ac8f0d9a7abcf06871b44874e3084fcd2646e015fe33f1b4499572d0e329d6cf291d591cd9861ad3ae5f7d48f25af3cff10be39b544476075d5cd73728fdebf7a78af9a7e1922d145c5c3978b199e9de36d70cfdf8a476f32d86a"}, - {"0000000000000000000000000000000000000000000000000000000000000000", "00554a117ac2f036fae2314ff693f578d40ca9d2720e9f6d3d1d46e0ef1b2752e5cde84214e3db1544b305675ea52a2c665dd2f1310bb4a19f4c7754c50ffa185f7dc5eb935930a7b6b1b8d3625f61b1f31330660fc025b4f287407d08bac1caa69429d77b2dbe8e5815df0e63581067892cb6f30dfec3911cd8f01ab34747e96c145579d031f16fa4865e7899f2f7fd7912cc817d2d270d72dde1f9e2e98bbcdbc40bbcbd7e53950c5b77b90c8ed32cc8b4619e8f8e1c86b0d3de031a167b66f259d47a31295c7581bc446ef617c731f2a510d60735aad0f0b59f09818fab2e3844739f5766a52dcec7bbc4e38015c7f8b384d3e4466d9d6f19907f1160bebb8e8ae448e32285950a5e9879b78b58140327aadca4ed196b76db12a6a8fac6199ec2d6fe39ba18aca361fb5ce6c3475ecc024b66171b3d015d4d746d3fe4791027a81f568629decb625da7343edf506205501f256ea8eefbe024f188df1f393268fdba268b0ff48e14d6533de99315b150dec39e189f542aae8708179041be4a41aadbcf72db52d7176d9a31adfdd3082a09e7fb44872cc37560a4655b08ecf0e307980c1fe57982229a2f9d9aad4479f6686e858434bcdcd44048c7a179eb36dd732c980879f5761b10f7f95d0a35be8e242d50fceab5afa5340857d151e402b43e344fa7c389b31cbf38ef37e798a2c32305fe0851c93f09ce05a6e3e2d1653fdc01573ca1518a34655b46c726d947a69bdb8eb1ff1e02c42638d17d6b7dfa15e91f042a9bee643749509a14c3bb413382f07538bc9c3d2c022f04d168aaa19ee3f9c3f61c89e1139f9abe13ca30f71cdd9eb50c70d4da454ac0d942f86f2a6321d7f5d070cc48a10d07d3a7867d0bed6649f1540d1734fe4b13e3551fb960a5450d6727b639b1f439e82543a3f50b5bef41de2c643e61c41886884e3aec560334153af3593b0cfed163f494591fc14db07b6a472a5cde70a252f7eb2157c659efbbfa1ee078fe948b08b83967e1daf9e8f668622597e7afe6fdfb7c0da70f482b99620cb6c8fcfec24ba141339a38833cefd60a26a1cc2c029c9d1a84c19482e0f738751329ef0d1f4963b03658df58ea341264a72dbc4d60c7dd51121b5a0f83ff8ea47575fbb1df0db49dc8e98eab811c4392fb21ee6b53b5b04f254b6db15c56f24fd83ea504d7f0ca3945cd51cc52e3df19d3a1d59e4cbab6311761d7a55a8dc0aac6e1b5c33ded032f18959f2ada0851216beb56398f5c01e1f1cd9f33c6c5811fa75a1b846d1be5490acc58e24396c63fc05644803cfb76058c041c410eed4e7faee199091db3c8eeca7b78662a0269c202e43b632754b3f5b0f9710698e3b67e2408804b78668a9f2eb4d0608a3c88a0cd8f958eae0b13728d0c6c6645e3c88347dae8d324fabc61ba53f607fee228a78b85eb28aec8437aca724a2f7c96e5bd2f057551294cf00a8ee513df88405719bac078ec511d051b82e468f9d99053b2f1ba7b7bb25b4cf78c8e207d1c1195558ae4c31272d57b364481c427d07f5c175219862b550b7d0c3304d5e5c1fb8e81c2fad27e21f6b5ee39e3c345356b25d78736f3c584e83d899e2a03c98f319cfd2faac6c64da66a2a8e37a01319b735a22bbfb691c09ac20e179b13ccfc637cea3f0590091f710c921c259375d5856e6c5d421737675a1f7e49e4fe745c197e19adcb7839664727c6a1dfdd4f8c261099c364cf4e5ff8aca659e0e423fa5142d679742973c24514fafdd5f51b260c58cb325dc65cbcee3b0b2cde5dde02d911482446569f3cc41f53e51e83b91f2675bc13182e16f60166580ffc20528e37f4bd2e0bfad63bee55e0e520fa5432383a8c19158615c44d3488fad5c1e11799807ae4a6d64be34580a7cf588d"}, - {"0000000000000000000000000000000000000000000000000000000000000011", "00f0644112256b575a17213b1c2328a06fa06c400e496bddce60603f5360c41a404a66fd02b30afae76a1308c6dc78dea7b3ad88c77fb4efeb9df37437ac98191f31c05765686df3f8f42d95bb3e7e2d20d9065c033648683e9874c51a2d16c42b5a82ae1b8f7c752b1458a1dc6c11fc29bb31b5d6f35956e190c358766c04f4ba4b44836e2def1fb0dd68b7225def237f2fc62a84f7ef6a9e6e8bf1de93ba301f57ca9ce435e81a031899b0b15e9443a1d7211ee86db0ddcb1bfd4d237c85048c37720989a9d1caf597f977e306e01851982143ca5de0c85137549664b0d2c0c4154de40e1a1e3019e595e61e8511925b930481aa25397ff83831300935879251e6b15952e8292305cbdd6e9b5e96262b17f93edc8e6323e72d8ad529accc1355afca1c38b3263a945636520dc590e15315fae7ca353eb1d79619310cbc175d94d433d31b1bce4c6036c7c1837f6ce801b46d8501d41e57e13f527225c89e8144c332174b06fe6c672c8e20429124a115563f51e627e75bac4e1e57abfa0d19acf9770524938140f21e26deb60edb2ee8b98b16b1ea35b894366ed37ad176f7147b85b30e2465ce5991ee82c57f21234aa0667a50e9f3a20029ab85fce52467794892c72d09d3f1e5ed29334a461f5fe39e73278233969793d0ec642ed12fb131f5ba2f8a645645f716abeec2836469e23089390b14c8c6029c88fdcc9a52b7fc3d727048c7f7dae356dbdac919a96b68b5cf89e1334b56e6d5d9284b2a34ba2e130605cd896265b3f5be61550ce23d80ae7dff16620e19eb2199c51ad2eb0ea9d2463dfc66e9df4a316a8906a9ad65be56d9b3b3ad11db5154361d24f1bbc07d0f6f51f93b4a17990bf95321e5efa7c5d2b33bfed9101060eb82ae29539112424341462da95d04952d9b16958130a186ac4dabaa21ec216514ccdcc8799e7c043500f52a8eedebdbb6e23fd33f5fdccf491f2fb5254b51d5dfde00735e03365cd23b9f371f987b70800e04df3b7214936afff85586a5cd228d70f01010fd28c78b570f26caa5e27ca3ccc85988698e65990f220701f0c6e2cca239cbcf710ab0511848a7aa672c452ca6456d3e4ed9c9a40d74048a537456267a3e99791299ef655dd2bf3fca2a54b7842b324d5a709094ca16fbfac8d1111fdedf585350c5ab33c18d0b13b509048bc68f8267de434a65e2102dd859d09adecbfc3c226f611f17673829f9add935c7cefa2ea1d0180bf610a6d7c915a176034c4ce259fc20c1d8a37c76787e35864ce2864ff69ba1089385b468e2c24beb9bcfdf1897ed8efe07b43f9d78454dcfbb9691556c10b1c71c4bbbc6aa5698bb8a2d53e753a5af15ae8e922233355cdfd8ef93c574f09b863b33d5fcdf493e7a7ed93a9017fce513af13173c574e3551fdfe1fced96a070a50b5f6dec4095eeb61d3a01de07075f2dd5b004f496f7ce8a1a596d18950081d9c53a4a28cdc75d29317609d50a751bf5bba9931d1205af325bdd2f5fc3a6bfda7ec112e4959fec5a81fb0eda3f70b045d2ce6138b046ecd85411082d1d14609cb70e91a6c8fd5a430743229fb0c773d9528644677750675b692b375773343049b0ed3ca0ad79373e7fd542b256d942e6c4863a7a633c0fdddeff9e3c65914b9f2b9f15ebb3db70c13792b85cf58359faf881ab5fe5eb7d492bf642c0d2760e51bd70613ec9e92f2d6d8ecc379ea5d3ced2f5ceabdd5e57b537775f42f642a26625f169894b6606d3d92646cfeaf8744c6398c51531e6c9cf45ca610d55e8bbac9d4d1fb25a6dfa9cb163312e33de87f28b4779526e5d521cd5cd33020a56c51e28535f8de272bc48a9a5a655ce3d164f051608045b9870dfb623e2e837eda9cfd3d4c34384ab3f041e6e91f5fdf5c"}, - {"0000000000000000000000000000000000000000000000000000000000000003", "00669f26ff265f19be55f1f3b1a085f8e5c8ce2c943ad5670841704065e1780454095dd245b4757baad00460c5fc773594d1b47890c0f2cfa669aecd7af33b163c4c78d28a371928add39df87a517a713354c38a15a81c5556ef8c27fa88821c324b9c90b7241782981dcc031e706185cf225357ded1d7fcff59eabad13233ad9f58d6e678ff7feb4846dcc9452a4be594bf943ed03a02c0511b90d66b473cc651bb732c7adb3a970375062367576be36bdad2d595cf150cfa6a8e2bcc095360c04417720b38a021298c7909f05706ccd1a20b02146afbd83ed9cf8732e1a87f804ac91c7b78bc15d8cfdb299766c9bbbb17c3586860cfb07a9df22a1ed9aa4108a06a2be82c165292c0dea19572d8ab01480c4a9f7158c644f70b58d04df441f6743efbbfdb28bc6390754bde6530d0337f903ea0d1283a6c44d37372f3b7d46e682b973ef85e05f88752953e1dd4600109aceb898af849b910e833dc5ff32e9cd3160a961dd505737b9a4fcb6d8683c79f5b5635c6c4ef0cf507e416ebdfe387a3a60800ec38cd7cbc3ccfbcc80d23e4d161138a71cba0db285fc8f16f8ade6e9d7d6e06410780fce6060dae1fe8a29a4db9bafd2a7ca8210f83fe57c44c8252f0e865125dfdbb26b78fb6de49179e92ffb8de6577f9bca6afc2410c6e6c48b370c8533ae6c345a723a3b18d264fa7b912c9cf88bb08250178ca38ce1e004155d6207a313265a0bf4cab70ad30677e0a43ef8febe6020498f5b67685d645b0320b08f99a919651d7b096bc237643d1471d3bde171c5416d2d7f915d3f393039d44503c5db33ea41897c15a0592fec73c5a306b690ad8677267cb2aac69db73bd2e6ccaa1caa975019c0e5435adedbad28a96fa450835b42eebab57379d181383803da39889e1b4187b6145b6f334c4dab8b151b146ae83ce87edd5ce30d0480195131a1ece94f097220236dd7350b6f62f5d5dc22a69ddf664a222b53e8a97df5f63fc963f1e19c7e306d836d8c09a3be8f1b8e7b1097368ce24c9b3a4080f9eaa706689d268c2e8421ec0948520a742281d5408412b2a60d385ff0843e11522eae1151579b747bf09c72a0404a7bbad83d86111da435b1a1b02fdbf570b19b6f3f15220e3a9b91265b5a863070f86fc19200b70314c2108b0ff2fb16289e4692288e4638ae8d203ad47786d83b991c76f63a56d9f588f0af49d6c4e4fc4df6b8d61e66ddf69651920b01d32f7669fab260f92f6e76b10cc8be2f024919baabc2295f477c600140e37835acfaf196bb0852b9b611a520637f95e4e08554ba25e5917ff404d1435843bf5a70bf39df07b13629af99fb67babd85fc1f60c37710dc173bae6250a1f745ef0dd8219cdcd00fe6797547fc6ee1e58711bba74604fd9fde9d4c403d58340bb89327289de1902716f0058c375aeae3b5213a76ff6a8c184b406f5211893188348f00e732175c3796acab171fbdc5d4302f95e1de5d772a7973380c20f245524492fcb5cbc2a17ec9edc9807d7ca58576bf4d72e4635c1ba2f050d8eb07476dc0d15571fd1a28bacaf90e5422ea05614a6f7682e24c80bb12394e62527a446d0271ca5b4117376ad13c7e42484201452dd22b415c7b69257fa1a15215f59ce01f503a41483092feb6174974f64270df675d23824bb49438c0723ee41af0a226bf3bfc919d94f2e5d52f02dc7ec41cc19294a5667e91ce42615e2432da9cde6b5b7bca2452999efcd02eef1df302566cd3a03a4a81d7b79040bde41db615f7f1c3c2326999a90452c92aba56482ba174f19ed60af70b1e55c7cc6d776e11385a4645747ebd555def34c992e642a7cbeba968c54f8a2fb052a7b6c5159a239fffbf6303c027624dd2f43ea94748e7aeda79d78ce1683ee"}, - {"0000000000000000000000000000000000000000000000000000000000000000", "0091607b8f0af35a64f0d0df54aecac6619b9e77a01d1a7d677898f197c3b2e665916b15ce720c9a08e91737fe59815b097da7b225e1eb7b843a1b1fb7715a2eff4d389b75fe33d98464e15ffcf53af71bf97bf5017d0516e75a6caaee8463e17b6185259714dbf1a307cc72d9025e68790cd4809622d2564c714986bd1f0a54ddab6550305bb061b2bb64eeb216620db801d260eabc1facda38c9ea9717a96077829dfb2f1aa27b01586242c72333f1b77a916dcfc675a501788babf71bfd69b68aeb3823d30fb36013522fea441f1bbcec16c1be5c4f8925c283fa56d8404cdabbc1f4defe10211a4da2a414a3cefcb6828971603c9a13f918b57d0485acfd9917c8270a460200b1d9772307bcdc40cb245ba61e6d763c5fe4f40d54316b145756197c10c0054f570840a3027f35514310687b1fce04735792860d97d5be3806e8ed89c267dcdacfa5a64da959b41c00ecd7cda0cd298115f430cad54f186e641c5fa988130361159d19479d348183750db5a7ca7f2d5a41030a140a4b3dd614d7a42f21a800cc99a1033dfbf4a5171c734aef16cbb17d5583648b2f5b5a55f1b38e15025aef9de4425529a245a5d0f3f7dc4b3a743d95c718aa02754fe3b7afeaf7866a96d2c8fa5d9f9f625e1f8dfa1a976413b1494725508054102d8e009693b94e169dca4ee53ba14a2d45687d4b99170e705bd555028a1ff6af8ae7297dbe07cabf631e9e0cf158556f08a024aaffe0dd1d1dbf15bde6b9bd41f59ad1890f19daef456847cf9aaf74e24369d2b35923eabd1c781fcd76ade2ca875128e74314804031da82329eaf9904b7031a2818911bec31a4d7dfcfdcd576d97a30710a9f5b0d71180a07844e8127a225630caa68fc5acc075181622bc8db2b38e8a2d751dd69b6596534c32b1c5f86ebe229025386166c75f376e9bbb2683dc0dd0392613b1c0fe3631dcd61399a42f891b7f917bfc2332b21fdc99e8b0fd27b748b1151ec693911cc583e0cbd54b2c9952538de9c841618bd0a1d1f5b1824202af77228ded334f8c5b2d5d46a5c0ffaedef9b8edb0c347bd0b1467882f58ee5de2e7674a1c0f834fdd0383467b455d3facb9ea6c3c672eb97c66ff3f84441204ed99f7c590cc9f4ce848d46694a9621a6dd640230e5b2f673992d1dca022a02fa5fb33aef3258fb030446feb801a8df11665bc445fad5a0da443137dd7f4dc26ba9dd6a054bd040760ad7bb2b0a735378bb2c2ab86e17cc11b4a14f85a2c14f7570e578cafd84aa2e4d63f1a7b789adc5c5249337f29f45c7f69276c410b2461eaccd9bf2d553c1818f7c27c1277accbd5d3c8fbbdbdb9ed68be34d26d269460ba6a0b79d010a1a52fdf374b1f90bdc80d6aefdf0d651d820d380f032c865cc995937a5d854c5cccfdc978db1e68daed0083f268064e9581177f0d17c1453945b1706592ecf4569aad957ac7379a4cde8848cfde33ada995e62b80aac2501bc204d93f50b90bad08c175cf82399d7c3218c535ad895aaa56cc022df1ae859a196d5d6db2d1d6bbaa95eee4a5bb34a120ee0f63a3d792fb8a4ca2d2582f21adf786b0a1b2711a3c7d5edc984711eb0264daa8668297d358591237379c45a898aa8d56c7f296c37d275cc51b0e694b94a33d3435e7227bfc7bd0d34c191e8a83de37b52532700ceb20517f1745a9f191a1262df888f27880858adac4c269accc21be41d10a50629ce4f1c16b277b19a29727860d761da727f20ad9356f3c96b3392c1734d10a9dc9b8d7b1cffb0155a298d578dfc6ed9a431d5686135862dfb36f8101c21a995f3497dd4704974569bac8f0e43089e3ea0331e559c298fca91b630040d48fd518e0cdc3a2bda411132a20812cab4b4d517d113478b667f2e7eee2d"}, - {"0000000000000000000000000000000000000000000000000000000000000006", "000164f1525176e0a232a723a847972e21d5978b9e47e5fb50fd5ad589de3da64f01b2f509ccdab792c60fd908a50455a2cb5060e18a54e8e89cabf577e5b2175ecaf03ce8762bf133c30aaecc01416a380fd0f00365fe039e6905c5dbee35cfe3421aca0c10fc46eb41fa1b2948dfcec765a41440f0c404a5968a16df750e853349b23880dffd0478a9c36258e341319d91e519d9eac1708be616eecd1653ef776d065fb97f0fc4018b6d738e5165ad06eb735553df8801eb673d41392e0b71e393157c56e34273e25de3eadec4251eb2bd095ff38e82484456d1d0e63774b603924ff1fb1e4a2215b6a4d18aa428afd0a7b3207c5c6a19d87f266d04cad8b70a0402f036ef7332321e51c19d906f7e5705dbc6d20e505707160a6195877e572a06e8b2a77e1e0a8d0baad1e4d550ee0741c65bb265e1b0f85ca14e15844e56623811842049a658fc33a72a869db98204fc209e1324ab07f2dd69c389fbd142e8cbdf209d2226eb7e9e18bb6af422f4a2c02cf6326bf6b88fc806d4307bb80fe96687cda6b77040da87950ede09aa187667f55d1211a8a36d98de45d15f9a3ba23e7d2f08fe330f2f586421c61dd55d2834668efe6edd113019037d4c20d47b612a41c19ccfe30bb7b13cbd955b0ee39d031ca26ba1204ad4b97ef64727bebfbef87818d682ea0c1ebeff3739b66aec38f45243221b88d80613af0b92021f2f8faa80789133614e744c3c7fe40740cea2da49fe5ce07dd5b4cb3a455e654ebb39ea0ff1b69dee18b626ec855157e8abdf91b28a5654db3bbbb4311d53553cf020e43fc7b1305d346f4e0b9119c8c73e52105d589c03d67e7fc7487798621e31823f3e4d303d34d329be09e4c2fe5f3623098e3a469e23f52e534ad978770559a2872d7d8b94cf8809ea2e27222bc30d1a15b908434558b75df3a9ea475dd9d200ad02f08641b7043dc3635dedaeacae4634db37c208f530c1c7490e7503e54550afe1faaea3ba3743021a966d4af70e81dd134912476c30e94f86addec401223772cd11d82ddad567a44113ea14edcdc6789bf601322b68db06fd5588a413460fd689e267651af11321c5c231eb48b4eaaa9b87d234748c8edf00b881b1088ab7ed5199709f8a84917217fe54cc8404296b4669e62e6520a6dc856d36c7ad77e2ccf36faffe4151049aeb7f4eef4b89fb934349a67f313118a83386e10959149e6b572f0f49fb8343a23c8b599dcb11e5db1673aef38a990b3fe806f1674d8c8a759f9e90a1e916b27a716da2a297879c431b7a3b165a36521b03c61779d3be2d8eb437ffe6023362f24ef57bd0cf6f861ee23d28be50cd40d05e2542ef5ef1256bc576f5881c3081fb0689d7287de9a47705ecf7f942fa50492b50ece5df75a1426fad75864244fc89628d2d5c451102c3a7dff7893f7a8063a3fee3dd4253ad635f13fd0662637f4319fae334d0911010765f9d8a9bcdc5ea0b3fafefaeb92d2fc974e1464e19a3f544536f665f27471501c12c4161da1fc49958c37c2535181faefb0c317a1eab4d698cfd5012a4c3f8b805c4f738122b2799d4e2dd5cbccbebc384dc9054129217cdb52ed61d007aa76dd28ea1224362c135c1dd08f2329ecafa1d18cb5d3450dce1862db63e787a4caabcebf8aebd0399a1813ac6246c8fe1c8a66d73924b24e4ddbbdb29dbd38e2e216db9f4d192dda0223b23699c5e5edd250ca448e05e5c854d18b2d830bb138a14f3ffc3c028a314ead4ea4c29b36bd663106644d1eb639ffcde09a4b6e7bbcfe1eb456590bf8b0d281b159f3b7b9136bb970cb09befbbbc73b3b9db6c8b8d9fcffe70e9314adcf0cc7375e7fe39c9511e765f76a1a135597e40deefd497545c2ff02fa67e7bdacabdcb28993076"}, - {"0000000000000000000000000000000000000000000000000000000000000000", "00e2c7fe1061b7f178f350b8d90bdb60abc07d536905dc54ccfa51e706a7fe86e12edeb4e6f6769df1af08707f38fbcdfaff3e05a3b82ecb90f644b3987a3e154058b246230969647ff70ed07c0f2a22525e601601262c739847572799b4515cd64eecd5c3aada731207eb27e614bb9fe3e26bb230ca3833709e12ca897c30b45d8ae9655affac272506cabc483989d1d52dc038304eb4a0ad528fbfe0f3e896fc27d288d1392d2d05b34b4c18f6b1d7d69931249eac488ef8b6bd7aa017be992e40081697401ce269fb6376c4d6a61ea9f215fb8e9b999e458d000994cfb1aef532217297d49e1f80bd9ead8ac8c5bc11e24f8d1698e59a463a4fb917476a0fa4da409b2ae0b63dcf748f39d345d6f3572c998792c4ad81e7d9adb303724931f51419983bed2c3a5be1266b0f338c77a347bc7497a37eecddc743568133ca8f2b8c279f8e969b374d046ad8a27d591f01a4236e89c99d03099e942de353e9956b5b6e08cf1bf9bd493b9d65bfe1f92421a534096a4ee73d508c08423714f5dd6cdd3709323d9731bf09361fcda7da16da3e1a8248265bb23d91e2db962747af2dbf7e8f0a754d4111094da3d18105329a5a6de582ceb8a1610fd6a5385dc856b8793cd31622202d92b5cf16277d0cc903af4a90978aaf0071c9ec90de492f76b324b82e8ae9a9035ccd7159dc52f86afe612d7cdb5a9120022d89750a87268e58af74104a4485958a16711264097a78697a51b09386b5f245cfd823a1e48cf5f8c316c55529b149d067c769a5f51f7a7b7f98951fffe039a8a244e714d10ef53973ba79f3464565ab1b7faa07e26463436416472d30b55204670da21c3e1e80e42220de7015cc841d70728308b3a70c6ed090bcd4370eb55509df168c82f866176ec2fb714e2707992f660fe2922bc85a96530132e1c6892f54c5265beda91b0678570fbf2d3345b74c885f825cdf5e84c316ec580d19df86f5a44897721261a198b6614ac8b9dfe2b40da60438816392979e885164d6bdc4e8e79af35bfe2986bf457ca28661af2d97bc2d7315e65dd054c6f706d4e7b43c54944706f9d4eea3c3fed24f959971b12391f53f134930e72993952e867f13022e8ff7827b0b8466eba72955415af9e3aca93bc1c14fe5f583bd411a6a73261a33f4fa04b9646a78433f05ee38fd250f2bc09998a902cdb673a1aee464d0a20093d342bc1fdf31f413e15bf1a77ee3313a71da3d318e58bccb1c62c749b9277095607ba313c6e78a539619bd47ae7149e79c76e3f4c7d621d77d5d5168ea4c049f596217a870eec1a67f9b81bb32db3f7870db2fcdba023922f5d207d7108f178579630936cd4b5cf4f5f7a5cd1c55bf5bfa9895ed5096f23f76f6d9b49d8e08cf03269b7d19885ed675031d64bc54a8e9d9dbf9f2e42806d873971765cdafdf0523f412d66c512184d11ccc1b4d641f4620e99793c0922c7ec04ff145703e2da11f0cbe678f2cf41fa72387dd96f83b571e01fa0a171f228d260e96de1993e2f38e79bad98b55527d46810ffe28c2972052218b46b3e69b64c1d668ae14c7f74f53f5057a31fe2fb26f5905737c2986783d951da2202bc5fdee0c8e506a101792b4636e4a225dd1db296893ec97a25b95a934bb7694f86d438a956e5585c10895df6e5a87c53d076b781d37518d6e2d48d9c714127fde7b51762f39c4b072e6c6ab65c68da517e7aa1042af1e1512e1295c2c41f2e12666a54f7e78d9981531ae3c008b837176a981e5082b8e892caa8c19b1094df28e2f29acb57557a148d58e1a112583d1662214fae495718c7cd68be61983b24c516ac84e5675590e3aa6e4a00ae051db0f0451b4df72068b1a57ee981d218f23560c4f134d9897454442e1b22838174c18"}, - {"0000000000000000000000000000000000000000000000000000000000000011", "006616e6a1d5bcacf7266376c0756409a413db8a26254176dfae99939bee7dc8012471aefacc44fd7ddc0d66fef36b31faebc9b901289d23f902ce31d733cb338a86c4a911015b8bf32a11206ac002b5e6b7f7760b18043e9ca6743988d981451970232583db1079ad37e30b9fff93e36cb1b9375cacbfa9225e8d336d160eac9e6f1cfbc837ee6ec2ed3d341e23a20d3e8d162e6acde0af9c7d337f0773a72851099d2224f7dc9502ada91be5c464f239e220a69575ebf167d4bfc1941d14f2645b6dceeb904df452124714993c31b0b1270b579ad91d067e3194ae5594d25836497017fbb1df5e8d543592694855bc7af80c6a7db347b9f71ed25a216dc781dab17603931fe3a582712e9534ddee3bc82be167efa0cebcd39e64432edbc7f031a2401ca12530d0c616aa1a054b90b473aded5199a17b17cd3b983f9e6f950ee1314b0b166a52306a240afcf9bf662500ed7411c445f285e323a76eeac338eac2b85fa7dc119b540c2cc4998bbee171a0fc2507e8d4dc289d25061a5123b8787adbc51043a837cef9190784eac3e50a9dfcbc47cdde8156a4b3960a35cbd64928f4413606613f5821143f4b4622824a29a6f9051f74b9a2510e0ef0cf5d272fb7eba5c17f7fd44addc31ad00797557ec5cae59c9513488d368c4ff3ffadca0b7c1c675fb9a7783bf371bfc8bdab9c6c664e76e9d098da6e030d0103610c514664c0519be21a41e22c5833c42c0f3f807ae2c845667d41541db83988ceae7fdcc80806779214f37750b3eedcf26f7a3113c0c076148fed1814393337dc93d122e07298722e21bd209a5c3e58174979b60296d5033b5e4358f8fe625be6717f78773049e3c91d8c1f64fb9515c26750e662c88c3b21f423624ca0fd5f510dc99e22432be6abb8cfd9358fab296a168f2131b631d5f66366a768f802bb9c78ce9805e6d03d53a5dea9aac7b549c4c843f1f27f15f8aa41c2fbe4116d378dde7c44ba0afcf86566933f2b1c153975f6e5df1db9829b625f79a6a9d4b9bf16b17c3b228e4f8f1d8b9bd299c3eedbb925623cc2d3ecb70ad7f06a538358e4a57d210a824fabcda5cbf70e593bbcda6432991861ab97a817cc6280da3d805c7d4f106430f11c4f312333a2a4b260508ea1e1a414172b26c59deb25cb8f78b4728411eac5675eb427bd8065088f350f8922ee8b58525357f0edb768e17a5e26f8116a7610ee925cd7e9c8e401e5f6d3c1223cf4f022175b30bc1c4655efb57a025ffaf1c892ba6d97288b32ab91f98f4d64027fdc08954ff13fcebde516467c2f5fff9ccaa87975ecae53e2384348ed21bf72aca731cbac1134a2bff9193fc50cb8cbb407aa707e25f4372227bb18a5cff5567e83b92ed0af4dcd76d692af42040c848fe422f78b93154f4e68333a9a299dc7a80668ec7f3a15030bfe5ae2355e353ccb8825df549624de16cb3215345b1f58bab9656fc4cb1b8cfb04152459c6ef196aaa5fb10ef2fbd071f6fe9d6f9559c93385e65467a3e11bb438963922718c7770759ca73910b366be8ec5531b6be03220d0756d1ae4b15c84d614362f464885d865c65b42c7ef4b1ded76f71920962bb4bb5623b99f91cf8442ca0072d64d1c1899301d38ca0e4b68564b779832540e76b87c39091a9f8c23104832dc542a19398f3b74fa1de81e16234934f9a2775407062222eae759c0f8796bc8d536e91dbcff9a233e9bef769fb7f781b042ed99ce8095a1d7983af1300d169e55a47fd72f6c6572c27365fa008959ce771cd58539338a990fcac4e53dabec96b67e37b461892292e4a7184d851135ad96b525f59f31e691964a5e301eab1ededc3395a3ad641647496997664e5ba3333c7ffe187cae05d582254567d3f2bd7a8b20b50d98"}, - {"000000000000000000000000000000000000000000000000000000000000000a", "005b361cf8b5f463b974a2a4a5b1ce45979cade54809009e3bebd96790cff583a0be6d1a29dc0896141b01bebfaaafc3daf19ab586c9bb6da859e06f4f32490bac092fd02d83f9c8a6c28d0ee83dae63681cc1640af99c77f80e661478fce231bee06f563277f68a4f4dae033bd71b591168749931f17d169ec7cb5b578f0db6cbb9251e7d932e4e66b86171e8c265467e407a39122d0fe5928cc2df0d13b138f346ef46e27b45e101737d2abaa8aca9ceadb8997f748e2aa21276547b2c4ecbd26731d5c1c659c56387d282995afbdd769e10082d1bba161520b224827748e19f759350ddb3a33c396ef8b10fb8f3eb4763cacec11155a25d1744090179cd5c5f8f71572a8fc53680334a71ef9cd008af01abf8c82717b7d8ce49d7bc7b44b3aa4cb61bd69f1d507d640de0ce855e8dc5ad77b3715a3d0d3d867291904f32cca77a4be45e49f6ca582ec3757e1f8da302bb41081a23c8a7b1d1e0bf46274548edf7eb6731119b492d5cd2f375625be160e3bb5c2a2d65b8afe813956657e5c5044579a804c04b2ebecf53287d23ed255e376627defc5f026d744fc5c4b629b75f375c3b095cf2afbacbb785fb5ed4e619df5f2192a9d7b9fe1bfbddd89d5b750b4a8312493e406249474535ac1d0a9ff174b3430a0f93112110df9b12765ab4ba20740f15670e22ecaa09f43983935c691ea62e6c5929170b088215c8b9dfd1f018636211c6b60d64441bff7a0c0847e4f950b5298867343deb37d1995711b3ec190d4e5dbe5eece11fcb3e71ae86df7d89ad6d6f4f0225dd235ee7f37441f8e1338cf6f3f0b50eeb5028c712b92f605b21893955c0b256f73180552e4d8cdc4518384fe2fd152dd5af4ea32c90b4e51501c61993eb17b5dd5855b53523f4cf61fc7d5dbab8f48ecb1f2877fbafe0e5b62917f4c97be484f3768efea978925001ddc061d704b874fdb7b149cbd053a47e92a48fa70a0dc8912190adcecadb47d09345887edf8c5d16ac3bcbb4d9ab91227ea2d306afe6fa0052209b7644e963d0b4e9a71a12b76053269bb3f2cb023b073c0c730cbb54c8d2ed178f7303a5b69e76b50dec3e3cd2f54c6eb5a3345c7c118d5617f0666c18965821d7ca2811ad73d99090f96bde2002f7f22c574b6975de93822793a66d7d637deb7866a29a542a7504ba1d6f6d2c0549240d1a47db58736643461132d55e90283a1d552b46d9886f959be8f58135277eedfcd99eddb2db450f075c1ad905b99c2fa5250acf3f11265dc19be90848cbdb3a5b9d034df64f650aad64ad2968856b66890febe6b6b5e4dea940de42609a3e823d12ccc8b71b1eb9de5a7a11540dd215c5c57060edbb6ecb1e8b211d8bf311c551d091dd105b90f9ec1f878dcfffc44336afba29e0db0270ec3d172fa85d10e677b71f426e058a23e2b04388b41e27619c154e00d161665a81eb324eedeae4d5a51f9d72e4427cd7d3d6bcf21dc6200fe7fd11c4862bca61fac273bdcb62bde0e6beb937186eb77c4ee3fedf3657f3dbd168059e7b8d596a9905f824ac9064116d584a60c8921b06c5072d115dae0e49d43118cb1e9d3833815b4d3b20009bb7aa19b316204465cc595c498813f2c5c23bb75ebda33c942937d9b2a35fd4f1e792bae5ee90c1922997d914779908f4f117f961f23fd4861541417feaff66c93fd90c42643315d718071fc943f66394ed30299997d1ac3a0bad46cccb12be33876bb0eaf7d8dc7d51a93c3111325a32e617a744e9aac2b620674667cd9df2d47def17a8ec2599581d7afc8d654b234cb7eecb9577c2b53eb3fa53785aad9d4545173904c4e6be6f79fb2392213decebd2228edb891c16f3d672a3dec9f59865c829a7b601f6a0e15f1c0cd2e32f453cd127b7695851"}, - {"0000000000000000000000000000000000000000000000000000000000000005", "0022f146394db5f384d1e1d214aa93d91c442c585804d2b28c3406ea4cf260d1d191b5473d09dc55df6e02da1d5d58cd14cde4cc0062d5fb0af4f8ef2f4a4b0ddddd98d08cf3d700f8f542284c76e55ea5307ff60b876afd4dcfdbece7040293c549813aed0e795c341b450751a992a95d1b0c624913f633d0b80949efcc14ea7a3f7791bddf6d929168bf238d82758a5a559953b89758369570c11c9ef71c594262edcb6cbf2956019a5f8f9384c615af40d021418422d59f3b9fbcac1d03aadcabd701cace7db76d32cc1e2a414bf807ec02bcaace3fb24a5dadf0a25cf62a6ffd97bfd496b615d201586c8948a18a4585deb0f2af020ade9dce7e03d1f86c0e03c903e4493510e764fe9a0e539ce26523a516995d2d97edc9fa5619ea7569330cb7de3d6a38e5daae5bdffa556701c695f8e7d9e68a1119c5814c66b7232c5eed1bb96c984a84f2948751391f0a11006064d3221a49eb6d72e2fdd9ef0232461e1db0510962358114c302d04657328b29a4b0ad21abffc4dd0344876bc0aa3011a9f403c91f22766195481d5cdb4f57235ff5297bbdc921061facd011a6212f7b2aa302c6cd3074156bd1e3789047ee10f4561cd578a5c91178d2af6a19666bb634d3dfbb21d80995eedb65b6239f66f662d10fe3aac4c2b3824532b0adb45d7459682f63a2d8af408dc5e5e820aa62dfa673b8f85f7018e64c3eb8caddebe60015df7b443cfee6c25b8eea55b784a8fa99333d6cc8d911626d539b24f03e333e246dec56d89c0b178345456931682289f710cff8a934b50a90e66b77798afa47697fe72419ec975799471e97e2745a170f3ae52e865c31e6fe372f20ba0e481eae33fc3337a2b1d74974d446f62ae58c951606a631a061e05e23995d22eea4d0e33d5f95fdbeb5d02737cba3aaa5a39173a0d0c594c17294c604827bab3b01c0a88d7896b37ad7f7009af95bdb51a168d399961d7306b3704be0d5d2848818017254aa1101919ede040f7cc71614721dc650654938753e9ef7401a0e9323857cc05ccfe3a71b7c834d86c3f5db852c1d618b07f8525dd2abe3edcf0914bb80d349c5e29a9a1e110d8b06f2f5a34c673da3267b3beb764ac30c5e73421e631c3b039b9265674f04ac49611461c27a9fa1631f0be1a01c56a1a0ed10d792b9daf387f32f7fadf307663bb94b18eca198ad70d87d72f341679a37f96a20e043dd991e3e45135323a1bee94c0536b91e0cc509cc54b318d85863784943c42aaed41618bd78b67d1d65d25394cc79e9bc9744ae1a74f4a64cb3f54acc0fc3a452f293ad0ee1445698fe7042bdd1d4d695ce3ba6663e3f16f5611374847260d9be5d8d87ff8d56123143524fcc0588c6f6733ee2fabde35c827ddd0d1b436ac84d8d604e90a4e3bd7260c5a113f2bbf9200507a7e13dc8c4bef4add2394913ce2dc8265b28a10ed09fa4e0897235a9125931a1eef58b6271ffe5ff1d897b921caa16b96eb8e2d6986e1fef53b77de21a523ad4f29521420d42d7e5404c40bc46fbe91947dc08f5cbdf2ab5e563bf2344ac62b56bede2695dde0e208d6697ccc92e1ffae3386468d33aeed0421c16df32f41d886fe1b49b871a45bd44b662a99635cd4fe23c40060efaa7773db125a3e36529d4016dd379bfec06f360942e8b829b7b2180e9209d61e57f0c3f3dcb31b7de105a54bbd7366897bf024f9c2e3c239db74b0d27df4d65de6863c12754edd27bf111e6f51eb6e91542c0d26825f1bb9d89f231089e7d3ed742994f5512ea39cddcd84a77254d3442b8aa587d40d2fae7c8722cdbf3fef757e9d50bf924d766601ee20c7c83f01e9471f03c62fef328dbb7587d44d956bb73b8a4ed59463659d5d8207d37f3f5f50fe0b43ad2bfbc7143"}, - {"0000000000000000000000000000000000000000000000000000000000000011", "0104e0d3b516b6c0c988f3657d7f205755317e4f0a0203dcf96eaa62ef541c3694fa6dc496f0999e6f2f0acd2bd2e00a0d31c184746d225f299977cfcd8f0f35826ee67076ec05e07a23eaa16865d561379158f304fadbfb0f214deb55f782bb52aa1860c6363db0b12dfc35a134d1352d18fc34901fdeeab9987f59586c07a93340a31cb1337cfae3d8966e3c8d8e739908d818b3a5f920ce91b5fe63d8100bdbecda420adfad950238d55d0658e29fd9fc166ff8d4ffc5a629fe448a0e8b2ce9a2c617d471d242a38bda0d06ff3c5da3bf0dd3c36982ed81ebb530942113dca6c6bc89fc7bc7145a14a239ed7b959571195bdee5598a65d69fe56d1014727100d813e1cfb1a20b011d7c7cfef8486809373a36200b5563c9c9cf84f6b8431236bce4d8492017b3a414e4d191116f7c12c859a9249db55e710dd9470e336e1ed96559e9bf15fe6c7ccd49c60611881301aeffc85d9b2d0556b921015c57975992e5b9f70d337685c54b977fc5a8e6d38de746085a062f3277c610574e19db6f4d1f9ed7d14598efe38ab4f3ba9e7e3ffd64cc1a5c4c93151a075cc4693df24668be8eaa0200667bbc6d98f3e8aef1c05cda133e4f36daec7558e8ef51cf5e4d26f7acb79c9059d4724f7719b8f50771473fda26ee514206982479d2a6525bd714daa5291ca4671adf5fe5598ca75759ed590684b7d6ab420349ede652b03e59fdda80538d41f09ea9a17ed18c05bc1fa85c640b5b8c44306a34e391952a834abe1e0b0c4f485c130e8edb86f10b4c61c32d72fe1f1cd931185c8f0adf00f59641345bea59b6b3d6723febaa1f17e1b26dc963fb6a7d964ef9b2c9f22d5074364d3505ddf7a090d9e731722386d421a8e90b42efd36c20c08b93087173edc691c3273e56ef39a1cebdc4913b6eb7234511c2e1dd3da535ee4cc6be8fad5e9385022790a55413a9edc3be95954e788126c4ccdb34740d542d512d4c318536fe03eda3db68dd18f6a91f3e0d59e122ac43dd6f18a171bf3a5a7350f10fd89ed037b04c31b0a69a63b62c95a71668f379c2c8b947220302d9d1fec171f1fca133bb66b3b6f14f3cd8151016bd216719c640a3230fb2c804a6193797d87f6db61f18bc02809aea11549a7502484110760ef19ed864287aece827d8f0c79d8aa8394a4dfc6e2cac7a10af03bd0fbd08c6a2f313069086aa0d8741252133a0671dc5d57c68df10292b0612c7be34d10a02ead97dc1185ed2752d616a092eb8834c64f7348db15cb58edb3b8c536890163304fdb404284e3a4839610ed4bc9e03eb42719dd167b5e9751446382883a5395d1dc6c8103744ee2ace050880dfd367549e8f3e16acdcc6ed197132e387474452dfb392765ccd58db39593d4f6e1e89ee2caf2999575f033209a4cc3654fea931df370280eccb8b50e436f2713029e96b848d3931508406479c4da0176dc6859ee4651a8bef3bade13250bea40e858adc2c0ec8f730b866784147e32aaf2c59d55a13b0f663ec9b71f39a06921879a39865cccc5b31440598ebeb39d93abfd7b1856ec0c71689a2418e0bd80ad3679e799023ff28a3e0d364ae835d00864d5b3e109b4762994bbab1af6a66a1a1c8c4aebf737fc2411bc10a56e2c924b55fa897887af3556a7c60f9829504d618c5081621bdd903c2cd96cee78149661b97420ef56169a8ea35958cf58642e5ea098e16dc18f89c0ceea46536cb825fce6331d3245f40889c67ea31c540de6d5ce72fd41d9017f52fcbf1744273a7d590e3154396145850326da12e71a66763e816a6093e8d07184e9b13ea6a34f19ca5f279d8d4c77235d4f8c12924553a01da2d9e49a1e4f2fb4c4ffe7a1fb237db6f2f1fdee538d9bc6d1a0624aa8c5868e215357bf344"}, - {"0000000000000000000000000000000000000000000000000000000000000002", "00797c85a6453f92e1fa402a20779258d2d65efe880db894c25496abfdadcb8825b67266e31a941a98930159deca91831ced1446c06a9e3fa1655a55930afd2b0aff18b993c7134339c600bcfd90722de3778c5c0ab28b2284691c235c83a18f1c4f16511f76cac90312ec567ba4ccf587b39db296313649555ee7f2ad4a1fa6aea6eda2d4fdb567435c3fd28a214abb9c17302a4a0e49190e6d0fcf0ec342d3c1b65d059a6b7c9f04dbfee879e8202f6505a34f48d6ae4ec9437975c92808efec6c560e04c275930b247a7c0d0c57f001c309687ba175897afa88f261bef32aa3b8c738479ede1cbefdd356d84bddaf867235e030969d164409783315a1d23ebcd691eb76cf926bebb0cdf15d8598c973250f5adb17b1adadb16c5266841bbabaacc07710a1285f7b4f100df5fcbf3267f54d5e4de261dd76cad245bd2e689a662edf6c5437311dea16db6fd49f977404b45b630f4e5131b298e4bdd3b03c8ebc31b6c4a61b14aa895f8a5260ab938586afc199059726af149d0eb3fd022899e8d56de0e58ae977b1d212e2feddba1cfaf49e40e15663bb1c931f6ac376be69fcdf68a918f1165952668d57b3c5b3fad2b13b051b58be52d351252782fd2edd358d60561f1d45052b14a55af9292617d7969f0d47db55f51651fce4fefe9515d9d9da2785117c5a64c547bd5f831d6d72d258fe9dd7f4d7052cfa3ce3d21df5d860316dd64947a85e68fbd8e81e6df265b7fa5bf7e1668280e7d76e1e27eb7ef45b16edb698f2cf9717b31b029ffe7c17ba4bbe72749d2fd94ca394f7d213c4ec53956257e8b56a9c572b4f0eb57a5bd0f154e9bc0a25da883b0871c3cb56272c1cb589503acc4014c14964e36bccde5a05c4ba34331639dbe3ecaa4285be8fa4ea97ad1c61d4f974c13d192e42cc0acf9ced709be4e960e86515b00eff110c009d04fb9264ea1badd555b8e74cd1818dcd12d1ca4f2432d12ff33537d718b6f68ecc4da9c600da6bee02298f63dea160d3f7ff853336ae5699fff1dd6fdd02b9a8f7d3446981d6f3d7b698ce41b64e17740b5f040fb10827179c3bea66972fac63371221e9799f9731321d8ec773b451c356dc175decfd1b594b5d8cbc06ed9d9996c676317653f1bbcd173c24ec29f93d4843063290e41265a754fe845592a967eec724da9af7098239dbdc51c6d0992363d71f4780cb07d179e6521e6137836df33fd7ae8953dba1f6f14123a5caf0023b86fc742cd78261d9b6a51370f44d16979adec6c0766d37994eeb4bed9bebd7d111706b620bb6596d7d0fe78115741adc9be47dc105776d4d498aaed8157f1003bb36b1988cecdc69617284d1f4350dfbecb6be1f792fc67f0bb2bec9b32593e4d4e4057b2e36968e1f8e5441fedcf60d655c8b381d7cecaf275b7cf90b00d1ef171003747526967436aaa641ae5fcf3c3a7d1a2cfd5e79b3ce4dcd77752abcee3c3a94a63e505702a035ca34c59c5faaa009854ce6cf02b9041f060b1539e232086c0e13f1f81ae74bee8e53453cded97017cca27c3195d44afefd64a93cd8e7cfc022de57fc1c27e4c6c6d97e94d77e225b222b8d3d40117c057c3b6e1d5991d744614e6ae4ce0a28ee4981bb0d65f35afc1d2c70eda6bdde4178c79f74e3bb1f5c1d1ed201344aba12823570447a67bd27d05bf2598c99094f214ccd2f721cb997de63e291581e3806dfc0f72eeb0dee2b15918b5e5bd9c5b1a934fb9e738a2d3f934822549b17ed9b7534e2fad4465d6d0f317efc3892d50fba1b7953e67f9fffbe81a833e8581e4e83b9c0bc2d5934a563a41b93e103a6503ee28ae218eb92df81340b5eb951ceccb2dfc5e447b82317aa55a23c10433f0fa678fa9224594a797921295004cedfde9deedb"}, - {"0000000000000000000000000000000000000000000000000000000000000000", "00636f071e6200d73e35b1527726f97898b10d6257189354420dcdb48674e0655842e6628d7f419bfeb9026c9d2a6a6ed9f5fdc656deaa586e831a781d432f4e9252e5a7541bdeb6ebb52b6fdf226562847f06d90fca0bda40c65c8c7100d1b9bb25ae588cd0dfe365467ffd1b291bc489111b47b5d0f9fb2a2e5e92312f1fba25f04b500f4b697373722e2011c4e700d59cfe247f32f3dd8c00a54d83c2e45b5ca97b36ac9a658c052a932cfa0972245a6e13b815ed5ad78c25bf9edb2d82fa89eda06aabba6432ee4b54155a79e05f8b51104b0eddfe612a193aa36423b7cf122d9d6690250441740d2cf619e2b6f266456c1332d64a11bc793f23065c449b27929b3a993b21521f0ecf42859fd7a2f80caa2f01180d8becf62bc1827b43225082b753891108acd20ffe1b8abd4aa101f5ac2861495da2b157371f9035eacacb1548fb2e22cef8bd0044edd3bc46e000b82e0baf5cf6e98f9ee1d7c83d94bca785a6caa30109dfe8874166198a0f578289da9a7e98221dd0bf0f618d6c4a19a609ed2214551b34bb21d0138f78894b022ec29a5db23b3354e5fac2eacf5181857e288502e10948f203f8459f2d643e8b6b2a013d1b71defa1b24f5dac7dc6adef3ef6837856adb0627361a7944250c57b64cf063dfadab455739bd279a260e92c7033a024d7a148f2a1ecef00551e6f3dee1cdbacee8e20ab7214fdcce98f3c1fb32365dfff2189b8b2cf1415618ffb11db1059dcc2085d6cdd0a5838e03ffb0cd2b493c11ae6080db8c57e3bfc662594f01f4183ff94284df84199894bb6587142934f34526d3b3b785940fb83ebe23451095206fc1161d613ec060e6e67b9f5362cf0e7d9a247db24a9a8e7cfb8933004df99ccd16ca6697e46ae6ff910b12e786c165dee4349b4d1f5804e32d1370e17bf72a06084dd360d29919ba7b3500a0533a9d40cf63ba2679c5b2f4c67271a75a407121d454dde210f636ce7304583fb76f9642917c0cb00b9644fc7587e5a6e748e9beb070079aac7b7d056449b5b7a48dd8789b0f65f83c4b56a90e294c5519e301b76e8aa3c52d32e85d32542cf9684d0aa68e957337d919c32b927b7ff6b7f4beb8445c79dff0729afd0b20b34e3a563bd56e1fd28af07afb3d7c7aad3bb815ddcb0bb1ac1bf9fee1b78bd96669875baa9ecc0909734d3bee4726a50b0a58417ed0bbd627dcff4908247f793e88c95079f69d231383d943ad66c693ddc728f21f3ed0b7aa3be779934ee03bbdc553903a34e73a324fa5b19040e583a076e655481a05c6d27b87a21c45d7262fc90579a24fd274deeb7466cf95ba21941f3766af6e5c5ae70d0e355f31aca2ff561b7e3d013ce9eec4c256ebbb5d3f157147c1f8a1ffdcfc7d304112a52540d18f155511456d57d897db98109e3aa801623268cf80a34a1c11e31f7c3489e11093c93dd813243aefc0cf39791bc0338a9a589581e132b03d7516fd1ba7fa47fdd55995a40563c541db3da1de4868206d1c02309b299d95deb40f257148aeb9adfcf0070cc5b5497e94a55ee3ef81c28ce75245a2d879ec8527c742e7fa9774179f7076637ad34faeeeeb9d13101e0c4773a29044e139e77340bbb0d0a9c53b131b6159409797c81a509b3d9b074357f74ec5e746f0075d0369ac9d2b1ab0aaf3a0fa7eb26e579729a77f197c159cc46555a51a894baa35f342bccda1ca669d4c3d1114b18f7c87949902c491fd923ede7cce3a2d8715183d8c5e82d3bb80d82bf383386e08690f418985fb08e3b0b6fb997eb19c4e730b4742e08926cf72e2552088ea380bd19e4d0aa584d4a3c5825590fe1ef46b14fdbc6dad5faf3506f8b2af40a99955835791a1d524620f816aa6b1335ed31aadf969b33aeaffffa26d"}, - {"0000000000000000000000000000000000000000000000000000000000000016", "00fcb2dba9d57edabec26863ed7624f636039b8e9902bf11ba6d44a4a179466660cec007067c5f9e7bcc08323c67f0874d23464701efe3b093c8d3595b3f4d10cf7a0090ad92ef86a7628562e6087cc45b76c28911767a04724f49449064d2f9297814d5939f3a14bf1c54d4a514a6ce33fdc724b0c353da5a858b5465f711fa99900e5c55bb4fa552e097449654e8ddec039b19cf8113630deea917e2929dcfd235de683514ea57016249f0a385321a715cf3a8675093bd8f0bf4361824e7cd20200f69a728274378c97f947ce5b46d5095054e9a1c9e9d94c2f188954c26b046f15ff1f31f6e2510a94c4476ac81f827b25a967dae511786bcca680fa7b39a06982ec38670d2ce597b405cf34c7156443fa3ebb2226412c3ae5fa8deb271c15360441fce961cc5a23bfc0d0b30bda9395addd310a3b4093ec86d2c5b4fed033ac893ed162438e025183646df54b96801f5aa9dd21baf538144b0bfbe2c638e31645274753d44925dd62a66c778b5740e95e7703245f23f71b90a65e5558d45cdf69731a1bea49d96b5c745b513ba1249f3bda1f56485c6e1f13648730ea04f222f166602a1c1ae599b91c36c2052564541eefd6888cf9be82f3567d7e554c8db2b3d0adbfe7d4e1f6f1bdcd0aa083db1f61745ad3bb1406199ec4e8fdce7475f71ee283d7c4b7718f8e32837c8c12dfd9a16d886bbe702029deceae10a806f685a0349d4bb7cc156e84c83f223fdb54313ddf93bd906d47fbafb1ae6f28b3a0c213480eddf14cf6b7d626cb392ec655c3a32b559d29a4248bd0cb6d58b71332c64609b6e42ed202c6a805d0508dab7bc4f4ebf631e0658b1e8cb3e4b7419966b20888d446fa4b043a99325c63ae17387576f3e86ab1569b247211e56311cea43451ef30ac4f88fca1c312617295e928a34aa536b4367915507bd5b34f615c30140dfdb58962f98e634e07618d12b50c115ad0cb5306a0c9b6893295f946073fcd3bf298914dfaeb5df18d67d2b08d81ded1939d3867230bcd5a058125d4922af1b40b80adb1742c342446ef4785157dceebd05021f90e970616f4df320430c37261f6f8ea6fd9f2d2cb67717d856517f97fd231e21ab48ecd427d6e3ed13c2f40802cb57ad419c68b8a36162029d6f3be5c41dc04ed15ad5531fe5de2763856cd7035f739c5aa30c0f01c3f1063474fb9bd0ef63c5b24661be36e4a635fb1a1c5cd1d18b8f7a2a1ddff2184f4a09bfde172a9f4acc99cb9402b15ae2af38c4d7ee958a38e97036031d77fd9e03b19eb533ecca4b62b16ebfee2b3d15c2e49ee14eb8ff252dd5bf09d78696d6933f64ba5a6a25c72f574b8df010164b7dc277959cee5f5c8f1f3a8d06c7f62d05c3d316b704c66f1e04ac3af8ff26bfeee2d3f1cd3be655955ae673d16d5e64d35fd8018ba77c589647e4e29ef2a094979889966f175c4411dd7ef6624e3d8275efe197ea3f9a1887c09334820b9ba7ed39847ef6e55e12a86f1ade426fa9f99f7b1c92d497ca1768a50a76c20a56e02158bd9111194e079dda667de5525992b9634e776d8620eb597ea2bf16217f695e7a6d65f1e5229ed271200516418d0ffe0fbd7d070a0c7481a2e151bb2e688812ee7fd92df419ef5d403ca35e9b4978c1b340d106b1ce883cdae903d2c577fca6a475ca095220ec7beda141f8d599d519173532fe5c5f372073a46bbfb147fd4cfe8e876009f60ee356d12322bbff85acf6e4fd81c84e397a625bcaac189edc70e5004297470b6544e285b936c4670f37267c50089f778587f595d645b62eedb95934f726949b3a0c99e3978f789494a264aef62d37bb29a412682ab627997a12e594839c2cff18d600d497ee04181ebaa5a392c18dee33b44515fe9a254531ecc0f7"}, - {"0000000000000000000000000000000000000000000000000000000000000001", "0012fc78ee83cc1ca1b242538dd180b6be6f1876051d6cb75e27222579640482688038c0d341f51c18ab06f33b41550cc7db9afa3206a66d97d4bb4e580a0b24bb7e20a09a651bfa2e787f7e655bce22f31c322b11af4dbf85f533d1ad8ab71fb165144ae82a1f89f754b713e6146926376ad6c5aba4f2263a39e572e02c21474fdf719892e3a526b2383edcfd06fb405cea3f3342ed31dee49f8dc0f6837fdad7b9520d6a54c04a0126459008e7aaf35be5b0c08840b5be50eade17d129d1cdec27a87011c603e365b75a2b4da1a8b8bc07022a9b510a8ea27f756fb1f2fc66f906589c5a02301b9ea2f103cee42b1e5c422c7bc7c8f09bf7db3a8d0d2bdaf9b28c53826ec3013bf2aa5a416bd51641ff4576bb9a47584bffe60084ae84739a370944f9325112a742d7e134c437ab2f12be8ef9fbad04811068531b4fb46adaad71f99b2125e6c8fe7a35ac0d1e1bb30277efc0d2676c4d9dbab83a2b4eb19f3afa5c5a5e2d75c7dbd98b86e88ea4384320ce72bed3c937119f09138b9473889ca3f83a30c42f9327035ffbfb2b000c7bc9ce5ff3fe71d7cd01a4297dfcf48eb4d6c86d068b2ef16ca27d01633017b0d7e0a986a62cb659d8388461f9df9c44494add23dabc360779480b9513b41101a55c98d186f8d0889493f06be69ebb56b94d7d2977150347939ea6b0b2c4a6bb67c07e139f9bb214053d5ee0139b5baef3a3989b6c55d823168799c2881e54aa61b90a445596a2156763fabb21b46733bda01134a0f4808f45f70bea223faab1f73cfdb66be90328ea4cb0a653eea54778b40e57cc1f01b3f21173ca090c6724dd896a8486b1e0c7a53b3604754c27f9d917a688df3ad6bab78bc9c451a57df1ba7f289a4a0228f12b9ed06287538c6712b85ac5fe2a0741f580f74ae47d9bfde80331821f48e8cde3fa234144ded589011625711d7539a1db046261a0b1ab56ca30375bfd11f7446789effebbc385d395456106ba18a4ff56cb091c6e53de0a83decb98c1ed5c395e6334605a26c74632d685a1519f60a223bd1061f05dd75eaeff480a04f100794f1948ebccf8635d3fedbb816f7139b075123f41362f53ed80a848036fb3b49825eefa1f68741a51f9784ae2d1edc0d443266c77b68343807cab5e27500a6f74d289a6fb5a4507932849a2f9c71f7928021831999cc976f7bc40904db3dd8d1b8b567e4c74265854ed73d9b8917b6e948ba8a72885a77e982b8111492697bdabcfcbd4e3637470fade499711ad84541494dd7790680247b63d02c0ccd10d7d0a7a098d5806bccd14b24e6b079455e9549ee503573cecbf875e268d699d7dddca55a51f3404d032339f2938fef2480b5c430d67912f7b61506119c4a3a8785874db1ab20b88dbebc8963590f44cb55b0738f68aa0507664fd039ebb436ced37339ef97068e64e2e916471f2558c2894a613a0363f39f5d23375c9d64b3d4ac4abe7a008e3c967c4e0edc57704f23846d97a2da55bd4b1431a9362f43d079019877e5317dcf3a9c9b38f19b96b08cb61a721c344b0d1b99769f0405faa65c05657e6099a24c04f92b2559777e0afb712e56c9abb5131f80cd096ec6d857e5f96f7937604738576df757bd0153a852e81a220c45d312415ccf6f7332b7f649f54340db24404dbe0978376d943806fa19901f3ed757c0524ab297f034d8c92a423430223212b7e97167e0d8e1cc725a2729ae7878641e2eb3a654c951dab56f504265efda3f4506ea0a479a2f0507194c3080e9d6de2201df7c791ce0653215f6509ac73f6f54a4993cd3953b17f03092f0f31fd5d565863d56c75fce11f980b2d507d0f105145298421b35038f3a7f26205dcf8e84e369650e2ae0bdbb63d9513f95b479ad443dbefbf"}, - {"0000000000000000000000000000000000000000000000000000000000000006", "0011b44e35cb3f97b9c14011292b7800e1fbdbb3cd27d3f1fecd2830efec69b6ce56c5a01dd71897b1cb0374a5370d8b9c37daed26ed35530de646759dfadb14f39f01fb91cf2529f168142df32d1692a7f5fdf506dba5b332d449d7fdf66119870aaa91a714f6b9b312801cc687924eed7b610452c7ed3899b346399dd10b4586554a5ec81f6cf614967b6ed545549c1c0f0c2113e2707592e99fe68cf45e79608356bbd797fc1503d5c282a205fb5580e671b2b65d110e29f9b6998309de75ca9b62afa1906811c6b37dc62a09dad9505125041b8b1de2d8719c3ecbc5dbdef29750acbd383a2d03ac4c06533d6da0391bb2b17fb22308fe1e0b091484df548d1c0a65ae3b370668eaa47262fd1f83742d628fdea88f8ba2c69bb54375c77d6e494aff9af31ab3db3d6b4a10bdeb723478bef6ac3d7233acfd632f14ca13e272690f9951b42dbdf4004d6cc3710431028083c68335ef33c53341a61a1d2df494494a4c7b53d88c1d43772a79d5464797fe44ed7ae7349b2e700cd4f45aebe5966f67d2f2941f5c6896125977871312496a5dfd15accf443e8855be6ae54bc6e7bea10c150ae0aafddcd2e6fa8744f3724ce8d9da3411feb85d820e69be1ed147297427bac3f6c1e388e0bd0b26219b85d7260e57b10b8533c91bba5389896bb6e169356481ad8e2c2a4df263b4d383c3355a9d77ff91ee0b0a7c5f53d11b2f0fc010c45c7764e29aaa3742711dd9ca56e01208baaa90b37ccf6639d5d3797d76c727623a9b4e299e337d17460e7ad4f00ae09c379c272a9a5c483455182ec69c8391d0bff5de3f2518b6912314f556cd5ae407e3c884117bba07992a566c7ebf23f946b5f3dee6ade26d177661dca199e8219f5a8d2318ad3d74922d0513abc28861ba9879db5b557f12503fb45446b54303ab26d8c15eef2522928f3de57900613be7f461444bcef204aff064d13b37265b187f091bf5d1348837bbe2ef90b4590b17beab53bde44212ebbcccc32b7ab9d776e1e4963d6aa8d1c2de9c811fd854da01c90133a36585604b739a81ca5e11bc820aa79d7c4089a10721ee146b2c5d6de63f1b33e98a0be52b0258992c117743d21461c5c63d57f6978d7c26a3fb4e177639d5f8b905eb69dce7365d5dbdfb293e304a513e132770b4893452b16be00d782372c6960695e23ec9940249b157547a88eae9a968da8f6e641021d7240ca7f0658720558fbdf8047f21bede849914358ab1fc98bd652e72d24e3ba6d4a9f6f31b3ebc165e1c06d2d190e91449e1cd07caa524901432bccf082ca5a8799843df931e8142ccfbdd1a4ac035c8db0abc4402b450035d6c0130ce5a179124835f0f50f31bb4ce4713983e615e03c9a2f06d439f7f865da27d2224de430627184b81c9e3621d496ee8e23fb61b1900aea25beb604267273b60de979ae912b88df7b36d0e958b9b0d668e619590069488662eca9b46f5b70813bdbd8600cf5ed2c59bd1a9773248e5b2e290c7d43653ee07adde6e394fafd6bf19e1dfaec89d5b7b140a25ca40ef83ecb57244158704c35eb96f441993cb0d5cbc4e884b23665b602793abdd065e3fd8bb7ead29faf4fcc1d6631da3e243600f5a59c6210ab1e444569b73f2431d39bda0f1374a3d77aad5fcaf7613c604b594a556638c4767d21305b0bd93e4ecb7dee53f1048222d67ae93cfcbf949201add64efa2ce3ec20d1662646fcebbd4d7f4d5839fa73ca9adf1a693dfce61d1bc694e62a853645796caba637a0e45ea9d5b9407485068c3e92843f06a3249e4bc4e6a9445df92e612db8fde7a0d5bcffa164159a72687fa5f47fcd7f80bba8b949b8d3fd5cb0d32447daf7e39db7676db7220e0a9335256cb5b32f9e2c3a1c805f55910106a50"}, - {"000000000000000000000000000000000000000000000000000000000000000a", "0053af35becc04a3158b10741e4fac711379d2aacf07082d9b0060cdfb23d8454bfb6cde61c3557d4d2d06d0b1fbdc537660b88d74f6be2d9f9f2b38dd808e0dd73cea740ec705df4d25a516aedffa4aced260271063b44ad404fd319df7d4b89373e779fd0dd88e8b1bbb391e8efa6d4df70ab2a9dbd9faa25fa738817319ed5414104fe031f3aae32bb0f437ad55ee3e26cc1d7f0c8eac4cbd25b440374cab3f0606fc2abfc4b801890ef1da68fa85ef41250ce7c262b25bad546d1c50e463f310945ad76e9ab8deb46ae4da60651dd2b51828e976acde8063195fc65767b541c63d727e5900356d97c63ba40ee9fd22166d7f34441a336551a54d0d4d4a8700ed1b77b285237f6a273de187335174db559883ae88ed2b23820335fdadc5315efae73c71542036ed2cc05adfb9641d52bc639e748caf658c0b953910d449d01723dd2ca7346ceb3f9de1d8b7ef2da800cef899eb2a69df537512c9f9673e31c21213c75f19f27d5d7108c293f2c264ea87bec9efc5027edb62119e96b7f78ef9936721348fbdc237a78931df176c4323cabfac715c97b53c24ffb8b6bd635c3dbe19f90540acce94ce8306c9a2160c88e56859f4fc7f146c104872a55b240ecff9b5277c37d9029e2e86b845750d72f8c11f455a52f997f1da0a6d27f67d789da23d105b3e61449db1df268121d9ad154f0ca0aef52ab506ff1ccb70d3486b5210e30d48cd65bdba817e3bac27501a08c6134c2d652ffa1d36ffe23efa023bb5c609f6e58b0e312b89fd8bc2a43db8f3f209c21cf9731301d2e41a9e04999ea541b261fea06704da9e57ae0c63456f7ba1dae5b77ff30a702ff48a7ff058fc2b0d37bba9970a91ad617413725c5df3ad8b3fd557c40dff8f2277a51e7d71bd1a78536df3eeae64fd641b114604bb955d67c599a405d170417bafca135ff21f028748fcf8430b8676edfa1512d3893edca116f2bf0cb1f764b817d8adc17d10ea081640858a3f7c2c530e2bb519ac4886e1da7580f64ffc577ca710d093800f948c025c9619db5cd592793f6236f6e22e7a88860a339b8fc4e0e7a141766277cd19a44e0224dad7ca160a2e066fc66e52ad1221dcfae6a209d4addf55d5135114822ac76257f47bd7cdd672bbcb61c23eefea14cabc7d3046a3d3d650736b304f434d3ae971d94d062ccc777991ccb2effc576f05e928a9eecc91f5b50bc51bc1ee96d1f2f6b0f261d61a9ad4ba1a95104d2498229ca3269fada15a22e9ba4a65e1b1573313d8293264bebc211d0ffe6c171539caee89f1943c03201111a517ae6aa2c15a20537645e0742a6a75bffc8526422d4be0268f815ae676b1d04e6a6e7277b4f7401539d65cead35a2982c0535f06411b91d71d1603203e5b6c8816ad0fb7eed4ca7ba65532733756ff0eba0476007d6122727b1886b53ce14f86a74fea7df5c823eb3ab70128eccf762453e49727519e8e6b7a281605e0352677cf12550a8ee37aca39178d2d272b258b1fefcac5041a924554c4b2c4245531316a5f3058ac0599a279cc4484392945421e4fc661a2d05cf9cc7240489f260fe85ee148b8757a54d188e1dec75683751232dba2068fdc7bfd6e03693fbfab80e156b602fe80104f595be3cb8564005a97c66bca7763491de1a404c3ba1db486c37865dfb2cae834d7b145d595b91d17d911abf747f964be50567e5379874aae66bbf7801a6e0cf16dd4e2b3183303c9b57fb604f5753969fc1f90e5ddeccb6116a3e1695066f8ffbab962fffd1306003d2f8a8c6e70aac903514fcc8120db50d3ac703021f6c79a93c1c79dbb14acf9c0814960d7978989067ce5b82804d94ff91e028a50a76668d10bddc3c308ef0f10e84b9276b9df89a1b95a176b27893b252c"}, - {"0000000000000000000000000000000000000000000000000000000000000010", "0123f5a689c0936b17d82529aac852c18e61ecb42f02aeb8ac9f87909badee34a55f6b3865706cb8a1f81b3e5a46a7d3ae3ef3ce225d697bd9653c4c126b1f2c35a42dff23ec212c8a67859b473cef1ce83a919309efe3da0b4def450f20363e97652339b5d9ae351f2ad1c42bad14f51afe8a9736e0bed12219b29953d42815aa85f918b02dccced47982c533a9aa59b85e303685a35d15711aa9fa8a6426b0d0396993719146470371fc77554921e9e6b351e5e7bef15cc4b50d3dc1039a4ec0de27d667a768e193c49aae6ef28a588bbb0476e21020f08e33b15e55e5a6e84d6f111dda85e508656f133ac28288ade9f51fe2c321d1f669d9c9270ea7a768f2922c1f070df300f57494e8c56117f667228b336109cb0cbb4c598a8e6bd6e02304fe7848534dd88e79d36468a7ff0888e0737b32f33341f9f5315a2b4bd073ec776bb54518a73d76534af98afb2d740330afb4add5bf2ecdc7049d5bc57e49c00a34785d81c325918ef2ad8ddae02ada7f5ae0ef917f7f060e07beae6ffc51256fe762974cb0cd6521f5253f8c514383d43748a32c45cc9cd496deed1c4a194e9e9f9904cac9d0fdd8a3d3bab901af3eb862c87329b341070d0d7e2c92dfc74f40e3b43ad65eefc96e550c8c820ca37db094073975aa5ec192075e8fe99240bc622b322d123387624a5bb7cbc84158684a2efefefd95e5055d0aff37c792eb6be6c5799165f9ae1619d78a07117178ed8fe83dc994c8817b06bd6615aa9658b7d5073d1049511632cf05faa153f77209f59c7232a12e1db72b37c2a4362157876aa4707e2b0391b53e4b861c5872f37a288707b0ce82d901ac9928d3d6d3f05025be9db4291bcba146e7657ddc60b2ae45aa59118e3eb67f7fb02bafa77908f8c8eee7f21273f096c237592ea3ad975c76c5d69f4713e8d8de2677d0fab4d60167a92aacc1efc493f87485c6b22912a1d01fac7624296d5b06f217bbf29f855dc57cc0999d1eccef0e10bac12a1421891d989044cfcc300cdd53a14aa2ad1a6f513619392cc3d840e273d09bcc7a51fa7d497e1005fc6639947b92cee9321223c030e948458a9b591d2d06cb2dcccd68d1da927706f832e958223cb05230579519af12779fe1b9660cc1409df1ddd28f145172fafe76c5f11f21d425978848f0b07666a119ba1b04460e3ca9ccc67d4d19623b39b906d582f456650f6e2badd467aa9aedc7d707d115f285aaf86b9a88613e9fac0c76ab98ab7aac654da1b124e24234b62417544c05b05e5c4620eaf02559fe7ad86b29fc9a84a01dce1c6bbcdd80bfebccd4202d5fc872db4eb7fbb72d8e922939f768cde9a9e37d09e03372ca7bfbd5652ed2a7f889118e3cdba1536bd7b249f166a578e82949e4b675637a0cbbe444b4ae75d6f2ca5535fe486d019235dee249c7c66be69098ca7e37a4c76bb970a9210d731e8b241ba96b74e2f412ef78f98b411b8b3615a83481f51245f0f241f3690a70e36548d72fe2d31df0b0f549dd43bba3444a6445e66f3b107259618e044b37edcbd19c63b8ba1332c1f6b34a281ddee0c81c7c51c5c8951c30ca4847ec747c8a275250bb38170872b7a514d6c757ddf75225487fb133192fbacea43e20441be8dbf5739a73766b14f7b53dfa309800630575786330dab3f9731960f277fee5e69ab557651726ca9559bce62efba165eaaaf5e8bc1b3e431b5f1f0b4e4dc7c98bc1177ce4e264e04d4525452bf4f2244c16e46cf956a0ed48758a1938eadaca8b1834883309e846fef88387acf7f111a7c2722b5e2ec1bd765c4e9e768c74b14e479f53d60d43445a1996a2fbc5c648cc255b29a3402df7156532dfcfc3ad915cb46c945662be763758f8d546dd5682a3c9b35e0d3f3de4eb"}, - {"0000000000000000000000000000000000000000000000000000000000000008", "025fd8575342fcd0723a72451e217d8bd82cff7c9a1d65b25ff255120370514601914f66d9c093732dd506fba975439be9f953137794f876c8060e7f9fe2ff11cb1abcbdc4f552d5f5f18e91dc5318aeacbff1fa1da6475e8fdb79e575e2d71e31d0fbd9e572dfd6754c93650f48995f9ae3a9f623f0ebad469b37ba4def297102b81fbcf585f634d375d4379f294e93b46b828a7c66d78339df3ff0daeccc84fcad8775f59d5a9f035eea6aa0185c21022171a4fb7d59689c26ebebe3163756958fdd0be9a47f44ee7da9e551bf0d51ad4741cbc385715798379819f6646ff3be5dad474f96a2495f0df451d69ee5d6de95c86d37558df142b1a89607b211c2889c79f56e0a3123eee678c24251d3c3e72fa8671d29a3460b67e9550f816a5339746090be3d10d64dbeca8d0350f681f3660d33adf9a4a17c17b1223d3f33a9af1bab8e62859b68df42ba45c777785106250a112925bd4d67bd210d62d3271897151d507620dd39fe28a02e2dd9fd6a8aacfdb613224fbf99fe0e1465b997c4866b3def3614266ec3cad50438c33f231227acd9116a41e84ae32818bfb7918ada96ef4d0794c943d1b6bbf7c233c4f0c0d1f14da02d3370b80eb8edc94b213b57b90fb62e4df9390a3fef1654b30adb2064ec0553ff908d15bf55aeec55a4481fac120daa4bb296d8a8f4cd5294b4f6f654e1327d4dfef411905ce838f5451fe6cb835af8b36702310b77aa371bdaec6ba18c47a9bd06e2f86422ba3129b7b378022681355f2e18d452d8f6d6c655622e6a036ff867eb35676dba0827cba3a12f84c9fee3e1bd76dcdf3aaf149445d9d6a695357c51d1c74bb2be3aa733b736892801a60aa891a1959f2ca32ea976c49dae3bb8e7a9222454e5f10c363097969823f05bdc32156339cc0e533cabd3f2598deafb65b5a0bb4b810d6e534e198d026dcb3d19653b85c6f0333ba5c60ea9a2d018ee2923ab249fb248f273adea824416967db9a27a1fba37139004f7e9343123e8c675ff5bef5e761a3d1fe34216105d443d77af03c9e9a45d6e2f9ad9e5d01a33fb0e563ff4edea086f5d9b833b0622556a170776bcb30fd084f83c0b4029ae0042d7d4dd97a15c26f0c87225e15ac2a1ce6fcf5554a33a76a19df914a93a50bb280862962390fd6f9b974641145cb571ee9a9d11e60303dddf234468f2cc0330705dfe83949e5877fbbd2599c4580e11e7735766c58f6c31c0c5c0bfcfb97b1bd411adac13d273cae8977837f0f9fe08e4b9e417448fbac8ec287c91b2f5e49540798ac71feabef0680409cdc2ffd3ddc1180c5473582f227a31095bd7521b1a23a02221da6151fe63aa6ef1db8aebcb3f39c713ac3b3145a9b453ed4643016c41d97d62bc5fdcb831878cf9048f22bddabe955335ce656253a57e3c5302fc09b4294c23b2e3b976e517d2127a60b216bedb1c8a2bddef999abfa8e567d8c548743789467cccb5139931011589085ad86c732db0ddcb2ac9865a298b29d767380eac0e9d8f9467e683e35eaaebbd5bb6a4100d1c80990e16a569c98a28b2f4f79ea9465e7868216a064ca0cd3ce2feecf59365f208019aed966bb0120ea1ec69da936355a0b41bc921fcddca89bd7cbe1df53fc11a34a681d8c78364b7a4dd17bb9afdf157052ebeb5b19caf09f4a7c229f2328579fe4c5ddba7060899a5d20461378e69c3f158a7eeb1f559982b210b4d159dacd2ae8b339b1107077a202f4e4afb975024f25423c48b253b9f2944a13077f31eb3055eadd1090ec6eedd270a8565f840f614c5c00370d9df5d6a238c3abb5d318e7faf59cb04c77110d70dfd1f904119a84b0d6f569b43cc5d357e27568d961fce9f0f6b416bafb5ddf7198dbb52b5fd6d452e5b32301d8c94"}, - {"0000000000000000000000000000000000000000000000000000000000000002", "0028c4f6e25770aefeff15fccbd86d162214d7ce5d0fa22211ac1459abf98f549c13b5e0cdaf2072c57f0c8c522446d50bf2dd5c7393a3312b4dcda17102a710788fd7b68e1bd3d03bd1740811432d390aed26c7024ef106494443dea204207a8ddf3da2b95e5b500d2c6fdbc4de131fe6ba0d1458d8a3fb091e33d56b2605cd068e89969f8d7cf1230ba4a14d33a813bf30e8392ec1eee16d9a5f9c7b940a7c2794a55df23fd0160164cfd08b23416184fd10f16e8c2554ea8e575d082b8d01d8a65d1ce338fb62f00fcf8605716951ac8714f4231671a0865f16be5350a1425d4aa4bb7d63b91f63853982195b95add9c2e0b0d5c3a1b503b4d631086898c5964c4cbeacbf437b96c528f28031dbf43c266b0a2f291e233f5692257cdc7acbc63bcedd944f08793f56ffa577d7e5d56100f02ba67127c3b034b914540c83c7d1fc6952dfe208edf22b4555241d62a6026b9a6ff4a28cfb7cdde316ae7f1e8a07e755be530cd09e12c2da94b942b04809fff4b137cfe43f55450336d545dc482310f94ba5be0cccca62e109bbb64653752e85b72226e342efc6c5457d0daed48b1ac8c90c3520e871e0ee6f21e2028501c99d05c66cbaa7101c56c172779c244b9d8801de703805ce24fdf226f90f608906f0cf146d595eb25961f70579abecd8ccca14dfb7c7d5636151b65c888fd04c7fc63d1d585449050da9eb04cd6d576a08446800a76cd5fb8dddba5405aedc5993c808005231f0e06d24234d178efb44540f9bb2cbdc46e83895de33936e69b65283fdbac292165dde10c0c7c08fe1909519d038572b95a7fccd9f266e794fb2db359fbdbfc51567eafb019dab2f90132f3107a8130c75d9a915f58ba84acb5980c4b86f7c2c164e9a4e90cfe1654d833f48a933ed0405e9a7096dd2b440d965a44760f0f89a2270e0cf48915e84e200df3f72932dc065c01421516b7d079ae1889f3cbc2294a748fc8f102cd50ee4922dc0921ad0b59aaac1066d7df6c118f3192255c6564f3af97f9dbe1f3b8c44e194c317e8d6c5aee379c2a4fd5d66f6753eec510506a8d62382c49cb1b6e084b2468611decb78995048ccdf6f032737d365e906b40d55a795b55d3e4bc80f4b8bfb355bd8290d3fe5a8c37a58d6d5387a532426529a4a8bdcd6e7e164a553cd55ca65a26db87daa041352bb9a8ece633f8a7269c646235dce6675aaa51657fea6d30dca4bd84a31f3597f337c91aa92639b06bda7aebd0f3a2b5a60435d7b76611ef2b9f7bbf3288a43952e10fd71a093032dba5562b9231a8fee6706f4ebe0bd4dcfd93209e4c47e31c242399df1cea945ae13c8e09f195d75d89a08dbf538275e969b7ca50d159c5afe0e6cf18a208108f431a52861bf27e92c47c71585cca055db551aa4dd3b481945d97abebbe7027a15623f49ea4d4c5e72051426e5a95d677899fb02847294ba4216c2ce27f1acd5e072ecd1e28ca4e413341bd962d32c93a3d7642c3e57e082f06d7f85c6656f8466365dd1e1644a28c0b0ce5dca4bacf72cb80bc396a5fda23cd1815fc1a9192c49ad5d42de6e910dba4efd5e25b4334258e701f7d446be14ed541caa24447a5aa3af2df1b7ab429eceb24e67ae009fba32341c94d066f45813df9b89d7136916f337cedcf42606162b471d4add689a9948812e63c50e225e12e344216e3e8f01d154a9c01f64ca25f9796363541f19430a0e05a56406354f58d874bc30c253bda1fd557b0c2f360a3eb12b7843b9a4d42726b35ba915c1565fce0d4702e1b4093b3a9cff738ff8c9decb5146dfeaa334d8c2a81bd025f4a222e551f937c2aed02c7bcce719f8db3a274dab0bac5ab1cf46282749dc62f42a7c25a50f8c3256fe093a3db383baa7d135d8e010f630"}, - {"0000000000000000000000000000000000000000000000000000000000000001", "00c339824aa2f3cf6412d50fd17aeb8714b67f68ac3e2bedfbee629de9b3fe260d65b383f2bef31cf27909b5a064884f3bab160c5375cec5bad552ea4c6ca70d9ed667045bdebdecb182d227d60785c9ad3967d000f7115ed2736d3fc934b2c677170fb1a69d53ebdf175184295edbd4edd817537da4f3a9515d197095aa0616ff4ce09846db344bf1f0d025657324cc1a38962353ed5c5b66129be53395fba43d94420d8ff5023f046d60260a41d818cd5c8511ff752e7e8536d8f7b00940bc05bc5a72c57b81b09d5a1eaa6310217ba52c117e26cb6e4e6825cb53862c707a21de7d52ba216e214ea48bf0e547f55dee058b35d3f4f19326549c050963c9ca99d216ccc6b87251a2a712096d14f1861c214b4478af3f42d9fa452256281aea7ece0a9a43da1a5ca75cf35d9c51d5e6a2c6fff17bed34b76abeb821a4f68d98ea1ca1a57338150253ce72886f98c69c06ad7f906e56c805e468d17186f2f5113f958ec633164e60d540723635daff2202069fc9c625903a332523db94a1858a13d90edcf982277df292c79f1fa750473864d9fd7ad905dc4875bd78eb02c9b1a0360d690cd3770e43c7cdca9384f54f362af829ded9b835f31eaeee616ca05c9f8780e577f1ad1dbddfa11b1ce638df9f7ccf98768d1ed8b4f3dcdcb55eefd6befdb36536772e725a282f77aaa74e03e4480b004bdb6ab513171791adc5ec886c90e1bbb42c2278d5b36a603f42bb7fb90459b351340fa4be602fa14552b42e9be03142253f60528fa7416704913437b67a7592d9387839bb92aa89de6da5a89075a51153dce5a6ee3f39c220435918fea7fe5990b1a869b8cd69728ef31ba92a815eace0ffae27f9b31b98fa0e684faa58093db34525252a1c14910d27a06df4e9c9ecaa56bdf33c83994d4966754063175f7f7dd8e565c9c12ac89c37fdb200f946568c9118cf24e2224f40c926b58225b7663216b866d022c7534cbdb1a2cce851ff9fb92adfe139024b4a62455e06c9f124c1a970ee9645ca3f19d93f0f69de9731b2d2bbb6f0a30deb3b2ba123e65373ef0132898cfba2e421ad1f342b752c58c922947f36cc169af3d02ceb7fd7b9ec724f107273d581ae1ded371d9765d5ce48b13ba82693991726c16728b03f331b4006446272d22db35e9ad48644d72a5dccbbbe7f8d05e8a2ca3511f525342100c2fc0ea2bdc57dfe43231b19d31e3e5f35995ff182f7ede47d91b0f65f6bb214f28ce449924f13d28d11673a74ce55b0eabe5f5e16de95c32414222197b7957cf8f7ec998909efeda91ba485459ecda7e70a4d4a93196e1772b624395e0c34185e9f9e632f3dc759b610fbbb496226fc56db2327c199e6eb5cbdcd31e263668bf1ce91907cdf75794e64bff49d157fc0fc6dfa52c4d973c6f15f9f3dae03bc9ef3fed8659d67c686ff80493c3674d733b3040a96b4aa774cd9c148ec44065f6548570fc83950b10ea3ea762bc4091b678cc5e648c0169ebf6e5ddd51238acf675e54a38ba76eb6e536f2e1aeb3d2bb0f6b07c37ff9f5c5536b0fab60b5b485df4c3e66ceb978367a12e6a66fcccdf0fc9432f4c2022d13ccba77df08aee8bf0508fa7463f3849decbf6bad3acc7391f8226a5dcdac8f123ad34a65a3c975256bb7919fc96906341879a64e0c7d5f75c067ad6d829cb36e3514b33d7b3533989e22d6f1e27455434fc68a703d963e6a076a752ea9ca771e876720b3395ff6c034f1e92f4a1b96cbe2f57c475dfae0b6335660676ef11cf968e407b0718fa7c6a5368ae0f7120bb8ed07c4185e7bfe16cb8c3f5b949496e8aa940cd9ab215e94de587b3418fba138c96652e9fa9cd29e97b9d59d2eacfc629e2a4537cb149b714514aad2b3bfd3bfee80d1df8cd7"}, - {"0000000000000000000000000000000000000000000000000000000000000000", "01f50ffe593889a5f49241c3817d67a164d8fcdca60ae86ecb08db3081af96313f894d219e2070d865d7166462b3f35972032b0fb2d07b61c07ecb8e5bc55f2f7606fc63d442a74b6df55754c1d9fd86831b002906c07719f74af362bc44873e2acba431db40952b7709a7875531958e88d36e20dc7ffb5b31fd0393dc5b1a332cf9338f7525a30f331f1a4144cd464cec8fe927f0d48a3fce5d15ddc5842b3ffaa3390b0fea2c7e0574289f11948ceabcc8213d8b60fc55dd4dbaa8782df21fc9ea5642dcd4e196f7ef5a499272f11e46a10b86cf8f8f5a79f512b9271ed4cb7d8255c39463b1278cf6e7419958ebdf84c452324275bb7f661d19590876b4d4a805c66f504a448a324423e12ba52bc1a90bc1f59a39ca7fe8c04f0956e97fae0e7f5e99b5a51ce5028045561201afa7e59ce94f0f69cc19f34bf43d3aeed4f97850cfe69774aaf4f1da73a1a83e8f9402b6f60238d9c815694e907fdea9e7cd4ca9d696db172972ed099a2e01bccc9524356bfa65b491752f7304e0c1f60b4a8edd59f9e2090bbb8ba8ae997e99910f91c6f7001342f17f7be117342f0c30f1e9f600dd19bfdc8d9d878d5ab9ac222395fba484e076dc96ab5a7d47dfa1a6ffcbe3e5c7657ec250563cb578f021393acf8ea7e9cad770c1355d82c88215e0451b8ac24fad056db7d7bcdb7264487f30cc1d6b1ef1de2ed1039585d48af6e33fe216824a3eb379b1c0dd9ee1e710896c7611d00259e92986f3fdc79ec1f348d8c3d30634bc44f1928748dcb2a5e538e0d03d7c7959af3b102193f31f568ed1a96ae5b5b17af4bf7a557f787d054b3845a5851f084aefc1319ec2011884216bb690149f6dd83d08794e522427152b7ca5c1d4327f9ade1426a98606c5697b7a4cc1eaac2ac5e8982f315b7a2665c497341f476f6d5db81cc6d8cb035c9e7d2d22022aa87b6864819d6f4671791d99a949d879d45627101811c73ad0d0552a14f17ebc132d68ce0dd1995f065253ac98d25b76e46373023e6e85db09229dfda24755c63b779d7f9b7e2514a318ee0ddfbed61fb776043a1d881b1222dcbb8ad04e46ca78a485b407e1ac0e622538441cc0033440c82129f574970cab9f518216bf1c74b12af8a3baf16aa1e067fac781601e5d6d2baaf324fb748f07c492446ab64ab71e89a3bb95ce04f79326b98ab0b87de9f7151576549f8692bdeb0a1ab4fb0cbb89ecc36180d45e57ff75697e8cdd9cd609e3d292015113b8b4b5f750cbd9639ab7157ce7ea1d03f57be2deaf2d4cdb470547eae6da6d671d906122694ba52ed2da33ba5864d89bd0a3a258d15d650a2e8832d80610d3cdddce830d1d5055c541043718b82993cc73eb63146fb037548e99ef66661f9d7390a73a6f9c6879e9d5c3db3f6721db4fa7de599cf4bb8c0382782304872fa3008df0529eca194d0eaf695faa7ae136014cac375ba09d5a91e6dcdd7b59c3dd4e50103e3e13b3c568eb1283b1475390d9624ff934846a44335ee81197188ff20bb4a4deb16fa2425c3cd2f611ab00bec322b56953658a21697766c2a259bcace915a8cf0848c63a98fea05367e1f67be5713275f960302243fcbaecf1adc6fbc31be370037d41f95efe4c4e774abeab268d9bd9e2d7f59366434f08533fb0cd04eb83fd78dbb371298c41ab63eb7a1e5c6199048d10f807ad1561dea9297ab3b9d1f11009acc07f2876215f3ac0279bd43944fbb4aff42db04591b8763c664d87d2f42f6328dd2141f691cacbe3e60d7cda8e5f05b8bf2593a1b435fe97912c736700fdb94b7b001e24a89386635bce3f6db722a10cab7f3ab77fbd416b086dba1a30c8536c7b76b0f9fb8e8fd6193b3fa17714737d10088e7e9517aec4a4222efbc1e4787c8de0"}, - {"0000000000000000000000000000000000000000000000000000000000000002", "00fafc379814ad4b882a17f775ed882b37287fecea1ab0b13dca2197f3a566f50c04fad521d29615c0430e3b21ed79d4056bebfc76c79363a4cbc73bbf50762f6da22c208e5398f10733d4f761836ee2ad590cf903af3274aa2567358a8b90de1dc8a8da2f457a1bfc42e8545bb0e35e9142d73564243178738aca5cf6b00baa5a45a7e3af434d25c23dfab4eb3bdb9e9faf6113754f943ace8106cfefb6119439ca619e11b8193c031b63ad3b4cf40488c9a35c344b1c36f4f7388ae108afe7b9d24a8094f741d12e9251584cb48a9e015306d993490aa63ef992e5a51420d1af19b78b7f26e64ae2b543ba2d66efa03d36d14ace3db7327c7af97507966cc886decd9171d7a515aaaac186847fddbdb21ede29739892e74baf541573b8b5c26a098a5439c70b7d4aa00c85989318593284f4ce412dcbee54ef291dbbf2205ca5fe17303614835efbbfbe3a8c7bb91b04cf5059be816f6e8c24b2da7a736429b978ce65421ecac9ae8666d89742b736e71a7c11ba82f87eb77e196fbc117452907abdbe08e4e84821eaeef15a62c222b8391bb322acd7c27fb5293e64c32185fdd049d10aaace59726469837ce1c0e28fe4b66e88a57e86f01f68cef0284d52490cee32074c98115e61e81a55b01cc0025c16cc6e2df85297b5b9e7318340979b27a84de75df3f4ddf52bab5af50dddbca3e2e6063fedd508199e93c68393285329942638a4f946cef07c1539a7366f95e2791d23f0852d8529f9a9a3bab09df79520ac8ec38ef66bc1bd05324b2a769fb560192c52533fb88f363c11026ec425f6de047daa6670e8b88ad10a3c2225fe2088f3491a10a9067f277c8e48aebc390c53e7731fd13a47ae71e0facf5cfc95a7a372424625cc6ff478d295dfa4f0962d92489549ea722fc10b34b7559320948b6d53b093e5535e0ca579214c550301b6f10402958409fc4b34613f48a8eaef9f1e5b2e2dba7e2325e063b93ef6294084529b1e98bd5d8b4d0c8cb59bad1c1387f1c9928c6360b5df5e96ffd82f2e0a37d58cda80115e5ca58ae768e911f3dc1997bf05439aed6786ce38cfd3017e1a1a004cd763b7d2331c02a3e10f103bcae43db2ad52dcb1a5ed6b1a7dd010c328ebb56b175b7c3ab91d435f1e6e4c6d55ca3345e0c6049eec93e3d28e75480eb147b1c39bff02fa025207442a19a8cdf15fca08ef6daa639eaf5d4b341939052be0c6fa4a4f2c329ed3a02024eb3bf943b005d56e2c7b56694dc1f6c6d58d416683c39a7f50023b0dc541a8d475cb5ab9946b34fc53c9ba484e05c71042cdd6eae317654a82e36e8cf38c358af951b6bc11f9c0f6f8641acd343e52b5859e5776b86afecab0183a1ef2961b8abd7e71968648f1c6e1b58d9730c84454eefdf8522f9376b645d759679fbf62693e0f9e02a868c6c10c18354462406336393cca28273f09dc0f3babc186a9d09feda6f37231a85b55ee275a9bcd13d10ce1fc48ce49a0fbd3f0304b725640fc5b72465d943721a71c244993d5aaf0d1fe1aa3512d7e92a11b5cf660905e0059b4aae2fc05ea253f1cb75ec33d39b5ec53a8cfd2c1f3550511bb4a47f9de64367f2443c13f8bee59b99914ec44c1a6c211269ce37d55eb93d9256e5934caede9376a41ff608c9ee1557f3c1203c7d056784bb8eecb7cf1e4432d6d80da371ac531062078c78c9c6a8d924d21939b4b3d955f010dc1550df6a330ae62897bc7ca50f92d90c2511cc4f0cc7227c3ef1be12c37778b8c82fdb6580c2900436ccca30e6557ef811951337a31813527fe713d32b5104fac19660a81edd29ec37d76a529622f576f255a5c77831bf0c5860b8ee556c4ff43dc3c47bb1d803176d9ec57335cfaed5662bfda86466887faa2363df9da290d"}, - {"0000000000000000000000000000000000000000000000000000000000000004", "01210dbc08991be1666a62e78e6723bdb327b7899333c33eb15c2a9069875514ccba6a5e093575990145026401744b1266c4a227eb2d8d7071caf4c09e66ca0f5246a2090d4c9521d8f48b17effb93234579966d0196bd077373530df8a4251fd6bfef8de52af4e0b71c1eefbdb9ec5d71e464f4b5183913c99ffc5f89ee049421543907a12eaf5301e2f64364ed2605ceb51e0e8d9534ec2f0243a495a107cc745a12a589d99ce206761c999e46224c8ac590adfb2498a451811e7c5a21aedc742b1605e7e9499356a27e27d915ac72ab692453459d52303d7193fa363990e9c5d68234590b4d245502a05b956f138a60d85d29ffda9b3c667da2ff14ede7b02771d5a7f5cd71a917499ed3c269ff227f1e87c540d9a0e6711e44247ec8603975b5ab7bb51a1bf8ad09ff9683e103df290a29feb1836e0f7c1ab3591d8445782772359731977b11789c82c9ae3a50d601dd4dbd3c454d90f8f1e3e8747e7bd397291f45a54e2adbf0d817f4ced89077e73946718e88495f3f46091eff42175a1d0b555d26d380664535dc78f70e164350f44bb6aac9518dd24824b54e097e0e64f1c2da033e8da2ce48219feb054045648f35d8cdd793076e0821709cdac248becd2052bb90bbd80cb011e9120c04300b9d510e6dff501e218cefd343aabf04378f521881a2979fe3ece5be53e74c287e8316cd33de27d7044c5cfa97cfef39418111d68bcbb395a21fdc94c80c605ac0bf0a85b46993a560595ace86add99d545f16276cc33388e2854b3c64c501c8b58965f11cc94731b79a84d7e81779ab59c6ee10428b12670ab6d0901a5c565639319c7faa3f37d0a8bf8f471bde5daee61d50b9c39c985d3b4e1788c882f5fb3aab2056983f2b4a45414cd7f12148c945973ff05ba196d48fc19a3450be2f9fe1dc5148475c130d61cbb3f50fffca1001af2fb5f90764b94f3cb20970105de24605d8b3b009156d37f5a83603cdc1a270c1d548a5c2a177cc8208ecbdb6a9071634b70873c2733878da4c7ff85c5732ba5653e9973c62f2e8e7e777d7c9420e5378d0f20acccbeae3c710708825c1c6697c3f8c86c1b746bc2359d7b3dd14befba523223f3e17be7962fb1bd4732cd6b97cde9c0241ddfdaa5e0c6e225ea722558ff543b7c34b13702e59e814e580ce7f299e99921712810694c66a1002ed0ae2d495757daf6e32799573d6ed0be24ca5e6e3cea1ea8b17527947be42684b367a27165034554adedbdb39926535e8c33ca7d1155f9d6b16576fdd650bbd175c94d3686b529a5ab2a77fa5e313179c47f52161e9fcdc357c4df6d4d72b4a1affa0415774d3cfe2eba189f9052ed92cfe318afcdc358b1b240c33e80af81874dcf22cc06f6c661b7e76a5fe2f4e753de40c05bc80e6b7e9ead1c9be639619da460457bb714cdda6e1d17321e06cbe11a64684f4541b13140d6c4fc6360b28f191d2a81461fa93c87cc18325ae97129592732f2ccff37990f66c71198d75c8e0383102cae396c0e38b89a725ee6ad8f600edb6663a0cff61104209f9a1db4bf19aceb54328f480338908221d57cd01e033bb4e4aa29c1bf8b189d137d659b254152eaae3964ef78524774811db9ee38956be93875554b5d853e608038632c616a5fe0c0f3766ba03930b14cb4c04328413d395958b73721f818455ddd7c10e56124c0b0d0b4ab236d0f5546a67dde11fb0e80f0c0e390b0bdbab3d117cb1b0219d0eee194f3943ac418b852e44191938e91e26df2f7d1122718c7fc8be0f1fd4e87e628511d28a12bc8aafe1ca3327f343324f7fa52be49878ade43279a203df95debfda7b6c2810295fc7658490a9155663d4d0aaba9d0d3b33403b15aed9216f065938acfe3421155f8d224a54fde178"}, - {"0000000000000000000000000000000000000000000000000000000000000005", "00d6f76708d890891835b24981951150ac411f401a3be5cc11305137777f3de3d3ed5ee5224082db014e106db2416391cefeb2c8e27001c041a5101250d0c11a9f5bce00931fb7d4f196029bd9fe6e41c778d52d03ccc331ec93610dd0af95f7677d8dc17ef66d94ad3c6c34cc8c297f51e1b007ff8c6bf1221ae4fa9971141151160a1c72c9e49d91fd60e5b211571f5d21661bfaf6e8034dc0f88925330f339df13bba41ddf23407c08642de31038b8a0f91b9d1796a2629591db1ba3ee86bd76127c65b63b574f9ebea65ee7fdcd9c7c92a660d5ea6927a1b3d0dc375907593fd08499130e930bcdd8b3424c38b631c97082fbb22d2dbeb9aca4c16c85950048fabf379f6639d89d49600ed11aeae7430d2afc325971eb2d4d456102c58c2835ae19df45a1c965bd3e5681479d20452a46df8bdf67d03be50c2200f5c03e567bc117e085880a4cc1c26368b136111012026de184a304501a4429cf8e0975ec1e99f3b500c4df69f8bd2cf2d837471f6e52edd58f1678e65560be45b4cd385f829431294b9d4f3611d3216135d6c1e863de75b914fb1b5a805836d326b7bab79fd6fd30e8ebd002e780823cc95819136a5dde1bc2f9bc66018462300d40d6bb492350ad75c780ee766795d036f10dea327ea88768b1bea813cc5fbd929008bcc9400119b3dc8cc6cf69faa73d172009040749e4175ec2608882ba15504ecc8684b7527b4f85dce7c195581d71e2bca1cd1d02b02d0d2a81d16d146ce6b1ddfd09c14b8fde0d239c1abe509e358866ec62a9c41d9f44d27c7bfb57851903dd4d91296a2e0a8766bf9dff2c208d4e1e1ce42e812e8275420f6fd9c29a7e55d67011e3c36310bd1a27127e6b215f7b3de79c4d672a35809fff920a798f442db8274a5ba344e2d445af45fbd0d116a9ebad6908fea52b3b1a2ddc4954e236e95b601102c8c7128ea3d687643d842ae849e9c255e8f46153cab22cb59e589be21a1edcbd52a0c91eb8db98d025f89ba2fe76931f3fc6261bdd640789910ff6d4d37a893316a2cfcf77317a4a290fdaa152dd3ddd1d505753f33106f6dbda86da1138c1bc7fc715d3240300ab5cf956d21461d8ff2977b24fe6caa6fd41583a80792bb8565108b870a50e07d88d5234612451478aa16ed38f4f7d13b193021f18ac4c219973f36dceea803f0396f12adce63be74d0c27996905d4b47af787e2b23019ee85401493eb7d30eddf58e66542a14da0a1482792994da1c1bde5905c3536a88099d4b13e39a52441d3a68ef46c9b5f5e62697759f4b61f79c94471201733d018d8055fd0674f7594b8791a6fd5ad8f319eb6e18da15b156f9bf327af2e6c10e8915fa1acd230ad157fffc03d5fba018cb6d58d58f46e15ecfd8481165879ed88f4df9c504f9093ac1334b349e008307cc78ec7c620e5b36c7140769e5fa0174064c89d7252ddf304719b15700c1387abdcdc0b292d5dd5d9e0d2bb7a066d598ccf880c4b3a0f3479ace8f5b801924ac239beef6e01bc34de3135036e98ba3e0bed4db0901d2797ada6a171031ebaaa8660dfb2edc5bfe5a3fd66af34132cffbe3249536c1f40f7b2af41bb6fc0f590901384eefc8bf6eb7493857ee17771c5d57851747636e8016226f41ac2814d05ce5fb466abcb1640926d76821332bf3ac1b42897e5aa62360945fccb54499b56396d8cb9b58ee45d809b8ce7a025197cd2926083af0d854d7c51e88c32c03a8c793b1c4dee6ad2a48a2ef9ce17fbbdb92c53396e12915e5429d24390a6af2f24e159eb5da6bc5d2165ad707d0f79f3d9613c6fb4f1725da93a5f7b5ad74edf22686927b32fb1e777974e2dc9e5fdc3fc45d47e51d9545ec4b699c25d4ef0ecee3175f7b0667fcafc6368a2c77dfb0f5"}, - {"0000000000000000000000000000000000000000000000000000000000000000", "01429fe4ab4eafbbac1ca2b5b87aae019e0717f200379caca606dd48a71d44b382a9f1b7c9bdd5b261570fc9820e0f154f8fb18803373da7b8f6a44497fdff2448117a1beefc8df597b4ca963f74720394fb556401f11ae6bc8b8b19312a1274ac9673f64b5cdb1ff302a0ee6b52dcaf81381bf1c597665778d37c3a070005be20bf1e093873179d67a9de63b49ee8eafec44984a41c3ebf69058d92f55af8ba685372ebf2da2e610d897c2bbd6ca9df9ccae7122047aebb1f3a5a20f9389f2aef4edd1fa528e2670c0c7d5e61d8c5f13494183c3413b6656a57a050b4469fac683210cab1c3215f3a7cc3a6e5f163afcf376f65d13972451b7a4b1d0d9abebde9ebf3f5a7a900f1403cea5d46526f50b2731446c9d467f475d212e9c3c75951baf2373aab6712b27aa8aab4423fcab3f40a32245fe533617ac8c625d8f6e9acd7dfc7c31f94add8e72576610917821f0317a39c12c31533a805b2c570f968010ebaddda86091829d72f581d5b42da70944fff35644dc5d24b4e3e96231b142ebfcd801917114a59af92488eb814fc52e452de63af2387857d29c215ec4c17347c7bfd850c2749140e15cdb8d11a54e1b842522d9d59935ddf18d38401f4240683c820043a9af71246f18cf7f2972b336538c418acf3e452d6f95c6427e7c7437e73d53d69e3595b556122c51d04af56cae1fdc97f5ffdae06c405fd89e2e0598cc82447453bb97abc295660500b3928b6f509ba55deb303673e3eb8c16f225cd4b3093e0d520f146847d93200ad4766710e5df3f56f164bc24753a35462a8fb33270e4672048ddac6d184dc08694e086a1414e716a2810591d7cfd64e0c53ec6e4d66cb7cb66a7369b4fbf5bbcd6da846ae63b7660416d5a6c1064ac8bc978c545b1bccdb85d8229cd4d133d88cf484120541121dd46c31b0898ab7949b569903dcf19f7e5969c93d29462503fc1c7ad6e41b10d9416de751e79f9841bd4ff50f8a6d621546252b77bf144dadd99a5afcabba87f33e0e3510f9f670d5648730333a7ce09cda25ef2b130d7128dbd700865f042a07796186bcd68464ba538241e44e6a7f3ecc7c9da40aaf6e26508e1ad4c22b01af92ed23f5f013fe6f8a2f10b58c12cf9565988a444f14d626ce5cee5f18d348bb4b847c34f4b1c068d5ee4e6da35609a518bcca05ab1eb3b58bd4197b2101b7a0b476a2e1ba1d93bd0f4919f65a73e43dc395824e1ffba43e20537d82983ad6cfb6ea98af1dc38c7856e57edf86a0525c029b47f59abfb016d2df7249f7f775ee4a7f256fdbfce808c41256e10e527bc14c55503acfc805ea5513fffa27a7cf5776daeab18a57829e5aaa79f4dbdd8b502e12985e4de4b552ddb57a71f43e5100dd185eee2c041fa352536c1180faa4bbbafb0fdb582f24827b9f5b03e945c185630271560800ea9fe8855ad9da5f064106c2e8a2bda4ee017d3843e18ed5e32723cb5fa2f609b4ed1dc2490d5e99bdd2f1bdb0b84f6ca0fd3df3195ee5c107f7b10fcf0bc7c3f1dae7ab1d82ba9cc80dfe46fd29052015350f3528fcbc479153f0708ab125ffb9fc78117c6d0537c47448e8c6b1b98231bcb91a9c124538f74873bb1de558ecb7b1c7a8de9e7955217b04ea504a628f5d88c8d5d07fcede888ebd14a9075c840dc8d913057f2f6846abfcea8e1def5bd0121875d0e54ad09ec3b854389065ecddde6fe5569b42085c1e930797e1fefc06bac600e2c2a3d6ea9f8fdc1785ca140a62c1714e2cb41b9ee1814269f3f5972b09db9e5b96d694f55c12786dd2d982ff2ddf7a26771923b34fc9a9f1d5d848a3ea50537d228bab1c46de139916fbe1d816faddfdb60934cc29b274545e8d512452afb3f22445a973d5236f15c14d195f6fcb0e4f"}, - {"0000000000000000000000000000000000000000000000000000000000000001", "000de4161bcd0788ca8d15e531cdcfbebe42bc79db3289debcfa9b74a3e9e39ca28af16d772aafde12f0080c9b71501bc528e1ddd2655adc5eaecd0057686a2f4ab30f8d6ad8e5782f53db7a70733694521fef800551d4bc85ad954ddf97a532f37524226d78f86e2c0b1928994dc331256949abe7e565545b45b0bf8ef8332b9e1aa21765a5d85bb3b942425406db2b99a6c839de3f60755ee8758dde56777bcc5cb1a03b370a56003b10a39f43ad1091f4527250f2dc64ce700d5fb34a74229489d5a5253a8ca58f026546be29319b5b8e13a0e5dbf7673aa94817444d7af926d184ad5a9bdb1c7a0cc95a495a0881754252c2e9d3da1f67fcfbaf01ff8f5b743308b9bbb2173e7cca5a3ad61c59844f06bc6c002fdf7387a5e6220e50958bd0fcb0f51ad93ad17dda40d02d26b56df78733db07fa9b2c5fed175fff4e2ea0eaaae5827996ccdeda41a9f01059eb1500e490ec87e64b6f8d55450c11ffa151da331ee618282d5f8e6aab8ef3bc7aa42eb34c368f026eff20cc07cb965b42a77dbb760463b970ec618dee5a516a073eda9e149f5b8dfcee7ca5187ced9c2d6ced3874e10d4b35062546781aaa6fc7254e476fd6eb4bff9c9c4c53bbe3e5f0dd3dfef5f966f8ef0e6702ffdbb9071d3dfe583989fd998a28a5e08a43571e40ec1eef1e21a8cf45a75fd581070c29a48edc343671cfb6b9e305cd094157884851f599623c1799ed83372ab9e38c113f7d109cccd57ba66c61462cdde8a18b2a70ebc20643485f1906edad0d06c526446adece514cd9cf2a1e61df5e26ce7e3f605247094f7b8d6fc7eedecbdb06a00fccc05787fd7a3e40850da0dd4449f6396360463dcdb47ce3537db5c66583c43351e17babf6e9101bf69dacb3d29bc9d92c0809bdce6482250fdc5d0b2adc3ba556a5f481ceb744a44747bcc624dfbda66800a42a7e8d43d0cdac0434bd69c1b099fbcf5d6bc334b8c47eb5acb9f38db5e3df3f5ab6611b7e57acbf0d93b13342a180ed5f19d40057651ce98d52176b017532ff2e62fca9c1fcc0b78e9d7fd8a218eb793cff013e19fee7c9d341f1f847acfc71c07eb29cfc81cc158ef5f05dcc9539b03aa19f0c795bc63e8d1509a315d48548b2e6c5afdc6351c934c877b2d606b7fd0e1f94c21d8e6547bd65c3d4f1e36ffc624230d9678503a62db8821464b0ad72d76126bf3429eb98afd53820d16d25e208d4bbed1d56dc1f3e3c6ac6799b69c80888c176b1234325cca88179f42918e214339eb8202a0c23099eceee49386d95e25bebadde21509d40510747536f1a69f9477d2662d0ac2bc74249fcb8ecdb09a4e76c7ba040c9e4e8fadf00f6b8becbcbd8d8921be6341b09d6946f27cab1e5a1975d8c9e330f57ea423056b29d1d730d480d94ad0ce129a9cc7bb7131d00be7d250fc6d665029f27a47d5f81f2b9053f6f340685736e2408d567ad8e052d4de9d9933b155bfad4202ccc6b3c937c40d4ba22ccb3bfa0291eca7c7b0d23a802e509c9fb4f76ccc2bcc547cbe537e43adcac0e2e3b9587b133d5b451316b891dcecc7a29b1f5741c4bd9ea0c212981ad2b34b3cb2fe6fa0fc2d94972160bf0e2b3cbb039d613f4940761530f485a7d3360170d291ab0ce92b8a757f4710b724641f0ad50e48b07ff5ede144eaa73af05268f50dbcb31a6acbf4a450ab697bb72d8046305c2620fea4cfe7ccb421c543214e8367cd31527f349b3a62684e62689911851825b437fd463dbee274dd5e5754b1363124d742a78e9bb0aa91185af55d5095e2542443412ad80b7cd666d512c170e47ff1e3ae1eae7c448ba4ddcf97683ba8361177c7d393c59aed8e82725c0cffd04525e66d928f9198da9278f208201cbdc045de0f4678a50b21e6f03"}, - {"0000000000000000000000000000000000000000000000000000000000000001", "002100ddadd3a97bc78e70fbf47f477562efff33e104e2d4fb8a8c5df27e2382b789c0abaf646e3b61671d6d2eb97e77db11e3e3a29f5a1c9004ed0b2cfe5328f2cdf93ea870f5eae2f59071b43202056dd481c602acba43832e6223ea87422e6edfd6749481dbb3a315c9a9556a1b6e9fb0d0d473c258d57531b3b1c5b113718fa2ffd24c66a1b121f89ef86aa116c6ee4ba12139fbd696f79799c807261a665e87236550df8a950336e43ee6e740914276f3d8da6f4ccd45646cf88a12c6da282253b15937bb8383f8ead62d27a9eea32109e67b2d6b0dc649b336646f5560c40f9e0a3ed98f772c4ec69fe129a1d8d257e373eee68e19eeba847e06eb4d975c5091bb41cdd3b5822c1206863bdb87f22182c5fde91d5b2f7ece33ee92bf545e5e539937ba1049856e1556c83ff25383f7dfb4ac6d22b0d6dbb1358eafef6a0d71b51a56a53c234f6061660f6e79bb01ace4b0e22ddcd39d1ac5f75941ed198f4ff3de7c3656c7feb34e8324b22b5840e54a1ca7b4f53f69d6044dafe06dcb33ef7f7d811c925fde0323f6bcd338271e116e5418f271e990728c0b2a0acf2e38bd710d098ddf3b6f66115fadb0d1d2ad4f6eb9e1917ce3623148f2ec4e62af3d55dfa452c072c4fdc67e95b28e19ad494b16bbbd09e139d4ab587b0cbed33416e3f83fd2c310b451d4d73881fa130a54237ed0cddf41dd055188d05354e406fa4671aa67674b5e060b3fd60817021980781ff99d7c5ea8de9af7d0b71e691a01a00b3adf0fe4831f433089e40617f262adb0c5b629a740b2e44eef909514d1b9156ca35f8ae1aaf3195ecb0bab953b0c9aa2cff2bfa2a4fc1b8819a200f0299f24825fb4659bdd58ee128538d1dfb969a4b51c7d571476be926bacea31f98f634160ae55d58b289630691d785d9f1619bf89685d340e92eab8d27e2ed71eda009ae2a5f70f557ffb5ab17e6adda8b9708359e0350c3a75c519633ea3ed1d60f6d876fccd334ad1b9081cc6df53494da239b0916978b46a66cb5576dfb35246c35f4e36126b277c1a667e86c0280a1274f3b1c507b741ec9c2bc2a9cb59db98a2f339ff32c93d7e6018b2677b40a64251bb0292d45ea74150f7a44e43200e9f42af4aadf1f3fdadd5db35c189257dcd58f0ee2604be5b69345701a5d7b5ee79486846314bf9ee380488a6a742644067ce4390503361c89c8e6e3716af0e606bfcb144e57865bd35093bc3f4c5efbc98bf47117193d15acc674d63b2f1c10036c1cc8dfbdb4fe42afe89a2a9d037b2b9a2940058730799789efaa1cf04eef6f6d0daff0f335a0a4d007d3ee33fb71c6eaf291951a9049051771020d787bff95edabf591d7b500f95054441cde3d0dafa12d52018c781cc59d4f27f11c592774c0f287afba481de524372e511fbb481fc05b2f422b19bf52d2bae714e128c691b1c3d1b6d22181c6d2941f39449c58d45ee50f44e25cdb3f152ca1c318b76df8d5ac308f3b495adcc50466f57ff5caf50038b4fff5ad68ee21be71811722831d74d555f880c02c9a3a506880a3befa2989447d7a90b10eabb523cfb4d67df96ba4135848be0b87cf1af4f063c3b29114a91fb7a222381b7d4e2853f5f13c8b4c7af2f60252c65159b558eb53f11f29ae9dda4c53bfbd27e0308c67e756f4378d2b447a2341e62e632218fb8fa081f76d33271c83bcda78db59263c8b43a15451793cb0c08aaa0c121e15f15fac19428d9040a2dddf2526e23689701cf5b04fd1cbab3a7cb26d4de18147661c30ec768a81f0e9b56acfdf8f1d06e752eee109dde2a20facf5f1836e7d9f357a30eecb1ac10c7ed47dba721ab56adcc1af32178ff9521c178c90741cafff773236834d7c810d1935eaef268f227d74cbd1e189f9d"}, - {"0000000000000000000000000000000000000000000000000000000000000003", "009f9866940572830ebc43e2db3833a9f7f75b73d93b6407f3cdf8cfe5c9a935895456cefeca2ef8d1ad1a89ac4a3426fa19a35c25232cd30bef64269d15343efa17b5d5e84d79e87bf66e1af3fcbdb71a72a9b1037313af4c83c6b5cf5311f59257e8f9f03db03bb30b478f32b0fc9247f5d653bf1054fa0127e23d19d9105944486750ef2d3da912da1eeb3f092127e95cf47c1f3e1c32a03e6d797ddb98245dc2d35b951d5a7a016f3ee7544e78b14f2b7d1f04720bdbc31c5f35b707fe6dc6369443077b65b27a68c2961d7b095406670401f3f37b86034c69440611cdf6f2162b14ded0861ec5572c39f31ee9a5bc22b12c1bd855f3361b3f81044f367e05644c9b7c79a3008773be994342b425f90ff982cf1253b7417b82539f084afd92987c5abe040871c3bfe9113f658414f4049da73ffe6357be9ef61925b1d69e4dd3aafefba27c829ecc290a2cd8661100f29d03bac1531cec8d61aa0018f9a53de10f79ea016089ac121567db89759bc255f660234ab53f916d1ab09e7a6baf60cfef55a3725ff6309700ce3af07e494f9e61199be89b1844b6e277ea833a3136f779e101de2111fa2e1f5df9388085d9555554366fcf4a9e38e493d074a593eb6c5afa554c558d06ced7b9c1ae08acd28393a5f82bf6dc676155c55ff6b7501e48b60e9941c6eed08b1345372201e49f51c687967600e201ad7c15bc574c7d33c1c7777b671522d2e21c727c31ac736aadda0643ab57e58e374b6415a5548d802d09d960f94f60be05adedc3526ae362c697dabb942d608cdb5d1b203ae7e5ec789566df709227fb71e0ff048fdeb40b49fb8f4f55b340ddea35b4fcf474740f14c3fe0aec17db93c284c7fc09fe9cb699327fea8d08f5e5a66356c579b2ab61f0a4a8a8b0ce85fd7d0b54a0bfe8c51ed55922b877fb0479770e790f7c7fe001230afa602b8217721f901b97e5c48d822f57d91a4209c675b437b89dfa35a4aababadae686d3fa461b1beaacb6bbda6f0fe0f6c23e2197d7bc9194c944f325583fa733e48f535296f7b946f5226e8d9f7dcd5510898c39fc4b0af4fc6c02344542411cd59f56860a14f9fdacd32dffefe2f9429ed3d1211a2f679e49701ab6554049d6548d369fc41082fc2fcda9a0fe2b5c207ea9264f55d1d127a8860a73d2b11f5ce1dd15e30df18cdf48307461fea6c1ad47f1cb9355e51c91c6502e3c45e3e9a335da4e15bf44c2a3cad70036dc910fd13d402968c7a38804f3332ee09dee489a739a8f64938656aa64d25d998f166c5cb8bbff1c089f864511ae3af6188f6b76abb2c226a34b7c158ae99995cd25537691a8a577a7bfe0e4f94a2a508a0dcf3e49ad1f9e1f21769af26be4a7b85f4e69ab3e19cfba7e73428364f89f9fcb8f178e75a033e5ef6201c9d6b794014a6d67eaf3c2e1f7f3b120b63117ed3662599cae3787a7a46eaa66b7edbd47b778f2127f268c7fc196100b4247f01ff3e988bb8368cdae88a6224c1ff4221940ea9e0c351599cdcd29ac0bf3861ed00bdad61a04d0b4d69c655cfbf928214da8a0a202b76c162e3f15a494686f0a14925374b2689c6f09614bbd93d2c2385f336609940839dd7e19f7a97549aec21b7f34f24ba00b0cbaa952dbf93fd83e75e6b432c550ff7252040172c62edc03cb2da4825561d13f1a2f3297ac302977fb34e12bd85dcce2d77746747cc6e65e3981be197f3c5fadd1538a8d3751b58fe6df112f8b9bcbe349dbc3ed205560aec3e87724bff78452c79e1850f8058d718b7a97d5f74925d5b9c3432c72850b1eb1b42b5c159db24c84fa7d49e57735e1f9f5aefc6fe4d5139b2ecf60ce1cda8e7fe25c261d90190a85d7179e45935ae3575cb04fe5ed962636bae0921125f37df7"}, - {"0000000000000000000000000000000000000000000000000000000000000008", "003c80b6034e7004b956c0f3c72eb044744bfbf9fd1c38afcb2a24ee4b65bac500433343723b8ada45c7153305e271e490c1e86ab352fd68f4ade50215833c1589a3b9a767c053901b9417a4558383b075bdfef5025fd5e2ed1fa73b8c0f60702726e3df47521d52f12bec55d83ba2090f6cc8d3f9c1bfdc1d440befd90810de6511c01d1a0d1eb0f37267f3688da3f5d332941de25cdad9982979f43691e3b49fca2d6a8558001801b8af3ff551ddb92bff25c9d8e967b757fbdae18902b615945bd7f8e6dd40615932968b327f49d9888202f793ba602636158917f03cccfe445cdfee104eff1e0c9a5f2a8e6fbb8893551e28fcc643951b7db2bb09251abe99c2fba0becc20bbc6d23c758cfed2c1ad09aca0553360cb8f291b80d58ec56a4695783f56a00be1654c509da99151e4a60a2dce6336580033563a31eb629b59ccb265446ea37531ae9ac570704f8fc702e3f0d8350a176dbba023f85bd7b7625cbafd589f2c748d420f4d654708b6d40209c629a20443d479511fc999d4b94b39d5c984a290e77de01951308ee090681206b85c1c3a71a85bb799337f66ca0da9d42f0a1a5ac17383a38f7b845ee4819471146e6e32fb43353f0f62d529eee1affaa726e0946abf7ded29944edf3405bc26e197e421c8ad76850d5cbac6506e15161861501fceaeaa40a38d1ea7624dda5562248e93c7e206de51d2ffcd1421606b0094c5d2bd53cca63e9d6b1187cee5b785d615878582eb4145706dd150de8dce0b57d9c6720baecdda3de602893a98e1ef59d87ffa355e632c3a1852c7e85276e9a5cbafef132039c3a316ed52894e564ee9713b6388bcc6ee724db75fe8b42c810ae9e64fe9c1f7d239154bd2eed2e98199bd8d18104b65498e966573b7c71b75e4d6f2f5e19f0892240eba5f129a12d3b5ade55a3a43c9c99c6f6e33e80091587a06097720607c509791f9c4106818b93e5d00c5f6e02257e1fdb3b0103cebed8d3055e28cc8860689a878e2a1b507a52f73b372f4233a0e00b077be61b10f9b85b3fe9ff916eab40c7cb7bf0d133adc17129a5be98b913d477837d413fcffbaa50716389d5322358a998b9dc5df446cc35ea47679c8e03cbf782214903fcb510d1057100a12d75a592dc637f55b146e1952ec3b7db46277be7b85806efba499e44b1919a706705ad44a51094eea1eba847c7f2287abffffacda2381747698cd2dcd84a975d64c3d72217c9d10604208a70451dd05d1f2ca1632b2fbdad22ee1d81e8cc71abdfff7398ad04bf1149346df2d784f68673e70730e616e5d4c0d84195392a4fbd4c7208f7562fdb1b61d0ef7feedb2d5cdddcc12fb82fd598d3bc06a45620fa033cacbf04a01923682c26a407db30750fe10e4150711fc955f9119a78f32d4d04ed1815f464b00740534bd2157f3cf47c8f53471e1f4ee4aba3a38738b24f16ee39bd09d7ebc0394c710aebddb4549fb997616722f1a6e98342505890a1d4352f17f2d1efa8ed34c86be8c5b626f13e3e757acabddacc684895ebfe70f67eeebbcc46958d22d748a4e6f8c7b9bf93f29014eb6cf0b2a604117e258cabb775838031f5cfe78da199ee5666a704f87b79b232e80c208c5b151bbb17d1efe34dec3e6f6495b0d82509e76a9b8fbbddb511d0cb318f96718d997164d156536ede3dd81915668371cad0383d593d294e48061fa00e4d91ccbeefbad0e1b444a6b445b6f6f2b73a3857ee7dfa17fd07c301d394bddcbb766c2a9a4bb1634d5593beb1ebffa5f560fc93e3df5568b396589446c955e439742859e32b53e69a5deda2c3a27f3e305b521cfc2c1a3729b3dbc1afcad2b99dd8cbd9c1b74bf68d21c4efd9dfdc8925546d7e6d9db5a06ecf387cc0cdcc36e1927d87624"}, - {"0000000000000000000000000000000000000000000000000000000000000021", "007690eaeb21b45f5f4d3596c467367a27c599eb0a0cfa72451e134747e627d41d5a50f8aad677dc68391d33caaa3350f639b5c2f285cf1b1868eaa876d6db33722c79e4f3c0e7aa3375512d342b3d6e8f765817178a428701d698996bfce1c6669db5a107dced23311cefbe4af8dc0fe2fb95958a40cd66a6b8d8d7970d29322f44b1199df1a11763f4d1da8b75c38157b3313487e78b1d0fe00c921ea41883ff84768b053a9a6200b33ca1e1c57046f35aa32e757448be41441866c2389a7cae475f0af71dcd13f6fbc885f726a87ba3cd0a238c6dfed9381f1d1b038592cdb6451a00c97ede5e6d8781951cb43376aeb9154deba783d60eff5fa007008e8110da2da56d8fbaba63727657ba279ef7b32e03c31eb792913ad5fa84dd4a391bc2f7727aa0bf120617c6244d3b41182ea3d2593463cd5a4f4fd38613e6e46e894520de8c53a33dcada6732bbfe7bf1d3028ae203e3129886d862042612ab34d6d7cfde61ca0b50668dc485232fab9f7124c45452305a3958d86206912de70901b99bf31730b29d0e86d573ac0f2de50a5bbef1b9056959767131ee9c51a1887fd197cc8e03913161ef049414baa87049890fb404dc868974b93e833d393a19d22f4c01f475d9cf9b9646aa323e7308bdcdd05e85adbce25d2bdddffff00b1d065cdf260b37da4468cacd0dcc4894b775d20125e42b301b430ef37e09e8509e1b4a55436e6377a4e321a97f92fb383e1d5f070e20b47643b68cdceccc4e5212de0f301b1fb1c6078aff034801e1e42aed07dd9a4750e0af4b455696159ec8e3176238cecaef30c23abb749f331276ac9df7dd5a3f5495441306b96eaa723075689e259c1d7b1454c69eac5a5335b7f7be791f4e39d96b1cd9e43135e815d7f9be52e20840014b3bc05ba7c420da9dd69ccfdafde9fb14402cf404cad55ddcbd47019cc93e6f039ffcdca412b7f0c4549589ab59b6d36daa54091b21c88527de982db5ea3caa45b1958a490e773bf5c4d08b2ebade784c25c37bbed121da779556185ef39416536f62d8472cb979c2ea65e4dc634f09b8d23ace0a03252d5553679e78fbc55c8af791ec0f50737a343bb82bfd571125897fef10991adc6a5b0bab1be40cda91f71e53215151aa46a5b6fcdb3a412f2d0622605e31fbdd1b76e672e517edc1aefcd88006c6bdfff45ca59150d7f32e5eb80af97aa12c07eb19ebe64c1b4c23beee2da5f2c1f79b1284043b55a418b0d31cbd8b0dc3eca07315f772f98e1773b4f9a63a5a6c5f706b2f4df482c408ca6eab895673d15e920fadd376dfca5f4690716209c96a70d16f0a2fdc231a582b980c9074e899fee619f15713e3133b1a042c227c1255694ead9eb27e62bde6c5bc59268416067023b0ef06c71225b726be92738357573b7b891d4d1c05b72524bf4c1021cf5c033fbf72a9b92a471fd1641f99cdd10912ada3d05ec7864667b0860d161555b10bba74f384d8cd9b59acba377ed406a29fae5a9e820f618e966c2d66bd9bac21e45e6d91b52a5d1ba0a210abb421b29c26639050790a12e35b8afca19ba6432d30b3ed0d0fc60fc465a5571551c752d8149e373618010297c98909552acca1f08248ec35d7b79ac4f82c06d64d8e124c0e9fbc03da756dc5cd17b38fb7510d02fb75250bdc1e98d572c25a9df06af2721ca990495d95fafaf3e9cffccdb7ff80de457e442875aedf1ee88760f8a326578222463b89b9cefa4b3cd5f782428c43408152380ccf9034d955e8ca2a31799ed4f81204345aee07d05d32bf314a6b267b9ce8841e8e6f1b956ccf49d370838924f485576d11ddf9c3199df71e912f61f2e25bbbf467b4c7dd5329d7a6cd7fce5f366e9b1dada01df50c00d672ad5ae2d9b0d40fcdf6"}, - {"000000000000000000000000000000000000000000000000000000000000001d", "001982c6f5c10d41219191b51edc0ea4bb86ae340b1d7b8bce2e1317e54df1670b6d4a19e245b4facebd17f2824e7b56b321e24051f48fc4509d1a28395ea01ce10e6f20def827a5bba2479a70122261ce13128b0e1dab2f3497929331b4c4e3846345d996d172e550250e754e3b9e03379498b39cb9f2e7d936432a52a91211f576b6e5043fe35893a4201d549d77467c619b12264d7e34883f71d59afd0f6769ad5b8410bedd4d0267ecbfcb110b5f8750b0792c1660bc361398f1977764f6b0be2cc155a11caa8abe54b232ac2c1d4815057556a09e2ac3cda0398b69c66af1df27eb7be45a23f42d8bc21105cab50719917bd4c816fec29b79e20a250b292352ad32e5a662f027d4271eb4319cf5a9105608f7c1d01d8327786507bf60b269a4d510994a213a16c62591dbc4a23e778a1273554e4d6b3c962543aab7cee11baa82e4a215868ce85599872fdcb46e02622c12ba08a61a69f44170b84f644dd710ef8e6722b44508cdccab7efcdc72c63479f6f3193ef8f5db0b3970bce2d00677760026ca9753ef124c10b8be4e13c65e852c29751f73e94220445f9a198d411b53bf02c5bf2738e9e991c48424d240d29967ab7b3e33672b6a767b29d86902da44b3bea71e5719e442164b2e18806541679d1f9dd1f8a233c7656e68dc27a743c325146f3b28170639d12963fd37c18bc2acdbdcc1c102c07ba74356090efb6d7c54f16a2d2f45d37f075c495ceae73fd7642f13bef5aff76cf57d8a938fe1c23b2d6f5864ddaa9dac57d3ff4ee857b772aa1e04893c2de614db16bfdf422ed6732653ec5ade789ced670fbd2b650e16e04decc4e27eea6cef95f40d7921bb24215bf87c8f4ca7b666333941f96c318541d584191aef425c3c8d4e526c2d9500e242981b3581ffd0ee66046d56c2db0f093f0d7d9705fe4133865cbea86b01dad4dffbc5cbe967a2d2aa2f5afca70be7fe638910d517ea1c09dfe3eee21725ee6877c3537bfcccea0dbdf7d344ad038b8b550717245a7186962fb6cdce1048011dc7e0f1adf32502ae9828596cd43ffcb4b9068e67eb9d4a6ae4d967e2880b1688d4c7a8ca42bf3c1c0e304d2544bdf9d82990ecf86446bb1a9a71b606ccdc05848d82d8eb7e511aeb773b9143f3cbc1661f99343eac57c0530c9e69abffdb3bc2b2bdfaaefa0456b867799ee0ab2f2913a1a9df7459f5b09d90bb05f5447c2c051f818a7ae0cee8a44b29d0b58fe9cd0ac043122912bcd3b7f8962e2d5abed2f2bc57f0ca14e51d595207c25f057733fe9a46d6f92412eaee690bf217e45c89bf529fe4e11d2672f0a48b82cdfb6b4ea8e50a02a838419cc0c7d9215d40fb25a3be8f1a2c9dfa1c6c54a2a2c161e3767ee7a9426086568a1567e67d974db3d1f5e9c426e3dbb8f1df6791fc50fc02b39f1b796a0983acde22218d440dd6d8d99a772d3a47dfd29ecfd20df89c751998fa336e0ece52245220e9ce50aacd7072aaf354daaed7bd5da12a333adf5ec9dc6fa3dffb6303d1a81a5070747f52511b7797042e940a16a1d7d5a030f756dad15f162f90b9e9a306b59aedc5e0622f98e472c28a6057aae69c3ddb02060e4f07cc4317b3ab0e7717676cb0e5ffedfe26442395194af8ab16536de8d8c501d7499f578c3bade903a642db47d88015b509167bef5eda5aa8331a29bf08d6f1779cc5684ea04784dac7ed402d663216475116449470112e624da3ff161c2a4ef1afb9fa9ec90b1e94dcc97447e2db5cffb7546c6c7d5721da5a3b8a05a453a6a1a28c21a340d168ec38f7665be79fefb86572e3fcd67873f3ff91377229e9329744b63f088e15a76ab7a1c98ec39b1a55421639d522866b39847534e06b345e9f0e477dc023c88f5ce68d131f99965c"}, - {"000000000000000000000000000000000000000000000000000000000000000d", "0138a0856a0258bc573f40e2176a2d14b3bb4dd43a05f69537ecf8746ddfaa510465934f77ac291dc4e6071114cb64960e33f7fa22e7cb6d9c45a462af81b215c45b190c89091dc7d1347a61c7fe5f74cc3e48fc0209973efbd3b29551f473a379243b05473995c03b02cc9ab2fa169b750af858c957515c2a496b7d5c3e0220c5a33f902e98c10a01f4593b76b8b1e85650c602aaceec1e034ad55c32a2056d26418109c23e34450357071b304b220dddbc82535d2ff28efe8c9aec47297624206e38425fe0a0e8430ff09186d40efa3f96172e23765e654a53a26f93591ecc1e8b01d4fa90bf2e8f778640984ad900341a7319de6d22b3c8576b7912b9ff7b9c526a319724d22317ee7f3dc0bd9bef0e783c440b5763bf3334de58bdb8743f0ece08b804931eeeb1ec4d9eac37293ee61016d88cd6b7ca9e9cb048bad2e1469fc4e1725fe65a27566925b80adb2d5e03dab2a096caf2f67cef633cc89fbded0e011f364c5d7f47a5721c5c54f9ffb6c986578422529b34d25f114aadb712c6cdd08d06284a7379093e7410b468d02830fdd6ffe803214f9b48f6964cf65edeaff87a9a21fa0bb2c06963cfbb4a33173571bb0dba4cb7a7792f7216a704a2efe9ae2973529ee5e9d5f90b17200b2f2b359bece580739001343741be734b53769ee42d55e8a771b458801ffb28d5c6d0dea00a020e9479d514b7ca486ee038a7edb00c039368d96f73143fa1a25010237eb358b631f3384541eef5650a04e8198835173d89f0cde93f99f500f27b25b2a5bf155ed924ec45d3cbf58bdf875d455f34f1c529225e6e62d3d4a2162545c7b92898fd7e3fc3aa99e657019b759a678a3f03f7465ff76a53ce7e95c544b62cd68afc1f197b2884f447016bd3d9f608a2e3f4c5fc7331bcbe7e1a3f0d549451ad1559d62016e02959250e00ccba0dee02015c066ed1d3b56df182503641103165cd30b2d3320adaa002317c0fa09084b04563fbb31a3c9e4e3c21d91913fb08f9bb2414b55024376fd61c5813850124874b3970dc98cf9d79d61c94f6d2e199c0b0d2e80659b9b1f2060274e321d3cca2e3cc393e509b387f296b3a8d9f94fa2b538535f8176ba38985feb40f410b489f9139305989dc9533463bbb8d221cf294d34d1f9e3a4f5a6ee941fa7056e6d9e5c09681e679b98504465ea64220af513c79f276fcbe1239e1995118d63d91921f82b91713de5966a0295f1a76f05a77caa710864e7c941f2d950dd0a24d49a4def354ab1b00151c9ec7f32d4e9ef9d97f55271266b69e6967d9fe63087e728184654bf38979e48c2060abe5904e541b8117872f5d4008475940aaa24c0ab49935d7559220101545e63e30549685242b72696ef93e1dd7c6bf4426208846752a5a7813911ea37c14a538563ec93d4a28078a0420a889fcedb534b7840ad8eac6ebfcde5a3f32ceeedb3bd37d1d1257155ecd35fdfdccb73a92461819f59f208a2a20dc0913af76d4a65d427cea52b8525c97f56fa8b181b953654de94fc8c613d576b2a811267d9871dd382df1ceb41fbeec873273d9183cbe2330043c8c70dd09ac988887b85b7522b57f5dcde012f8e3c411c7e8d2bc1dc99b02d76916d5549eed5613b466d9f992a945f86be349326279de5e2dff24980db6e4c7118731ebb852f24427c155a5d53d371ac42761196e08f8dec9ffb1033506f42f55ba41f50dcf2b7ff2cf05556be7cc1c3768694937d2b82378150b4e007c9d66553e5707e835862e3898cda1a7b69d6c0fa6f2c63fedcb8180e5e28a18e21f91b47cd3023728c085cad0648bc9574577f4b3fef58730727de5bd2e0a61932ecf50b382cbf94fa1f01812d32a57426230906fa70da0821d6d5d9ad55fec6d2ebcbe58c081"}, - {"0000000000000000000000000000000000000000000000000000000000000004", "0073ce847a23711d6e938079e77e38156f98b3e5d71ccf7e587e8efe9d5526139ecfd1427d8a10b5c8061f9b3ac9a955e929c4d584429969e54a28cf9cc9692289d91e2d58a2c5638516f2b6ee8fc34de6df79310929b5c94bdcd7c5494841927b4f7ecbf4c01fc1d819f55942cf60cc9f1b7b849c3db8075692d35e4f820df08cf004095f1b2221130887e03ff164d538ab28105d4233d4b284ada697e11c7d4c2b6d1f492d787606f0747ab29c830ef6d6e98f4376ec3eb50ffcd18308a6c1f2d6a1b5937778a57545724bd6d20df8fa4f22822b42be8a0ad4c0b174b0e0729b51bd7bbb38fe2ce04306260d5d1fd50eb4e401fa0269dc722f4357121fb99fb3d20fc3ae20b2112f6b6064a06a3bf8c24ad12f0cac9d386fd787577840d1411ea537baff5f150eb3ee240f753e7fda62e24af80fc76327fd743c40d7a25605272647cba08421fea33145bf365b95f702001e748152688b4070d36e4ae22e3cdd388f082d18a9d1fe8808759684b1841e75ae9345c2979d55861034c2a4fe138f950ca52b9eab615d039f5bfd9e92121b8b11f1dc0c4b811194a66f28afb9dec4bb3ce60c0ba0626dd65067f1a141e17f14115e743476bc2a0dfb7f1b4c69262b6967644db1d85df9943173d3db12ccc9999ac8e6afa28dd6d4763f245636b01256401bf5f2da1da3d54be7c6051fcf339792846377b5f60239220f1329592d82a19143d1792389275b954c9d12369b26f81e95ed8bf6e6cc28437b260013bfa6ba0d179ae6b25ab13753b00322b5eaaffd63c8eebb991b110dad898a103ab178a3533fd517d316ff393b0f0e2f41a21fda0f14f9a6b41ed0fe47e5ddad3184b41e06cb1f608de6829aa7a224541f50564fee754df517fe03afb22414bb37d135d561b59832e9141ca6fd60ef4f831edf10079f271a56905a01ced1545adaf600b4634ff46ae7775c10953d475b1d0219a05836eb13b8d2bedbc8443eea8c98eafcdb26dab9c097066105fd6e40dad3e48916408742797d2e3abd377f8c68063cbab536cc3c2918560203375cd0a24512f24a5d07e7275cc75a6098d71ca119866e2843176199fb440b9a3fdeabc44f84c65f05fec3dc20ae03c93c2b5c0af3d11a5303c3d85bdaf6221a709743d07ebf717b3c81fdd8e9e19d4bb56a74e651e05c42bfbc7b17a6029140dd58cc80b784af4294e16fc494b49bdc46f416a7ff7988dbe80996e27357aed273f54244375fc22fb93c1651dfa4632e4a7528ad3f1bbde09f3fcebb2ffa7f487adb69e5b0afa36584bec900f116daa72006c4853f53c88861d2f343eaf62aab795c08ae4eba1990496566e2f23f9bc6f1b40f3e7aeb9cc7fd28410b4843eeecc6acc67613a2731d1dfd88fa3d516cab1043c3df8e39ff73e420c25aeca1854763e73b82e5027dfd7a29c8d63fd697b10384edbe0c60e577c8c6241fe4eabed5335d965723b2b7abf2de0217f9bdba03bf2b67528810c5b9f8f653e9cb36760b81d4c2d0385a156641ee1485fdf0658606ecc966f6a3f996c8128b3fa09c8bdfc2e4ebf6886df2f17ac71c5a30092f1214c86cd7a2cd529365e6b361c249ef273f57d01bf2c5dbaae9eb5989779434c9cf899e5c70bde1cf25530a9b1a54a8d7a253e989af7e0de6ca0678712307a22dc48f88b583ac3f959316dc7832783e3d48ed0e4ac8fc372db8b3cbd7721de2f746e36ebf1c4162080d19ba19431b1ea5eb116fa6ece210b03eb1d0c22e0952036492b4b5799336ce4ceb155efaa93ecbfc07b4014b724fd1c7514f90d0c2ec20352cc10e855f138375850cc7b8f79b77f36dfdbd9b52a2a11bc9f012aaa7b703df80cd826f234fb9a37769080088f50319d5258bde8d03b8b32a3373257e71425f657ad438"}, - {"0000000000000000000000000000000000000000000000000000000000000000", "00140807646d0a1b9d89b0bbe52fc8c92d916dda350c8ea5791832551bd96151875b98a59984f9353a960d505ea00255724f0672023705fc95d4eba1ef444e4411feb9c31a16b32813947c547ab416a7777cbd42019393490dead3ad9b75242c7f32bc86a69efdc15003c61e6fd997e11db51dd26b8dc44786e1e978fe500b98d574ca1606891f6bf5e16650a566d067fa1f581f94eabe96df1531788fc3d1efca222356f65ce9f50037179d8248f16fd97872a79a470aae88d9d4502d12b5b45d06284c5f4766f35a37759e2d06d07ace8c0c9707e4610639758f15443865d443677c5d7e7404340e8d8b18de91275712c8a78dcf7587de101ef9fa0fb74c4dda218263b04916665fdf662acff95e8eaa2d643758d6a2b4676995a408f3b75dc5edb0175dba24e86e3b52cdfb44ba88045efa7b6cc38bca5e87f13a135541ce13c13ca654d4272db17719de20b57b9000344a48b3d6ced553e740dfc937be6a46d3bbca1320f8d3c6abd9b7c0f22bb4c937ad60bacda47bcf1320b96fd2e197d47316f9b38e185b2d2dbbc01dee98247e1d1bb6d63143ee0ce599737d88da3bd7d2097f0fdcee087f2aafbdb7e1255b85ee578300dc9c1a59240e07f70b5011b7f01cf7faa243de629d7d9df9f52500dea870a4535da1ca5517044fa34d5778cc628036061c30341a3cf973f03471cd538e893c445101be00e2b6ee17c936d11f4be16ad1e6096d5a7197c0950d2025ae30e31f45ba2073fb7544f7ab56e39e0d4b14ceadc69f9bddf3d11263f7a82fafb5f34e7dccc919a40b46ae5f21c7960929980ee1d3cab7d8d9943605ccd4c4b94d96acb467043689b599c5220ed8b8713febf5bcfbd08a670ebae6134b3441bd982bddba20091881a2fa0ed2432ca2617a9e3149b0d9f7d1cd5226d5d9d4161f0603e93d63fbb2bb76f582f2f62c4b00c01a06c6085b6c80572468c15373de749d1bf731014aa36a258793b4c8b2d14023581a8878300543db1513b9b465491fd17024c31212664046dae69ea7ec286c3d5ce78cd29716bc94eb52b99b89c7ceb49ead0ef93eec581642e78d6ed2ccc222fcfcbe718ee03b20eb852084269a23e556187bb279f52a3083326185122a4bd69fc87297c377c136f6ee58ea2b0e17650a21c79c42f035ca1fdd9e24b313381bbe541a96bbb1018205faee5b85470b2e72437f9cea0940583ef84014991e245b1ebf6cf75752f15af40a00c32606f02106b59bc1b20a828c624ab2ab72186096307cd92579170768e02c18a142e38aa63355ebcd6dcca54fee3e046902f50c4e4f31f062e80c6477103ecfcf3b1a2411589cacfde137fb752e76753ed12cdadd939b98ad2b8102ebe8d3fdbd4637aa233cec36dece781ffed634374c0dfe0ef303a1a034b5127070520cdf5124c2064148bc8aceafa57a0320a27090aa91944899d0980c04ad60a8c35b4857474a6abef1cf373719da9ab9078429513f8f33c3974371d3118f15ace42cf7791116bc7f1b1929e721a47f192998cfb21e6a8d9fca2f0cabf24974c8d7a4d6d85982fc7825b66814d91cbe3716f5e8ad18656f49e154f46a74baf5d9ccdc98fa30a4672d9ca03a79ce7a13467ba09a066f799523f2529cbab77fa7c615f02fb5d3875cbf5625dabc79dc07b2eb45ba22cbb7b6d1c27695261411f3a18fc636179585a6c912cbadf592d3be343d7ac53893acf5c0093ac7d839ced4dfe2c2a11b41d83518c08e6b63901c5d3fd5f1260ec94c06543629bc2a5e8b39dbf860096728c062e67397b00c13c38078c6e90fca7510d42d3b9d534560b2e7f7c8442bd3db730db328575dda0fa6cbc2964c16397e8de457bc5ad7e63f189ff44f1488d6e7c74cba0ceb9472b4ce2efa7980be182fb4"}, - {"0000000000000000000000000000000000000000000000000000000000000003", "01361cef432897756afff8b4bff80936de1f78efc804ee99e51fa14e9de83e72a511273ba11a6f14757c03377c6353c86eaa9d000aa67a65e2cb0211589334359167eb75eb9a19651135561b55f995f43a35fc2601a2bac1bd22523d8f0f326c407495f196f68e29092f3f1e052b608e757067a7f722cdd4c6a24bded45c0651e4d529d1cf515a40d18d2aa5f03292a4b8190717f8a7385b979bf0e00cb45bd5df737970532d60940609c5697f074b4db16db3c01cc16da94bf6775e3d1a769a0306a3403dd26e6266777db3ee01d633a6bd0db6d0af0173b5cdd6ec84683d533931a93f7b64d61412e26963926915be3503a53fb61a262da494676f0a759ddd89cd67af3f113103ca3280ad62d95da5370e1d6c59d26c0737a20632968c3a4d64fa894cfd3c1986ffd42ac7d61c5c0669da9ceda0df189b3b939f20c53e278c9e0e39489c35241cc7bde5bdd3b4fcd0043661e7569710db0f73f3c9f9548812b9d23a5f3e1b05a587e0525a18da21e30502b06a49f61375643220acd1964d2f00e18931226c89b6673589e1f2ca8928420d14752796dbd54b848626fdcc21a90d3b82500aef77016d70e779dccab19f5ae3fe00b613b0fad52fc40dc2f8e69aaf35e633850373e83a71bd5905c00bab4fe74106cf23c4f003129f2c5f8a9de619e10055c1c7f1419880e4fcb589ca2b500c5f5e085c927907bdbd2da9c841cb9050b3b37aa2e22d807caecd6a153f6dba2c88ce61248ee242bf48fd25c35ddba99a0a5f060773916378f3710273d62fdb064efb19b9051e28a3721ed6fe0d265c2200feb6eb6aab97dd10320ff7bd7ee4954c3d94f134e313dbda3e8e7897571b121128ac2ddffd79d1dc577db7747066e4ebfde18712aeccd67d2b0d29eefdc1f6fdd8b9522ed571b01915051313f9a42223f8c501d516fbbb88ba504daa3d034f35d8779db2252100f04fc10b9e552653ed7a041910378a90eb3873faddd531fbc3f5d2a772591a980bf9343575195d934e7b524b9a12ded9afe2f3cb8910a3ced5a1cf8030baf1722a5a602b00f1c60ded8109f746ca7b680aa56c03e7d0c4ed122e3cc0f8791a1ee5bb4b6bf19f31f35573754a200075f156f61072181d933cb2914539375595a4cd5c3fd5a93c3012eb44ef3ba9c19ab2a8e732a8723b54538b903f3d54db0466a277f733ec0bd83392f6015ec5bd02160a4c9607ed12daa3d30bbd4d5a30a405d6940969cd13200529963655c7cea9bb816194f904aebf3595a5f28d652f3c2ffc6fb7d037e4d8c50686e4651ec87dfc3a870b390a86188c163389434132bb8c472d6ac7191a623c5efb5cac198f5dc90a5bfe717f757f0bfc3b4ef92f61e4586b92ce95d25c5481f92d34f94b7acb442d4ce94b00061b810b2933a503deb87af9ae2af6652e05331135442821675f7901651975fa95d2aceeb0b63152938260d5dc7b468004e4517e9cf5438e91b5500ab1fcc49a4f1a85f7daa118bd5cdd44d3c34bc9651fa7c168de4f2584e3b45d4f9b6b87c78b207d17ed05d796dfa3165ef5fd13c629024f0fedb1d9119edb98e11eee772b763feca48ab88fd73d0f2a231951f313d309609c765e61cd42a2fa67a355563aea96c1542de1a9b9045b84c3f5f547ac30d7443fd2171f3f7e0786656cb519c36b9617a2d90e7dfc0119b171f15c23dbe1d85f537243b0d9c26797271b6e97b7bbd7c312209cc2936337ef1ddfb3921ccc2992667cfc5e816ce4cda2cfa520d7ca919a4aedeee43727d87bd2ee0c4688c9cbdcf8cb611d42354454c3458f47b8ced119a3234be6074fa277477427b76cb1add397b07bc920b2734a879953b733f498b2985e2a36db885ce227618aaf7a5c5eaf53942a38e1507ec1c64b77d4779a"}, - {"0000000000000000000000000000000000000000000000000000000000000019", "00378ca5391158478a8ee432e3a62bb1b98a1a96955ee08eca2ab20319fffe8604c9510d56b1fefd643c0d8c16581b455cabb62487c87d3f54cf534c1f0a0a0e137917826b4e35866f7468d472605a35209a2e7c06b10a019177ee2fc8d336eabdc8802fb5f9de2a520ea8cdf2fc652a7fda9240f59a978ea3b482bdc82e09ec630dee6225ef956340bbd4a6eb6e6953b496ba0e6ad3a9af131d52feb9b15146c263573b65defe3d00b72602e897766501c28b780c77a06367755ea3fc328eb242289f3945b65d4bfc3cfbc7db4a069f12480465456f84839a0df26ee0945c4087633d7c5beb660b6c8ba5726632ef58f9e6db3df7d6ee9bc43f729a0108132ef75d75c5fffd93871ea5a286a906f7dc7b2e853f79e9dfe5edb98083eedea32836afa75998200ca97f7ee2913645764147a65e3de04e0acbd5c7030eaf1ef97e92109f86b862bacb60a449a481d54e3d007406ca1e1c7823bc2bc1ab98583e760afc591e39171f256ffd0f657f4593f502a52e3d4e6f307e96e813fa937ff4c8486f585d0531096782273009ba97d01c1a4b7804177858c5ef87fb60774d8ad2c939066c047a0113abdb216974fb61d838e1cebd2a9c7354c704a6fd42dd0a15d176cc60e4a2636dd4536e67e3db13d0829f439181cb506df2282592a2952e253314d714c24c01d99c50a6f49de45c67d15b955bc4b90d4101b85258cdd7c48368d5b43b2fa629d5f6f93afdbd08717430c6e53505db1747486bfa815224fefc12d72f001b4f0ce7acadd1aae30f6cb21ffa7bcaf435026109e33683daffd9a327f66218520b4e94f63ccc761408a3af75dd00736359632fddc024b7206ddc798a2c975d19ed8bde7f557093f6842bc0a1f39b73f08b154a8d74835d2e898c35a7d35eec69d6356a59636f1e6a8d4bc11211b909a512c6971fc8fe5aee9ba78e0060e993690bc3dff3a7646f6fe31f32660bb579040ab0cb8706c6f46d0033821bc4efd05612bef6f5c4090fa38fdc0a3e179732d1c846ae969ceea078387039396be647d4b133bbc6a88101d0c43286fad504ae1150d3c3451f3bacfa8ca39b452c45c1f6a3bc075a19150fdb575362010f11750474cc7d5af4b9ff46fa122ee5f6226f4cbdd1a8d6044bb0c75dcd8bf9208914edadafb3ecfe9b718601afad45e36a20e01f25790212c1c5441b41135495f46c6a606b1923da33b8fc09c6ede4068bf05cc20d05d121c4f149c3e533b4bb10cc15bc21c75c5c6e8f853e59bf41bac2d83b9a95158cbc57d3263b2188a3535da7ff1c7d20c58cfc3211d28f4c748b01e38c62232039e0e279106b7656203e2134bf28f6da83e483256585c59a22c659dbf9c3239ba2af7ea018838f81f23e133836512f6b91ee19497c653a77d4bd10da689510c06493d94bced10cfb013f5f86540e4095ab4610b62a4550b18a2676ccec1b8891bea9dc840dc8c045672ab52b2e75085cbc9211f130977f08c7ea7e2312bd51fd024dd95197906c25a22fd97d1f5205d48ce8f575668d127750bc6bbb0873b077972fee59e6ddd47dcd6a9c554176ebf0ab18bd5bb05de6375d57b6a1b339ade071bbeed3909a19be419be08de951ba6cd3179fdacbb8fa404d228022ded3352e94420efbaba35243ce998705a49c1bc50a1bd30ddcce403ef304e1f8ffaf8536f29bbe44e60cc9c0991b1e30155bf4932403626f0988c2b6b5ca1461a4f792d5c5b8e886fb1e0e60f52edf08fabc752a22449ebdeb1369897ff723f843177fa57bfd2d9c0e097279ecd82c576a4f658fdce65186808d9a1a10160b2d5c715b3beaf5e3036d5afeb58377083c3a3b1398d509b90a8088dd948314a1681f6e095111c7f24985a37c72a724637ac3963be8cf26e2002538fbb0"}, - {"0000000000000000000000000000000000000000000000000000000000000000", "00d28007791c9af38960c140732c62051a49c9cdb61d06ccfe6019b51b0050465ffb376fa2489a7de70417f2a6d708966313dfb87284bf773a40aec03c6a603d5c4f4f30201df385c8681a934a8ca707611d28fd059a67f102b476cddeefd2e1baa082431a0abce6c31f5779e77854ca5fc2e701f76e24b79d837d7ff2d63e29522ace5584b9b3dcd44ff623972637841e217742db6eeb1539f0a3d27f9593cc6ba239b6c35d822304ab5d630f2853b5b3b4526066ced3d1e663b8471b16a19ab7eb92cb5d6d5a121264ab1b4cd426368d152794fb91dccdf9e5f6b2b384fd7dc36ef42b3ca83c4f1e3d2fcea6a589cc67f7c602d7871e21be3e76d00af57e5b0aaf624dc0aaa758e0d177a6a452d990811f77543e8af3f76dfbb5247ad47720ea089fd85d020d936a4a68a9e1a1ab4643c10fa40b7930e94db285109836c69426c7abfc9951ea55cf9b9c8cbd4fae8102ba4d7853ade2d1cb71d376ae1ef2f3647adc36f91b23fbcbf02bd231631bda1bdf6f8e2eaac535e4aa0f1c6be54a8519bb40adb3d4f97dd8e1ef966fb8511539713c72e57c21a17ec7592d4f33eaaa8bbe74070b756072461329cb306880f6907aa2d0edc99a03121ffc827c25a1ce5da0fa07738860799a4dc77eb6400c31a521467c192dfcc734327e768c22fcef1dacb71bf05f603462e2e73bbd39e004dee232e7e19b34300bf9d87975eec8d3cb00a3516ce1753166490fcf93108026435b6c2a69886a13b122aa3a210724d4d0f5183af1579a9012c705bec3223cdd599cf7f39b0bb243e5bf4784561162e1db25a8e37935aa6832bfca1313a6734c4b8b4c5e90dcb5410942943a725b5c18b217dd9fe95c6cf635cead76950dc518f6197d57c00116024f34b014a7b9241e8276cf1d3ee0d33d485b2922f4c7ab63111eb9b898451437b173da7cd7d4657c01064765d1679af555059122e8eb89e59b2a0e51fe19e55351fc64beb1f033773f0457abaaf47f18dd781347258d57c776599238a243d1767f0e0aeab1112130b4cb887d232c11ccc984fddf5a2b4a036e3444180451c7b7a79d507fd3dbb15e6a4641e596ad938df478b954fd2728cba9bff22883057f90fab1f17d9c420db4547c913b2b75d9d8e297ea28830709627ce55f2396a19aa996dca2f574c6cb21d69e69c4867d769704548c9283a214d7acb2e1bcc576b97e7796d57d9d2a6a05db8469fe039d70656eb13cccf1ba4dbcde4e130d78d88a351b45c05709c89edbf9ff131379b010389f5eaaa29e2641397fc81d68563c0eb0979e86a608eaf4fdf148fcc1426f922f91ae2bd6e7e8bd788f0b0208b75cc97caae607f259a52bde34b0c4aa83bf2eb8197a3b52b62bd1055a684f7a280edfd199697b5a35172a21f1f3b7a84a0e62e1fece9bd7e33f056d045ab02741eb25598631606a1fcc26067c9658a8f03e541fceaaa91755c06c165ec4729fc332e8be63fa0a6182dbcc241dad5773e5d777fc905bb7839e0b1128b043858d9f8fcfab44a5a493cab065ca12df9d0e0b399ddc72d0a16edc2262cd1ddb460a030096078639b1ab251acf1265aeade437c131ad8143218c8a5b182fb2cabc5b419cdb5c53e689ea67912d76d5fd4922badc05e6d25cd6b5fae2625452290cd5b3fac3550612c7b13644386c52d2d1438b3a4e92c15e7b23de343ef7243637d331e545b47b41e71adaba50d7992a13d4e9c9959341512b28d5791cde58eaf97b7dba73546963c1051b2f3957ecb58257cef9a65b1c1b9f6906f1c75c02a7d323e02c22f86829da5d233b7417291319057624891a7ef565249afce5eb3df619d5fbc52874c95d750e55807ef8029234439d34dec52c12ee2f8de44f929660c73674b783e16936c203ed17e1e7"}, - {"000000000000000000000000000000000000000000000000000000000000000b", "0052458b4c50528fd3ac806b923e9d4903087faaa153ae9513c35a6505e32c37aaa9d46f171da9fc4b3c1c035af8fd5bb97fd1fea73171c0503ddd9639c98646656605f41a6b27f26fea75bf7ae76bc7ad3ed942048ea937d5a4b0fdb28a165e31eeb66ae9363dda9c6e1e85a2c5e60b95b0a61d1f9879021371c9bd3bd40afbed9bfcc2f6cf86fbc21e36b3163a3aff3faa504d002595211d041d2d97586881eab5b26216ba35be0179e791e2db66a71a83f040070d246617a9170a91148eb58f126b86f1e94c956f5b3b0f0a5a2fda62321504b59a170cab78d852cb2a08f707ef037a5fe8ac35238bb4e9646e21faf8c38a68b791db5c9c7fd23b126a4191b747a93fd9b0817ecfd975b4e60b734dd16a143d74c0610ce14c0b68112a7fc9fed1397b00b32081ae651fccbc074805a2146a3344aa51925678202e037e87fd2ff475bafe633e96bf12f57c74b6aeca024d43046ecfc7c0bc34a1779e1ff531317bfd92a313795eeb53aa97eba52a027d3d21e754c63bd1989922ef5df2bda5004b5277259009d90861a7f835ce5e32cdfb578462c8b517b9b36addb373ed1b8f785e320821e292c286305ebab672fc2eaff4d96fa895ed262bce6eadbd2b2e7f7b2b59148f61ee7b14da7cbcf91282e95ca8587a93c475f263f3e114e0c097759791358956160e5a360f9f7506d7b8434a8ae7709c2bdc039518d6a055ed41b624c1d08c3891b8b193e5b2b836658e6eb41a1d1deff29989247b1ada95911cd6db14eae39904ce9d79b737b3586be9d3c5c072efc24b3d7a7c45f8104eefd1753517ad462a722ec917572e13f7dce6674e493ebc03642ba6b839528151badf843181d76fbb27ab8ba80cc89f6e4a4992ccdd3af0362ac8ba396c4f19ace7d536fdb6711a16f89a1b13d05a115c14d567f939fb1c56ba71f8d75f385d9c92ab021d202484a4ba91e406f05e744db19889dedc066e44d01a63862fde8db5343659b1e0a6b199c195ed3623fdd6d2671db74551a40514a7f720b27af0bd5237289d6162b9a1cf05b83e52b1421896aed6f57acbe612bb0928121f49e1af4be1759a355a34fd39fd310b1f3adf3350d3a4db08b941fe3346f19989a4ff962d15b359fadb689be78c00e278a7d056d0c39d72e9901c4a6a83221aa42b20cd825024fec292164335e12403224603b88ec912e7ec435363367bd99b451e75a0120db8cbb2051d884ef0c29a6b21169a7bd49af7e3195a05e5ef5181f14b3f538797b3db9917e9d5693b219e8d1c3f0d5156afb0444ce6b81eea469233ca2c09b6c08d0128eccf505ae36085f3109af5bb58e2d61b75fcbc869991dbb55fb1cf97588a1e471014cc280f32b1db9a1e78d5f1bf03405aeb59ee4157ba290673f33c23c5715031dd84c96b675bd90ebff459e9f20251bdc256c9a27d175c892055f5342a5756763da22d87d5e20e9437f3605155819c3c43525b47389ff508f1231c81ce1bd74af822d441ebfa691963343d66154760c14b59611fce70f35116e1dff29353be877e10989529a7cd3224aa86b120d466359261215ec5b9131e0e61eee6e2fbaa5aa88b6fca9ca6a9cfbbae5811ed95b6fe487af466f6d1dbc65eff55179ed4ede01515b4273f387115d4f2170c07d4bb6669deda428f1095aca7b15169f9e82299176ff820627c783adeed3e6d6cc05426b7255121740247c2566574a859b06b1507dab3c11164c59a8ad22e32ce733e35c45f79002aa9ccec3937b32de2a4e61231e9170a6a29344b8113b1d1c05f95d355bc2f060fbcf7b8258aec1defc41f3cf6bea7e97233b324763739cbb15daa9034347d21602702f8112dcb15c7678d8371a6fa6b2f33a1ad3b3c7f4c9c62ae93fc1a33b4e3befa15a3c1f22d5a"}, - {"0000000000000000000000000000000000000000000000000000000000000005", "002c16d9ff4adfcf393db54e00c203fd5cf5942e052b1f2e867bd71378d2d4f57092fd52873b345ef4c608ff8460bb1f0931ad7072bac4a9be89197b1209651b1d15d793d5b0858ff79209d54db17b29e31e1d300b7a1cb19d5550435bb7446fad775343a0461f763a2a2727f4235de4c33135f2af73cf066679eedcb9a30c4b9374ad123d03db18b57ad9c52911bc1d7965891f70c202154b75d175ac84b00a3b86aa96fb14fa6201465909f940d3a58329f5ebdbf9da4a217af4c9942d477a31238d2c4fffb04468a4599dd269c35cf30e11cd74fa4f4de5ac8218a5bc2ffdface628e9db9e912e721ba57d0c3d5fe21e929dadb8966c0adbe6bec06fb54252386786bd476b0caf421e96a5e73dd090a1a5a5e6f1262f4031e70294fb474a5ae5c9717f0491726c2490594e83f4fecb2dbf7186ac1c4e43e75be288a2432262eff5dc40674ba5d41bc3afd58bbbb450501cd74e301b41c39bff6d79961b21a02a3177c67145c8df958eeddfb8d48083265ec88a24ecbdd9c7e141b20a21c19b31b6370038328df465947df56968c17ecb3e3d65ae5a11672c5cdbc7342b5942e5a1f3506e365e3e6c3cbc31c3ec13ce93f0d59f43abaf52233af5d3d765f653dfb7335cdf47334224e0b17c372155eea9d93131ebb9be0753859482165dfeb53dece26fab693ef30b6d9db2302a81bad8f2eb63c75feea052d11c22c9a1d6b8221f140ffbcf6407f75a638623182270ba69ef8c93b9b65a379dbe9ed87211596451a8cf4b08d4712d6393b426fd4179144c52ce94a9427457bc8e1a3bb2baa2164a48d6dfcf1c2f8fa2e82099cda969fd6d81fa77c110a6cf6a92187495cf41423996326854f3dd4ad2fc37be9f9f4314a70ce58081108dfd106c9fa9b654821e37dc1841a7b037805a839b5b4557615f175871e93e1e83d43cd4553d0f25f009da403e94a623e6f2b73bf902e1af51c6b73ec330a3a1a86f3e8da3bf532943435673b5d6d4c708df90435a471bd0c93f55a66f0897d14ff516d40f15aaf44bf426226ac52d3e200c4b6b9a8440d482bb634c201fef97e2687d9c705e443cf77fe50d26628beaed07874bd40b9a499d5a99068936e5cfc327fd3b7f7301aadf300c8abb94fe950d1f231a6c6d0d1f06ac991207aa9a2161e2a0f694683496cf4f23b9ed8bf613b01e2356c0937865def5952a2124a6249fcd2bff53b0a7bd365a4518bc3509271336e442162afb2fa1c76114bd712b44dddb9f32de1bd0556974d4ae8d30e3d6497e573b4ea3ed99ac7980aa16257a7bb8e7f15630a53720fea8d9ce78a6e033510377b4d109bdc083947264a3951180beb929427e2814eb846c24b3a1bad0f59c9ef2c077ca1b344f3e638260989dca0151c2a1424f113ab9937bde5b8d1990b58c8c117e67e18ca01f1fc29d25aba4f81a2f30db232032e9010d5948527bae16c3e6e9539be7c07744dca3d323ed01d34c9050be40f2fa49ed73829c5af1459b8f9d0ed1fcbf05157ef214b28bacbe0189896eccdf8a3ce613e8baa04ec26d14fdff083a0f1d338c2c48387548d1b5b1404fad66ed0d6b1df43b031b8c05020dc99584879db1c72cf8d07de03eb678eb4b1deefd56570404d40702560714738f49d31a90e246a2aecd6d53bfe586225051c379781d186dabe5794a923dfdb26acffdd4ff40cfd3f50abb9d587e9c9f453ba484f35a7320ebda81b4bc482459f6e5f6c4c34a88edc6039d58a3fa6223cd41efc9225b8093805b444acefa91557081e863412d68df538171246d3ddd1c18d45e3e5325157c63918cc52e317c95a47dfacd38c2f58063ac82ef6c8e01a856b9270c75e31fb6f223623ce37209a1951abb81d0c3a9009d49e555eab55a61dec2f91b959b78a5e"}, - {"0000000000000000000000000000000000000000000000000000000000000005", "0032751e3a39cb33ec0bf2ee53df80315fe5f3a5b52fa9cf924e1303b2b1e5f9159a5e233e61cffa9fc804de9903c30205f5681676f829ec35ee5b06fe9a3b177057f3e98d417dd42ea8956d7b6cde7cdd7f59bb0c49394516a75f1d57852381aee1eda9510818155a2572f1b7a40cac07dba68431055fc696249d5d54ac349f5d6c84d09bffdee246d0d36f26a7a3855d56ed5776defa05d8ae3f2e42870578ec6367a946be87b300db64635eccb974c72ad0963a35470abee338e8961d6c26aca18d450142d744693b7f0d9e7bbffcdd531f396e2591e6b59785f4a652335b65ba6c6c9f7fa0390663860d6706376d36c3d8b26067051f6e9fc01f071b7a80a1cd6688dc84b59c596944b97690fab40751ff137b2be45207d35ee571b754e43dfda5549fd60f6c4369a96e66ddc64e99ad8673a83acb90bde74e1744b3de8a0698f87e0c866aee3833beab663ba7960355c9b6889a98379039863dd536f015b79a9c46450515f79384820773cdeb25142ffb60d994534ef1851974e8f15b1e62375bb1b987bb76f2136c469badb428f9fe9ce9d61e4f32b1f4df4fb6c71d8ccaf8a01817f2715ff7683a4f4d48450c39b556868ce5977ca53426fc9829e8ab99673c53a4367618da6d1153d8ab19f282e11f599e5b8e1f23d884f7b5aded945ecd605cb07f12b0d730456792dc1e45e9c173482d9eeef803d573bdda964d0ed346c077c88706f053d9e95b88099b6e6ac6d1a627f7c5a6089dc2a7cf038bbe1d70054edee479d2e177f4993430ecedc20ee15657287a353ffe5dd6a4a139b8a1c5bab06aed6a40affd2966202fb920e7cd92272b8305b3775f63c6d8bd38f128364613a0909231510e3336e103fe8395e60cff191c6513ad699cea8a81858886dc1cbe662695067b8f7e6f3e95005bafb157fc62888debd35132563612f290037f8ba19d20217990ade912b4651d5f6cd11ef1650ed076bf3009c631b6d357cf6be9f67a22bcd5c383098e07abbf56a5fb92d5e3686c69ae22355ff8b96827514dca145ac0c9c95cf448a0eb85ef4d38de93a5082e02a4b56f156dfc7ac17d74cc45246029cd1f0f0b29dcb765d163ab8a4294a688b2ae3febca3ffd0310dc570c9ece18511acef731c7ce26577a115c79751e6ef12dd8e65d27d7a4d35da2586942a7025889f7159a899fe86c17b996d2918bb0a6daa5be3d797311216d4e378eb02fe9c25552b9b451ed0248ce92979818c89adfcbec52b1dc74a2cc4ae14654b5df05d66b330a971fc7e0a3d34b99752ccdb2041ace77fbedd9165e96d9ec870ab93f4323d08bbb4399f1707025ea3d14f3c39a2066e7da34d4071da4d4e90cbd6e7d3631461f7784f0188db6a014a0bfbbcc4226f61cab1b43fede2edad12725850b3538037eed79c64554edcb03f0c7b17e60562584e2d08b8ea47f5035b6bc3f495e630e624597bbece6abd6a5a47037d1c503724fe71f095fd5e02e8f43b27dc60877772d86a290fab0954366e36055e8877f6c4536f61ad9fceb67f75e08430b54eda0255a5bccd836c3bd5b25374ddd62f24dc62040eba5e116a25352d2b2bfaa417089db17f7f7692659f6c731a8f7ddbabb65c5433feade74b21d08b658ebd361252375d5bbb8568ecb527599f93d34add305005738bab9df35e4b851893b65e1519bbf30031911b666acc82ed23bf20b4aa186eeb956ca6356c4bc081e698b0899616b5f89528be9a8b3250c3911fbc1442ef3a170226e1532a1e44a48b10519755e1b7b4f0e2cf45dc7740567e0511187eb571b33de7bff90c91527033cf18ea6ccf90a918d46225c973b3c3a43d230862a10a412da0f331dd574357c24c7933bdf6d1c6d1bb3edc92de907a999c9e9237dde5f176e38f11c"}, - {"0000000000000000000000000000000000000000000000000000000000000000", "0011bf1912836180b8fcc2ea619fed9164f137abb126b94662f5cedb95e17c5a89377fbd5ac63abd8774389f3fe0a2d98a691c40954d5d33c841ce8495476841a34bc379d1e57ed75a68f757750c9764b81fc2f10d8b9f4211d1cc3b23cfe21d5b38b464e2238e17124629c70363922febe4e78739e4694d56e373bfc8bc1e6e53d185d043d1266896a0503c7dde717cdf8598382d979619a18cbf9bce240e93d7858659837bcdd5032d113ee70f95c5294e522d426b807188b6341fe809423f480f16e21b310cc1670f9c6788756d0ec1ee056466fa84e7fe43e44f632b7b42c984f55e4f3fb30734468e5d491787950bb319409b370f48399e8b6a0f61bb22ab1ef4bd4b3ba5237271be9d7468dab9440fc90eb2d4c434572e5962369f15e2d1897572cd022491aa9cf30dd557c547648d68758adb1a0599015b4de2daf19e61ad532a45a8e641f404c25a7e99237800cb74dabb4451e8312500a290de97e9b25f9425e735d3dc921324cc9def8ffb63065d4106f4e11e68171ebfded11c756e4bf44b42be49f1934e1850f233952d67698d3defbb5dad577861797e6acac4ed7e13b701ae5558b205c58ae2b5818b5e5085c4bf27d1404a136d292cf111a5df0279128c2579aeed4eaf5d333709bb25a51b0a0edb781a2882d84fa69e3a72deb647341d7bf18995ab937b127545d836f945a775ce029500fe028b510bf2b88a09f0741263b34cfd324ceeef08ed48570fc8b91dd21a112aac59475058893e62bc087a81f5c70395ee496463a687344e44ffcbb422483a52bde246136a934469a4a2cc33ad6f57269f5b5c1351744e9c9b28cf3cc9a3c6e8d3260715ab1ce5211645fdcfc22eee45e1f2f735e77b6c41edc05647ab19f20a6a2093d29b145b9686e4b4e705eaceb9d6b61cc9e587c750174ee62f0573ece32d81dd5050651600b8bd4df6644c37ceb89313107c5ba972f95ad7dc450dafc1605ed27153e9562593d07213532f5e386808a85fa3e926ae2fd589a52b672ba38deecadc98df12603fb3491ea269289902587278413cf4dcc944510b0eb29534959a58f3b001141a94f85635641f81b6244bf15599da8cb2ff8fa3bf65aed84930906e212b2cd8338171df7f21d74c0685b4de015f3864bcde9935aad444ebe9b2038c7e73f6f2d26d7a932c1990b9017d86051b6d1de7c56f11cf759b2061ee4f7d4d1c187d579093df28910015b4c701b6e99d7dc9bb72c0136eba50569242097ef321401ee6ec09ce74f8786129f29477af1769056b6a54400d7056e18fbd5e18d403628e1414acef91a828798c2d66486aa194b8472e11ccd141da1c8c0f201d524f735fb0415904fe8ff5059a7511c30f6b348c2e41b816b47433389c5c6bb1137d7b9220199c53bd26c322fbfb95dd114c6ab398024234c821186ccf02529194abb54f24a1919c38ee0ecc6e09fd1bc71757ee43a86bcc5039640ef36bc511b019e0f205a97591d5033916282da4f7dc574a631360ec66c3f35dc3f9803b21f56e414ed394d94e5514ede93325af95898510e24d185db57cea940b67f72aea04287fe1c7f3a109c2c6d0209e7da645b2cec22c43cc8107cf98c0d523560404c9b382ce07385c3886e01cf676ecc3398fa8aaa612e82ac6c797765245053d5a2b7a8f88188abce4116cab9fc5c01050ab122d8c5a0eb36c1c79c6a7348481ef5812a878f98f5c20b49c75e38e25f93e09f58d235e8b01baa0f58e5b225f4f7722181a21f0ea5269d0c4ff95e188322c130fd7438d44c5f96ec3da96d73a7cc6c398b1fd0dd232ecdf2304715f73e1dc74315031c65e8d395eae602ed0d5b181b280e7a497643184455e539728bed85f51983c73b11614b1782f562e4e511565f5623919cb"}, - {"000000000000000000000000000000000000000000000000000000000000000a", "0038eb021cc0f84bef144056ee57f8b19aff5218021802a424386442f169522412cf3ebda6979adb25c3157b00c00a26a0c5edcce467d3deafe2248f31cad517928922c9df9141800493e79c2da91eb1379a65da0b2d0415c1b436c3d664f12f0236a9cb7f3bfffbcb2f1f3f38136e740391e7989ecd56137a72433dc8bc103ad7c0a1d2d8a2e925440272dec71d5a63725e241b1ea7c2296314356ccc839105e151fe410b1e538c0d231a060b2d1781e921960eb27b8e63190dfa71b54be166e89a196278dbade5305962d9b30b547aea910d6781d4d4150f74fcc2e567ffc72df260d4deaec71a3fe3bf8f9f960311b1143151b103f50d70ef65030fe9946d608ca791d31ea4732aac7a21a6a59d3a2e5ed047a4ae216cd51de88658a63ee75618099af0ee429396d180117bf7ead1776dbb42e6c5e0899604bc74cf1c3e80a703e3fddd979d915101de0f6835a1a801d39fc7902d083d6b8e742b1b6d9bcd4aae569626091945f77d960993481043a7b7a6edc157c54e219008072d5e8e923f2dd9c76225b33615348a9966be060dfaf3bd29c80349b6c8e1289fccc55c944789313409ff233ec14f29bee50894ddf75fd8f982464d81b110f201437cc9f359b9727117a189681970c39a67be104580f8f94d265f405ec2ceadf872a6ec211768aa1b363de9948d520efda32546d0688922d66b7b677203e7d8f35e150d8ba610e4dcf3cd3f6e0ff673e94e1f27635982e80409fdbbd38153c1af521971deb3f1203cae534b49ebbe5e3c99bc2d72ddc72b599f1ccd2f602f012e9b0324e3c1f470ec5f06627c88b4ce0c0a14e69e10683c97ef05380a78ea9bd7119bbd61581975e71927d15277d5a7721069a5e5b515a1fbfe8b1d05f47bb01bc1f9e1f8e56044b338fe51d0957196230805262d9999b722fa1604feecdd7a2ddd159c690112f4b0344708691bae074d04f8c2d2838f3e15c90e20dba6d75b987f58fbe12fa1f35a0eaf6bf9ae4307150d0137c88be48aed199f1d4d739bd95edfa3672eaafece7dfc9e77e83594b708de8ab93f44f1132601a032d9f5a7388f569654cdc3b8c5ba26e0743c8e2f77ebf41cecea9d9f6dc5da9a497529f8115f8ee103cd729ed16ba6b7bc7a45ab45c401870078190a2f1e11859bfb157c30cdea552b1f376391e6c27e474b0c33bdd2af8dd032701b3391a4cd84c8f313fef06816076f9ff15fceff1f8a57c8296917068e8a19eca011de5ae2925f813987c962485db3f0c97c1ed430a633ff2bacae22244535ecf4848bb0b699478959c8a90ec3bb43b13173f9aa2004e7fbb503adc84c12572358667cb6621eb8799603a5f301ebef9750313fae8813bdc8ff5de34043c03fb257865aa2b4dbf9ea923415535512efe9d787939c3635bd7703165fde5a875f01205c145c035c4f9efd91792b58930d8759f913fa012b01740d9c252d396523b6ae5203158da4bd056709d1eba926e63e53cc85a59764fe053f2d24fbc2bf177bf2ae3712d8dc9c6db689fbcdf6727af53bac521af42ffa865ff35f2f1033390f6f1bba39e25670341cb86f2bea907624d0a3e1d9381c4589ae661241972d249fd6b0297389ec38e313e3fe990da78e1ca0f12eb9daa955cfc33591e1050859f567ad4416ee5384035279ea02c51eeff5dad2e250b842369d2f38d22a07fe58ff95a748dd6c09c3621a666a4d327709b4be23a96e481d9ce0430186625bc4dd5018fb56eb0459387f549745564855307e5516c0ced90e231ed427d70913f405388ae8133a428d61e478039781393c2ff21afc75732c288341e43a85668ce2e1ae601914b9221579f993aeaa26c1b94ba518f27ccbdd7f94d717b51620136cef9fc46b39ae0a3715fa4eb2dff8fc082a"}, - {"000000000000000000000000000000000000000000000000000000000000000a", "0059f24db34904d0ff37f09081fb9b9b212ada87a902699c7a54160bbcbf5230585c3227904b9c9d85f812ff51363488265da41297c49bfbd95a5c2033fc074e46ec02e265dedfd4f9e54e29d2a7c56fc79d5a750f08fbfccc4eab8d7b4831f5646fe5265232f77e363011ab631a9b86c5d79d23cb752e4a921d41d4e389271372639ee300d3ab7b45b932bb8339ce9a56304a3f5d8c289dabf2838ebab53edeb36e81551c3d95670944948e404d63d8d74ac10e8dcc0c246e252485ff0c7b05b3380e99138c8ad442f7e9e81e2d6b59cf4813d9e115a06153ab20c6926e093e3f5e6e581f51dc1741c6758f1a46b10c70f36efea17356478adfca500ea3d7b322e9690ff79a12c9bea432d0fbf9978f7123023f4b5b60fc4793a3f5485ee75145e10fb81e122a326200af15fa63e4e296b8b57f0b8e4ec3bda24c43134fc9cfd1ee734ebbf94750ec5fe668f1b3859401a24a251a9a8db8f0c1e4f1285c617eac365896e3163ba9a0aa13ba9d3cf5f2aa679de78dd007ff219604ee70c0d4590424f6fbf069377656f4a41b1da472362a3667f4181bb4c8eb43d965a31fee059ab62e7b051c0c22b0e456c9dc95e563dfbb58226d03f612350a649166dcd281ab66a9c4374b7ecf2e1c879c65ea0d9a01d59bd929d5cca6719ed49252f07367b640b4339845f4b05149e6c4b6e42f11cda735b28c99696808d39db557a4bc73ab81e87b67e32f8e8cf3d94a5d0de591ce2b5ae9d5aa66b2d7f1245c95932758b3840cc363ee15e73e9fe111d31180f9cbed888b769ba931afd3117be98295b7d467e7cff8c8df374edc97610ec1a1eb0047a9baa42c916d652876019ad813c3e22203bf654850f8e4e37a2877f4ea714775e5dc558213266a0cd4a7c241f185d7cdf9ccb55e9778ba899d16ac4b3de01c2a2f44c095f5635c86b62db87d80f60063fd672ed280c1f69f56ebbdfb61d2b276dadbe7063d79cbdda2383950f5b69a3cd10bea79ee190b5119bc53662ed8274bb9fd97ea7ecc38c773323d8a076422f59ab268616576e5e73104cfb0b5ffcb3f98642122d6deca994ce70a6b772e3a64a1d7bec93fc9092569b998f48a240fb148428ae653b01da1b14e6c9824e04b14454fa84557a5376422bdbd964e4db6b16f3e58ad5610d6617943a3657048fcdef5ebb2b8841507d6ff8c7628b4c1a95a91b0b0ded10d617a3bf20b191c52baec12b9297aa656b791d82cd390241ef7d2379d4fd19d5fa2dbd855848068b4128665535512d266643db7bddf3bc982c6791e22e1bac702d559deaf1b27fe96e4776029dda303ce955277b61c0c1cbf7230213af957d51dc0abd2d30ebdb2535554d21b88041caa2ab9be59e432f80184a10cd7c167161c7e3aaf5cff6713593086e39cd4296034cc84b2c0bff8bc2a02d363bc659612cbd260e6be4cf8beea47fc7addbd1eba3923b75105a2f838647d31375ba2afa47763660319c6a7b85a8de140b51137c2e3e5f1dd3578be800d3a4a2d9ddf49495e9d9171ccc3525a5fefba63a50659a8f0d14d05d8d02a73aef89f45eb5ce03ca6d4087a78872162afdbd2916282d86e0d798b605909661c8bfc8fbe6fe5dbd04ae207544dfdc1eddb51462b41b3eb7222a9cded69dd5a21f6eba6aede261a4c4108ff04dedbbb6c07e3cf51da9ce977f2222293c0ec1fa266111aa9873d8f8332fe0fe8260d49186daace1e4c8b2a8190db531af843c64faccf410dcaf1a803880cbcc870e643d1a5b8e9f7e5ee9557c7347e3fff0946eb753384a12a699382965455375d99c21f380b196e59ad3b9e8e9d029c37bfc0c62e96bf5afc012d0bc5841c825cdb99714c15a207d0843285bf5e1ff3126dcff6a38d4f13572e25a445e71a1f70411d8217"}, - {"0000000000000000000000000000000000000000000000000000000000000001", "000f49fde70438c5885ca08ec3b6f7da1f4d1f0b4d2718aa57a82d938374afc4089c7cf9c1427f4cebc0069da8873d42feb02350a14a16cab6b57ff2919ef426d8d726e3cfc0d17a7c42a16ab93c917544327b2207acf871ba2282673a58720002f8d4ada0a0fb3ab73ede473d63616ca9f8e6742abef6682abdb7f6011d1ae2ab417ddba0c54105a530dcb238935c127ccf973291b22a59997969e1b01607b53ad96290a61a137401cdc4e78f48ec7e5d7a567c713d11ba2627be8726057954ff720da4b594dae2c8cef1856d48a5be9fdb18d6ef006b173dc964bc91a2a2799c30da3fee4a227a8f7f69aded552bcea447aec3ec4011fc4edcad1c16c4147e02499820afa0a4597bec5eb21e7f15f94d3735d2aed5305f098874679901fa81af91e69cc7af28ad5a149b1eab4b41b396f6a1e2068ee92dbbe62055d41ced2d23c4e5c6b92564c7af027723145a50aa0564ba77ea2bc8affa37545300b983f5d7035884fe3f0fe2ae32594e4af138089533dfd9f71fb7db4ff0174077e70307e43a44f493388868b738d2d011d6db1b1fdd392453d317c6c392e2a543636e78bbf9771b0d448c5ed77c9f79e5a9773a37623626fd6ffc9f3c17696dde295d9dd134a2b2afa1b5c2b33a02be3438209e7938d4988fc3a234f364ed31d9af5503ff4ec334371d14f9aa6ea1b71824205355603eac95b6d446126adda544b3725fc736119ed8a894ad7f0097cfeb40c90b16dd96e0abb60ec46d03a65c8f75a3dbd85318897a8a0e2eca17e79de78750d120da5728ba751d2cc6d3c9d0f394c3c53a64b279b1645a289493b820193f10ee31c75df97a5401f8cfa55f8d09b589d3e741c04efe98d39beaaf29e55a4d7dcbd6522158ec441957ccb226d78dc787b774f104eaae317cf9551a374f54965b702a6627d6e5f5062a471ca15f727c060b01c6bddd780d8bb6e123460b50cd3353100c1be661307fab40e81de787dd926400fd5ddf3a710839d24b0b8d3b77e3c66ab54d51b79936ef33f71d3b3fe9c615865c252cc66b6870aaa63ace7d9b79e48fb8e24904e5cea44ed27abdd748915a6c489a0868c3f1c08b1d223a736ac958c58c9194d4dd43a2715acef1a167096eaa52690a16e0b08c59d400eb0e7a88bb1812c7182c373c33a1d2bdcd7a231139b9e6090ca67646fd06861c74cc68b60dd1c5411f35198dcc9dd2f0a824097d3588f80ced39231d42605343a26298193ca0b007c587ba5b92b961ca64e4f42ac0b215cec41522b821d6cc2358c933fd7ccfe73ea667e12266f7f36f5e113a65e5239b9eed4bf563ccb6efab193a08aa7fa326fa4b0a23db37150b8b25d5cee3106693ac9eb2d9147793c05758ab05e59283906aa966111d7d2ead2c1e30a3ce3fc8ffb5e33ea2d7897235f224d213492905fc91f758abba8bd48ea1d93974e153e16aff1a7e123df5f5d7782b0fd5de057346dbe63334611e14b320b49577608f2c47cf51d2873dff165318389fc81327663a33f061f4bf3cdbe70cf0e1e4b6bc7c76ead20601a9c156524ae1cb32226b24c66b275fbbfb8dfc1f8e9101af0876a59f54c6e1de5a733a4bebb9f2cf13bc01a941cb4145f23f636ac5b0e7e4ec8cddbeeb242e95a74d8c718edf74a5f3b15fa2b9f84bf3f61b08d625f43553fc4963d9a8941ef60edb20e81d7d135185cd0fcfa2229b3c9e1738f8ca65fa745a171b3416f4ef32515dac3effb2d1b8d2509c433dea3f5acd1d04213c7e53c697c23fb2af96bfd7593f717bf68b16bb5682b94ad08868698262e1adedce401edb14dc301bbfc27753bf5df951b58f79de237de464bb9e0317b35f2fad6963df51d992f2b9ffbcc22425db5f713c3debceb194b66b868c540f33e56726d0081ce989"}, - {"000000000000000000000000000000000000000000000000000000000000000a", "004c010637183181b21ce30feefb12be6683d6acd2484a8fe39820dc1107df2521667ea6597bcdcc0c340d8e4ab421c8bc57727941b362b68468b59a8cecf8266fb66ad117fc9103e004ada9ee7db357b73c5db8119ad790c7c9e56b1cc7c5c4775074fafe2eda0fa93494e23161167757b52c046ee45f7791a0b2be6165192f1dae830f6f24bb3311c5b039c4c09be85862cb2048a139fc33b661eaf5b506ef7bee7599be5d555100f5a03dd314e45d054f482e2de0d2773a677ee7b6222a6c35f8d5cba1741d950532c7a97642707bba340840e2ae4c8913dbd5f25759dcee9655ff0117451917ca2bebffcadce7e731845372b783153af52f3d200482db1435cd4cb729e5483680f3c78a7390d5154311981bf2ef30fdc7bbe0614c80c44435a2b13b756610dcda284e296d738d1c5343f25c5d92ee0ad9d5214e8ad2db901c06e0e36375a1584e8123411cbddfef02517e062453da00a7c301518e44287ddea0ffe26a0ae7979bb6114a0bd11180bca110a438761a5cc5424ac646a806725135e09206ca4ff14366bdf8feab12512f45dd78e6e8d96131b51977c239757b6f7376f303da87fd9e84176fd8c6132eaab0276ac9677a4c0b1796025c75eebddfdc19647fcbfea371b0ef74c7d00b2174562f4dd13dec6f968394d0b91e0f9457e69d0ed209eb750ad592976ed245fdab8dc4e909493eee0500a787b68eac299eae849bf27be91db34ebe08452528bf6f7f1d8e05aaff42d1e01e2941223d9688a80fde8e56063bb213e67592ba4565b44526ac8ce46325963a1d56dde1197c1168cf2b531d3257f2be87e106962d44190ec02a86e693cb943bec21277eee6eac069cbdfc200e0195048642a4e5bd1599cd0b9d732b1bf2bf7cfa59ac27aeb972bf1e409a6db3555ee4ca37eb8cd1e7abc9fda8e9238bc153f6a60053bfe16600c4de9b0920f433b3b88136441e29c69613f654010bc852831fcca279b5aec52cc3c9791aa986f8f36b135cb40a90c76da79e4f6692f759756e6d8b9467d13e0a16c9c5d5a8bb94fc34419fd5ea76a6875a5b0c04e82edb41a2b8e9d77eb9122ce6b467151b7f4947306c4504a64d3382f38b0431f7a47551fe66d732e319924d448a0b8a2f0dbef30c22b0857755301ed7ab21031abf9012088ddaa5438b1a30a63e0b75f5c4ac06d7aaf51a50a5672fdd93610a2a0532ae6a3ee76c41f942f3293ac32dd6d4a48403f0d4bd7c801288e80e236e2827088d0bafae8212a3a306a96d721558dd2777c5e154f90b65fc43287d586a5c5e474afb63f50bc019372c1191d7b6e1f89a0aea5cda5734fdc754127753098d45bbc5f704124c2968b69595cc1bd6f11d0d4486f1517be9aae3524c91192ff8a94637e3fe262374912ed139c38808d4c82bdbcf91581cbdb28f010a09e1164fb448c1eb6327dc59ca3a36ef1840c83d413d644090de6fe78c58595a7d9ff2e9857acd0f07a09cd67993cc5ddc69453a38b5d10e3eb713b7bb12d7e1b3339f0f833da5e71fdb3a346a500b93e36f017d8e917cc5abb4b496d534463de9cd814a135c8f06cd9125d502e861025167597aec4c137e30fe21e518d30de3949816cd0450370d02e7147a9578ddd2bc1e5be9a0bdd54b654440440c06e0f3f6b98816730b02771299a309dd828809c0b3e3acd761a4bf5612c4035c8137eca38547acaf9316c47f45a5fdc8f5f87f06e404cf7504388e5e6a92bd4ced268e76707f21a5431ebdbcc7170b691bcbb7ff0e7e92620a00b206f706a36473ee01db55d37f4580627d093ae19f5732a92a3157031b60db138202830917d686fa7e54b7161828e8d51c9dac436980db5344ee9b0c48dcbe731903438f6fb2ad1e7ac9fd73a882ddff65fbc3715fa9b7"}, - {"0000000000000000000000000000000000000000000000000000000000000007", "0003c22776cb2039ba8f4071fc10bf688a79f30e5901395e1a81823ab13126f2cb29440bdebbc09dcb031405e65354d68441232b919110687c49b1e2bc36584786b35f89b1a1f9e24c4493c63b781551e84b244b2f799f33c190176fca11f3d7c4dee2e58bc95bb3e657dd24213bdb04e5f02cd5c2eb30424eafc997576a3c6b464111a34da9854ae45d80a793ca70d85e017452e86d8b7ca2c0278150e5f6be5533d580c8cd957a12d625011e0cfbdbc60203f11f53f44132d60a1f1e1d7a2507a8e94b23b22303f0082dee211250eb675a183bffcffb5361e4e165920e1a1f21b5a4cf9f4c2f3e2bd494cf9ec9ad13f98962e766f7ff484bbceff92472098f98ece179a29a3472ae478201abb351168e367ff516499238c1c24f55acd9ccdc13a1fa1d6a82341073ba27709513f820b56593f6c7871bca18f1374a631f3ce368784fca2dc872e86828ca8f81dd84bf000ee1c05af7163df90ce3ac3cf1237a405c5864331e4c4249f68e811715b583a537c7d0b5c76475bd9101a74e70a9aa6e0d892da1620aee6bba096a16cbc35e226f15af9ac0b7e7cdb606fec9322e8140f8296305f9c19db2511def5d3d64774aaa1c4a16069c04d164f44b9019e2e733f2683b2c6177eaaf4f6c3eb1290de2d0a02d69c281c517f12756ea96f258fb742b2e16fd8bbaba1c4e95344585c57362088e307252782c0a6cbd11b2ea5297de074593eac3ea53e1521f9c57342842f341b0a095bc83435448654508e37b95cb9e0b0292ac619675b55fb07b7eebe1b94b057cda80c61b6f21c2ad4cd255891ad5e5c97514cd9a573f22a212673aeb8aca03df4f7a4471a6c44ecdb3fc18266729fe5d2a73e6f57d70b512f65ade7c13539ebd38ea1b55bd9eab892db5bfdd82110cc940b552ccd4d7e621775ab575e5da67668f6325c73b3096b48c560c71000d1282c1988a6bcb175177c5b15c72a5475ebc7420ce27ed4bd15ce37657c322a92a751d29d19294680253e9d611d48b6f576ca12a25bf3ff0be35d3e79617b9a28ef7d71965bc5aa1835fb3ef9a734cd4019d0990baef09082be2a20ce09f0c2b41b3c9351e76ea4d93440004f16985c354980c9bd1608abfa47b62510dc0087832b350a1a348b7ab29f49a8ebfc0bf0f5b342e1d455edd6a5302abc8cb1f742f6fc3b0bf81fd00d3bab19ff6d919b7d520de9cec961cee83ace65d2bcd6c95ea9ceca591bb431cbda54675f6f138c3f30b70da04c7c5bf276bbb65a319d9b7358a1ccc719c1ed0cde258913c42f994ca724d68efdac956de72eb0164b547d5a3f801f629c0e515a0278052fa42f8e80a7d428dac85992df33617f3096f22a67e58d5b1d20296e10a59c8e857a3cd80855f1f64a82bf4fea3fe12e03214f1d90a1b5cb6618b54f9c074b42f91720e0078991ebb6e6e0d880b009438864698f084d7f618527c1dd9b397fa453bc956c9e2bd2671e20a3cfabb047bb6a512cf8861d15dc1a2201745ad1efcac7cc81d0c1e9a210ebd4dbd00c4aa0d71c2e5b15b4e385e15014b1d530a2fed5747317301beb01d6a31dee56c3798ce2f38563232f2c904f671afaada65dd1504fb256a33ce318ec7e492e989457f5c36ca73f99ddab4388a63267c53baa366f936ade1eb179dc77c91ed3d02aecf67834af165df6153327f1a6f41d491d29fc2030cc313082a366184faa286f7501670f9bcbd28d92cd4a6043b682173f61824c24048267d34a6fc229b4608b6fa57ea6251d97b28988e7c0423b4c87fb3e81e3b571f8bf352b9aad0544a5c2ec04f3f6c5aafed26dfb9e8e1cf6187f12296c7c95f42ff46493dcd3525a8c2a7d66451e7cc6565165f5a4a79b0ecef19bc4ff09e9d61207f3b0b9b38a086e094fe2f4d9a60ee"}, - {"000000000000000000000000000000000000000000000000000000000000000a", "0083fe5a28a2f29388eae26e35e093a708e15d02d30fbe60ae77cf1aa91793f5eef7b4ad27838cddf8b103bcd5611a9a2d67604459c8ebcfec22fbc1faadf223c6cf09378b3070fbf7a26909336224a0b38afd6e062d7e494e95dd8fa555f06d00f019783a308435b842cd5b5cc02a375fc3ff1474477a5555dac994cfad19d695a8c2532bb95be18354aade0ca96fc39af13f33f0ab1207d86b85c34db6436746a51fb1f05d9d8203dd28faa590c0df404f0075c0a1c9f4e3b6590299347efd02157738aff91c845612f6e145d417da2a46283da6db0a77f0bff4e018876e59b66a2bb31daa86552dbb7c572a7b41857af8e2f9d1ef7b91297f0030192f8d68470c4d47bce1946a5dbac369884e4f1d6722766c8e4b9257ccabedb2917def4fece03e756bba4629d4edba5a0e17e5f3d5c4a2bd34b975391b28fc717b0f901a3146639f984da68ef016537aa4fdca9502f8aa2b504c7e03cbe3b15761786b29238afe8e6a057d7f87a160681d331583b3deedb7cdec7a375dc23a3754aa69a8b12393e1742f6cd1e3fe5410166ddf3f6f56bc201f091d05f8199b2c599f0f27801b5f5b0ac73d45a0d8f6d569e2c47175b58346670f7dea2a109bdd38aa38ea3bf1bca1e62ac40a1f79c9ff911b40dcf2a2c79449a991ddd4841364ab6ddfe5146f9544bd74ac332884e16fe044edc87568aad77ad6fce006a0d866f6c41d5b211ed15a849d967da19292825713b948f0ef1da0eff77e526dc2d5098e16f6fbca9a1ad2a4492c19b4b535bd02993ac9abc92b98f055223602be5fc85e1108ff4d1a715d6e54b36b1d7bc9791c3db5c83d9574c75644e252f3fe38190c2d11dd5f27ad5e6fce97e2e79921c9e214e5e332b955d944e2396147647e273d63f75bb4b786529c8172e534d76e440e7556ec515a8b0f7b04e187d010214a3cfbb0a900a95567ccda9d831b23034d48dc94814cc5198fbe4341af319b275fa1dc4718106cedd8a6a774bbaf920ca885bb498d37a4f1a090fd218ac9a0e5006de0ce145377504a1cb27be6dd655d625d74ab47f1fda44507ec0633688cd260cc18e13e535e1f7ae3d199b56d0c74e8a679119babc93fd6e5924a367f87211de97e10fb09b7dced944b78bcd2663dd4aeed51251d33f928f70fdb699b401f47c237ff3eca9233507c1af6a9038ebcf92d8b8bbfb16e13e9cdbab38284f81bd5ff41b8555f1da15fc56d71948aed38ba4a37aab7980e08fd53d9c4d9c6d36592089db17f918a2f519a2dc10af39595e14f2d99c92bc1f9a86fd17e24617820a512cecf16e913a799d41b33fcd4552b25dd09133b7226d5c1ef9dd29b8eb6b9e68f457df5b605d0f31bd130f97de3638d57a50c35368b1764f7a5c907b3c7ea4a11fc18bae5da25fa3bb7537e5f5c11f0ccb31289012a0694ce1704fb6ede913c2bdde9c126769b3cec45a7dfeec25b71356704783a94d9e25edba5b89e7226304c956f49b95ea6373324ca5141a55f143a6d1a3802bba04ea74525a6e4756534d7e28d8bb691abb405af9251445e0e3f0b9be06d4e766550490a047e540a418c204f8b9ed88ca153467b2f646168a4f6dc6410e7b569d28a3a6fffdcd44ec82f7702d4c3f7a7c61715f5fa885dcb91d78c11f54a3738092752e9e225093d5c0248c2eaa77fcae1e874a4b5e587857ccabd0eb1e16b4508a87ad8aa551540fe38b6e393997e1c233325bfc3347d07c67b783379e9f1ab064859c8c02ebbd3d57255ab9377c6736a34c919c93b898e1b530a1469840206d8f650ebf6d8525e990e7f981ad12419a3ce579e6782f9d048d22b371a71077983bc0c6d12d876667889a0c53a4828332fd0d11b6bc53f2cfa3568d29393602daf5c3fa75097f6ce964be15ea524"}, - {"000000000000000000000000000000000000000000000000000000000000000c", "004a292d92017e43b1998a1fe567553ac6fa9759181914e57b4c0f434c872228fb3850334ee11d7b14452483922cdc906b932f42e6635b7d8c3f1d479dcc702b4ae964655543cf09c1d439b2f8f1259f8a6e2126021fea577b0c41ede500a544bc2cf80293fa5bcacf2d88a4e1584e6d1db5be158dde7c32262bd5d7018e03c1d8e48d4e77169e2261cbc7c73fe4e68b1084b511ef67bda970edcbea94f1d9f15570de37609a642c0339584c522d66e1a3587368a7a0a48e630035cab42e86319d4a13bb70d575e3264af98c2a213197bc8623ef45ead572ba65ab125514f5558c6e2cc6ff2a2b355af6e3b6d47609f3baf9544d70581b78519e9a68099815ac0e4bf838773ff3e5f442f38dc1f690ad7e3cc0a68293694947f6e1244a176d5145a4fd5dce5410a0eae246c75e5584f684db59d67d72d8c7fd806532cbc422e369c7338d8ff59057bb0a533697df3ef201cdbcdef1cd3fca796412873936b9d516c23663cc1cf22b7a465dfed55d09a38deed2ba1dce694fb4af13e60c87eb5f1319716353bfc5c39f3529455f09b54247bf6f31138233bb91c76dfc4b2b1e0e23b203b00a18d7ae200b2b36b1b222c5e8d74cae3e3196528f6cbb63d121ed2d51c7a01b47f77887833db65eb4320d27c44d7fd92d159312a504abd9d85d9dc9ddb93b0e321dbc28d6ddcf326b318ba57b42186cdcb2bead03cbc08157430e6247517a9725da03fec35a36d7f41f387ddeacd70507142218a0cf56b0fa48acd477b30b5a2194e59fa4e7d03ca46711cee405994c4f17f817025949d255ffb7f2b1b3b6ec339f9d95683a41d907c85eaa566024ef45be92e773bf8de9c4c6d713cd426febfaf02a7039bf22973d7e4bf4da9e92193af344962a5b2c1436dffc85c8081063850a31d59584566db7aeeeff669d9b4806e9035fee1702c8151a5b2200f52776ecc7bac66a4d20f409d3efc23d55de1d6301b1ea9c66008a37650f6656953ef6efa3a51eac9e22326554b652ba43b5941250fce614169e005e72dd2d122c353e95e80ec85eb7601ffcc6f62a5a1775ba0bfaceaaef6b872da48db2221dbad29d4643ddefdb16afe1bcd920e5997fc5a5a902baca3591764df7461be87ddb034ede1768a013f58df10c8384561fc0f42f49f4c6a42bbd4fad7e039af3483ad6313d7cc024013ecb8d9be951df7bea90b829bff535593cf826f621ba311b5560bbb962453550636a14930dfb3a3abb0ad265ee48180481c26232560127c3759fd7d4f8e21f1a810fc35c570bc4e292c725c15c3e6507bd959e02244b792fdede974a1ba09ef24dd7bf01b65d9e5e33202b1a45ec9e03b8295621174a3842cfd75c84773283768f809044d88da36540ea46780ddfdc7da3543c60d45ee15dd3334e95c442e8e0cce5f017befc420348b91cf90d63f700b36cf543781aa77319bc4e39080d5a1bc560a2070e3872732115d2d0ae0311ac61235d6b960e9c0265d319d7333965080a2075de6a192d275f7e179dbe55a9fb98210a4120d688109fa65b1883473dd80f9ba0d35c63897d766149ffbdf66b742195e947cd2256fd3a930393c5ff1fe9c8f3338fb9211333f9ba55c7ead7da4347e031366922ba3a1a32322eba0ab853384db9a3d65cec556f0a31cd5778cc04aeb175da995c97b5c8e3a8755b0ace0199b0438c1f342a184ea10d491982077b467414664dfb16c4ee0bca4d465d43e233dfc981262f9e1ab5ca8ade7e4d16a95a9b695346cbc8b978744ffa7f7b3b1fbadc7b1cab05dbd920d54bfa4b7342d8f254af03a39d61222a30922b504af72b133b0529c06749bda6bcdda44d231aa32a518efbb78b52664f65be48fa10a616d3c27a26c5b51e7b4bdbf8efca37557868e72ee7fc1900"}, - {"0000000000000000000000000000000000000000000000000000000000000002", "00486acc3bb7ccb1ef88e0b1ef57810d9a401e7543134aa2429e9a0d2cf7d2d38716eb27ea982558c582044c0df2da5ed2297c818150bce5e7fcd3a790438140201f1df0e0a599c8074477d27933b53f033e9479021453a8ac66576175fd6237c83746e30da49d8f9d2c5a97d5c9539069a749b3f7865e4aaae5aa1e24b2447797db979d41656280d79c0e755c077e8a3ca2be54183d5e86dc6175e750f622474a3e66488fb57b0601260ac2acc5f9c1f173d20046c91763072e5d5a5126079abd55a813d5b8683519e1c11f25521ef30c98097e751f2d09b51938295190c27740054e97ac46820dacee07094c0552e2f7a3882328329ee50e9e08341568320a7761437379d87224dde633312f20f8bc522cefd9c9dfd2efc8e952543487ac693ef2359a7eab16cc7c8493957ef957359866be51e4d2a96ebabcc0291b5fe591dbcceb3bdad50c5fce00fd9caa8fbf2f02081c7a2dd6c1958d8c7237d8f75e5a292e7350ad1427858ccdda79e18068b61ade77cf178e597e065a12504b6783136b33f8743572e9fefe1a572236db4c1992878cca076d4df251727fd9a7178218ffbb1a8605b3a7a6048ad4c6719a217d30e7cc6a2c903322ec05d4ef7a7ba20b457a7a516ea8b01ee9acb512cbfc1b984ce0ec963fd9b0a558c734dc7273b75c7e96f92b6447a2869e1a2500ea7671f5499ad1c96e7c6ebc0beb99270869455bc9adf3d9e86f5a4d068db4e0b70ec8a9f252677a7d66e1540354a448f204f23443d0276492588f33beb79ecc650a14d458327ad2fbcf4b3580e22085988d758e497bb1f3ee0f7b35b8facead0c8156ff6cca4345b67b274d97e1c8fa2da8fc7f601e38dff00acf37b0c2c987bc0dc147e626d376d0e21784fecbd20e172b3988e24c18140d7cadd79adc721fc80638699792572c04449ec5e906b6b1ba19677c01cead253f88a85d7acaa2b173af985529315f7a2c1b79215623914ea8b6e6d449e82770a6d992d6f0cb1058fd9f3ba17d09a87a73d08438d07d5d599591651259afdf26a5bc79d066446721687729a5892ee4ea2544af1a38a3f22b6a3b3a12ae6c50caab57f779544487f3878e5428bfca1f5c1cb3723483aaedff064041d19fe10a520773b8da05af60529d2a60f6997f7e538adf66fca536fb6e3ab6596cc2150a22397e24c10527df97475b3cbdcd7121b6dc4fc7cf34533b122206367790a4cb9ac1570580856f0fbcf8de4e5ca7bd15b736a5e2683dbdeaa363d7dd2fbd527ad1ff7b4317ef57ba0a2f7f09d4c4c2bb35a8bb1eae9998078b06c1e2353ac4ba86f61e12e57064343127b76a208c10778ec272296a638f8896547e490f3247dd56f6f414026fd6ba1acb47ca4fc178503e8b2cd51b1eca5b169a53061311b9de8eb5e1e19fd90d6b31e8dfb44705b85191870c15bcd0084775905119da31ff3c45de425fcc02031626c71c58079c776c812a0097d40f432aaf215ecbcefe0b2418e8938c7132463598d1efb33c624327d3535cc70e07a4c461fb1539bc31ce2f79154cfad3fe12bb4afbbb928c0fcc73e986fd5c4f8b42b92a31efd812457029391d03ea80b70cdabe22d03b5d072c4e9e18d9f3fcf593a2fbc48171966f31d14fa89bb08a59c3dd36cb55d954e8f9b39de2fe4c3d0b48a755094372192237a3273a2166d9b6d7156c60544827fa33e94891c50cc609a26cbab2661d39fe992bb55ee55a281c156aafb4b74a556d228bbd3aefbe4422fcfba7d36152e27ce5eef5bbb979f713b820070fba05ff249296c5be33c102bcd48948ae1fb1f435258cf6dab19c8f6b9acda390f9beecfe42e0f8ed7c2fefe661a19fb2adc13fb88adc6e97aa24419a824347dec59cf8190439d690066197fcaa16f28bbf1ba5"}, - {"0000000000000000000000000000000000000000000000000000000000000001", "01563582fec11b8166b4c0401d4ce1f19d74142fea09237719051d5bef3229659a46c7774fd0d89f1221021e90f1f69b447b6a6b22c8c0b84a675ea45fb5fa15abe3e1913a58d3f99943fe82cefaf5a1490d4e532816cf9998b970bdeeef82d6e23c099d01c2323844318186f238d41216ad7094ba17276069a086aed57532282bb70930acbfe2c2a5355ac3e7439d7bfd69013751afd5ed12ba950ffef837cf470216ea02988927028834458a0695ae48a611adcc5b46c22428584a7e0a989a45e8cd9731c1a6a62f914d4551bbf133c89d0517dcf3c759b631664e51d3dec7571f0475dd52ba12b23f90a0236ab7c64026053dda23723dc432bc3002e2e721d2c2842caa50c3dd3676c3292749adf90931e779b4442268d9ab3b93a6424796e64e3d982cb3209282699bd4ba7bb5d4b40cc62641f92f547c47cc2b04e9b8574de62d7dc532c842afeed1e7457c88700f060f1b0927d1bd608bf440ae298869c571331cee2b62078ccee66873a53dc30a7edee26142e3b761a019315d29b892fbe7960f33c324bd4cf168e45a0ac129a6f3a998f04a1fce6a8629034f796785ec3c985611ab71a634d59e1189cd91e2097aec40c333cfd71a2274eb0e99665aa7d671027011370851e2593fbce011d144a1db45168a378704e1573bfc5d583d10abce33c0fe45359ba01186e577f9f45047e6573613373a105c4d738144ef8a827781ab02aaeb14e0798ff6f245afe26090d2530bba4b1564beac6341ade03511be36f7a57a8959cc9dd6eee8aed5e9c60ee1365f7fa46b6d1cf049df89492849aab8355f496f46a5fa5ea811d2e2e521c9185fb68b6251f0cfb2da53af54015411f522679ef14927fa4987fc7650ebb6e699df5e341220b33826d721a342b76586b43379b26d8af9b040306e5c3962df6043cc41386b8947a69a4c039771c3035efbd64edffbe38a3dc6eca15e733a68d9760b69052faab287b65eeff76466dbe4dd3c225d71f3988e0fc451c812ef8b35a73f067506eab1129280797c3a30b66a4c2ecd7a7d4f3974f9d84ba8c2344fbe02a00531df05fa5bbeed4277e2469127bc8497371a5ad849a12d46843b9713f0cf47cf0142c65e821d7d9f660861b38a21ae713fe284842695da8debaa89be43932c84b5d6f163abe7c089b2cd10b9b2d30c0cdcb7f00ff21b7e285651db2114724c57acc6d703301ab3651592ff2f774efdab5bf9864523b9b159c23beef2f823d25603a6f30d4dbbf1126c25e1b3e560ad99a6dd48095aebca64ad859ff7958a8831dd4e70ee5b72f71478974012c5ab8a4cada44766b7e69ad7c4770cfe257f5a87f026f861fa3c745b0aa38152fc3cba97912ce97f1b285012079bd405d891c89f82015cb3ed0934700669a05a36a74bffe5c447b548ae1711fdced604bff52ce91a1e9fe6e4212709ff224d134c2db55a16eae8c1c01eaf63b3fe56191e74290f8c969dc5130bd8ae696a8dfc5c8e73660fa1cc91fde28eda894724efeb73f88c7176f3c37b6dedfb45274760dcea83074d8fe1600fd234b62205c1baee86e72c237e4583448273c8e220e08356632541af2e4cd6b0cd367f0e222fddd404564e5ce01892491f55e3d5cd0855e1bc285e9e80441100d92330c57908ee7b0a043bfff6df060a12b66c81dade10be81fa6245c3d6ac7a7c69e144d9f6f807938c35bb78c7cd5ad9faca11bb5696680b3cd681f14d38bb9000e0d0dae93b092bde9dd4ba2949bcc29e3035fdfb0b857bed5ac0ba86339d5ec6077f48bed86d06259f277507554dee42ea375e2b1a17e30dc06ee7a867bf5135496472636284953d4ce817e8a3db5c107ce7b17c25a545b8432f70049f6c7622404a604a5977a0e092a5ae80cf7a96ce913bb4a7"}, - {"0000000000000000000000000000000000000000000000000000000000000000", "00c71013145f0736fb1f9422216ae7a234167856a71bf8ccbbe579f1d3e3d639195b75552f18cb9da98c00f419408a6bd9ddca8fc532f9585edd641eb00e8a063cc33c6cad4c2b8a2a20e9818e22f9f1db55f3ff04794d119758b05de3fe51be62f1acf0e3051e062207c4f37bcfdd9f0905f921592d54ddb58b7258ddb30859eebde84f2246906eec9b4af027eb52fcbcd05c354105dd0c5b705b941d65b004cf20728443ffb6c90163e1e71ba2e11d17353316fa4840f0cddeafa78e14bc9d291c854a97c3ed552657394906dc479b1fd70bccab089051c876ae1c06e22c3eb919c3817b7a401d0a7960355f3a135380f821ac689f2ec0605dce2e0deae7ce82905bd927877407d4ab4f8dd4d8903692301dc787a26c25d97e985308caddb971b399d27f3513f4ffccb5cf0efbf461f1808eab01a9a61137d6199bd49d4b5eacd647705069fb4aea977f6edcfdb64f01e265d1fdcc931f92efa10051ba1f7930295aebd036a97d735de0babfa396c681cdf386cab3e019ccdc1336c1d70c5c6367a54f818ac79a65a173611615c6433494113aa60da1fcf394e8ceffd8859dbc12839b1c16b2a717520d3b33bdc527842b7a3271307714002f302a89f5ef8c0bfae4988e95dafaff463cde3d312c3fc6755a5c86a5561755ffc36b8ff5b368fc2c6284cc1d25bfae1807fac54b84317f3b6b610f3e46af09daaef7268e669f8c1cd4b3b72da3df015139027c32ecd1a6a560a429593e645e742bbba55d1affd97e192a66c0dbc84a0bca5c335a983d2e75e13ef2d32721f7978358d81ce9fc35f631f95da52dce2b7204a80ecd24d3991124a0ab7611136afd184c94c605492a1ed2ce636c4a7c56e5a0b24aa4e80d6b92fe5d6dfc101001788d5eb959585186fa31bc2231e40b733018a916b552ddaefed5ec050b09807c5f4f1f885ed582035c4b325e88e247f965514dfe4008e1b4af9bac413fbd3f236624a5dddc3278db02712e1a798ab9e684036d7cd3f146c757892944188eddfba2a28e38acfd10896a50101ef3e7911ee166499a3f7d756b0ed76b12a9d4bff6a991b9cd012879d4feeb1ef5c43d8403276de13c96ad6adb91c83430195e9f072acd9e9db6167aabff4f8d9d8144dd221081dab80d623454bc4f1f010d93094d96dc7fbe4a77c7e2d87accf2570b5f076d009bdfc6398cb1c492eb756708f1cc1c9bca0d092655766d10fcd4a2528120dbe7d76a420afc6e4c0a2dcc7bd985ea403a1f619d3bad1000a627be27d516ef5c945854853efc41f41bc9299001777dbb47cc15dbec1e1e89bd10b7ab0786a766649e27c55f29c335cca718f4309adbe5fb84591ad958897674d4eb321e5686607a76e147cd8712b382ce87c4f4977cbb7943eb07228c240bb59609e44194d51ca1400b78ef1303aa06dd68ceb923eb54148ccecf28b61fdf578c330ccf11e7a1c57cb4ee1bd22e5be210f9c438910cf4046ae9f218c2e1d9ce4c5b3950da811b1c7b7ebbf0081b9c43b1857d4d7a8dd21df0d7ffb89a62f0feb60789b17a13073afeadd9261773d74ae2a64e9d9861097aab0c019ece190fa763f0436ff76376f3dfe5d509fac6ea906247b3c8c871493a220e1cd5fb7397f32dc64586bd99fc83b1894342cd4f2488ee40b8a2ee08a74cccc5c632b4bdc5543814fb20edb6719de3670d6502dcd23b8139eaf1130a38425bef01dabcc49d4556b3ed87524143684616248d78c0bac57b9a5bfb7bbebd3e46675ec7ddae29ef8fd7a0dff008ffe3d30e1d9ac5a2e2dc53b770411c45460fed85b6ad8f2e188f798dc6cadc4d6b3521a99997018870fa5e72ef127bcadde44bdcb5d23eb315fe1a3e014e0e10d1351a947db90c4e0e3cc0bde1d6a3bdcf276057ff15dd"}, - {"0000000000000000000000000000000000000000000000000000000000000000", "0100bbaed247abe4acb0013f5749b44dc7b45745150154acf00f4f6f73ce9bf40d5d6db1097bf05aff3a1ca2ab3eb94b08f28a00151b95b5279df76557d7b931f9cff9991ea66b2c34c5052a44ec9ac86798403204f3e61265d5c466be89493ac6cb38db33599aaa4007b3f7de1fcb3035af8aa37ae9339d06c1927647860ef199638c90b62d6629a48f36dc49e6a41d15a6fa28125d0151572f2d9dff8336a276420f20d97f13ea0dacf5a3f9459abc9581e37a26bc8e27645ddddca8459d2e433a5a0622efbed5406cbe83db8b6edf71a3102c09902e04ce3a2ad0dc2b8ffed69b7bee7ce08e1b6ec97bfd0ff8db57a80832fe7cca532a167e374a0ee5759dc2dfe669a5d4426c7c35fe18dbca27805626beb6a7e6e3cd7bbe9bb62d024da5e5b9515d32b534443cdfd80eb463183ab463124a22d2c1d03bff954489f7e2c5a79fb78c8b471f14c071364a29bb745002205db6b929f34978f3668164cae962760cd629a11b0952d9c5cef8e7bd0c65e6be3ce57e017b738ec80b63963d82c3a3e50bab83ea48e7cfd92a788b99ee167b30bf2747831f270bc1db93b43e86c512d909fc0293b08d6b4591e139ac30d1c08a2e654374982eeb29b1bd879d8b117326f903bd8da4b7de7233fe37f60be86e9ebdd7021d6af8d135a1fbcb3aa1949686b1319902e0aacd7827969527b35f554fda05d8d1d9ca07991a62b7984429787e63a1b174f0019c09cf23f1385bdbb5b6cfc70cecaeb4e2f57979e6fcfd1d88f809f43bc469e52207e47b52471cf2a01e704ddfee3d174ef9cfdb5ae971bfe4b74a6c4505a32c833ab59908c8498d7898515f491a4226f7f3afc53a3aecc45d1a673568091fca930dd6a2c0b5bd8e75f80d9f8e662ceb5243975ab75f10c202f05c9ad76d66a9f5fe2645362a44219a2d6d51ba55d18ce1e21b26fddbe069044524ac7ac8b00aee5d9258e3a80aea48735b7916114f83db14e4bbf7af10f40f86cd928e931dbe3cb41fe65b9c5d5d5bf132fdf236cdfedc3268c8bc1d06423ffb984f56fc9162b435a277533aae815077e2ee05d05b5fbc2f27798027a070028d0dd5401f8ddb3a088f5270f750f5d17b85b30d2c7224c210a373861b12336acc1dc7ecf8e3872c6982fdfabf3ac63e71ab15619415b754bdf9168a253930cf026d9b0696fa0408725fef2fdc0006fa60d97130d6808e78987d20e257fd03fdc979859be94578d9fdeb171af3f55812c108d00ba692e4a0a5bb8283acde64113612bffe38f3387562552556effcfa90e5a349bdc7c5813f91c0071ff87e57e54bff707329e3d08fb16f760be41dc88c34e97b9b68940f51b4d033b35fd059c2b2f3fdb4a44b37fd13d4621173a8b8b97074e8f816c5e6f868ed612a5b208fa42d1b33cfaafba7681762d9f57ba512049d02cc852aa84b9086e22c099f1a110b8b9004d63039bd98d04df959050a3508f656230d8948390fd9097ea51caee169e9e4b9d34abc6441271f6bbc768048f1cb7f301a4cc9229304af1932fb01b9f3aebd4b0772fab6c6ac54e974b6e4f820fb649dae85b3d55c0a8026bd43ca0b135bfdf71fa96a8a26488e3e5fb50e8a859fbdcf38bd158ef5b584436b99f04ad5059e1ed10413ec1599874f93f3f8eddedcca3d63785f39083b05d00b867e836aed97e12ae7b99291e23b32531d1e051ad34dff07a52606d86cd203dde2bfb1a1e10e8f07438cfafcf9f14c1a0616fa67d335d51a07b863aba3585c6a199f95c5f91ab84d3e33a16a3d608309b06dfdae5f74211b7c70b2064487f28acf9f5fb1234b6fa580eb9c3fa03cb4e2357b55aeee605a85fb41b68ad9bc6c2837f5c1962163796cbe2610fc354652963f26f0af23c7c14985ccffd28eda2f6fb6dd2e"}, - {"0000000000000000000000000000000000000000000000000000000000000002", "00c55a71004dfabfbea6f5f37a7186c19657aec600347781f11f8f2f14db7d381a6a484da2a2e6dd66872902072d66a6edd17246d61e67ed2ba5f124bccc644941769455ac6c55af2ab922564f5a0ae45818e6531b3852641e49b9ef9e94a3ec34688ab27e29fff5ce5cb7560f8922297ba00e57add7c9caf2370cbe869823b24c087b1089877890146699e53456890bb57e64581c0c6e85a2dc0fbf27a80b6577a7b28e8d1d67a303cf55aac28ef909048f61a042e53e2c794689df7d0dbcde11cacf47abc61c42c3392f78b18e0c12894404b1e42fd4c198955d9454c4f4305b256d517e851e17dd5700f17dfcbdf172c6b269cbf9cac47d5ed2a1050148349907f34d4eb1f5680d37be065cf91f4a5c370b6b6e421761b9eb5a8493b125b2c9af4d9a14022b232be4ea5d38e9b9983bc20c6c94eb71671cf2b337ddfe4f0c39258fd1b044242ae3be79e0a1f9a0a9076e80f364aa0575b0f28bb74b77972b03019bfe7810d426ce5acf646b395ef17bfef03dfd7e21edd2c2099ed4583c539e3eb12ba1f7e9e42f41494e58a70e2abecb4f64e648c9d928853364f214c6ec92b9c5e3083c7456330a0e68d0d8a5960f6c9b12426833fb382153fe2383d263caef17f61f1b445829b162915ffa0fb363f29d44fa26a979875ba24067860cc3780f8a2b33a3cbf7940e6b93dd32dff6e3aa6ecaec7cffe707b0b7199e9b310de2ae47962a75e16a1fb7dd94a20a8d589854087e937622a31cc0e9ba391a03143b360b2c0c1b905197d37530a53be7e892fed030ff49365a2083ae0274445fa937b8b4f568c83e3561f4320d10ac27e871128ad0964bc3678d4a0b8dbb08be94ec1ae26ffc805544d5e529f1c563549535082b707be119af058c7aa6de59f3f7f5ac43629a39ed9616bb023d4ba1efd9dc86cf09efa5e8f2c4b85d986097802100fc294cfcccf113dbb3265ac75c3ba73ae87ec6410ccfc523e4c64e7a6bd29414a5d30a91dc1d72dd89058b2bb74060ae13ed02a1246dc2b3fef4ca1c2ba58d48cefce76ceb57c1a10913a3cdb9d3729d7cdc58010f3688bd56a68f6631b21c839a5670ee2c3dc60b20357dfbdf8d996729213241cdcaee2ca97d9d0a7e09756567c4606f993c1f6215211862dd5a97f72b0d11f69714dd9e767d8b5c2c420c6cfdf3197bf9c8f2049dba9dc7aa9de5f84d00b2ad29506c9472af61940a8484823b03c3bbf3b1834552bbe069ad963c7aa42c0123fcd9970119b3d7c31ddda9d13959403cda823d9d8aa69223973df43a64ab37e5bebb5da0ddee0a144469879ddeebc7868b03ac57e0bc351e822daf1445a0a7fb8eabed8fffb895a541b815fa8e0877a1aa204ce42ea62d98cbd616772fc0ec8e51cf39534f9026095685e6d9ea6380ff13b438adb06faaef1d881302987e34eaae7d13a99d349b4f6b7ca616fa9e64380a139f60ee58f3d0e89b0453f27f0fa528c6d0fd4a078bee0e8a8f3e25f80e639b066b4f4946b4d304b7322eb248c92d568dc71c6986446308be7fbbf5ec6404a196d375c2dcc272f4f5dacd6ae3c59776d784340892b44e24e868b7c85b53043ad1201350c0be066c0e4465edfb26f653e4326485aee762be83ddb9475e23202ab728d051ebcbeda75ff76176ca6a2e9eb529082bd6485f2344bfb6bdf639714c0169c8691111db20575ce4dd4f092f8fd514c88358c6c5bc2b37a24809c82635370698a7948961628135eff3b64f9dd77a1f7937810b225015f36e75e8244eac96ad8f9d286521525fb32356c45ecf0063a21236924a6dbbbeddf954f99e2beda55a1d60f7e692a04ab26f77afbdee5c4bc65f7f2aba5525fe65151f5e6fa8a97c922e693d80ce1cd05f7ae0d1d9cbe875b74da6e2eb8ffb824d"}, - {"0000000000000000000000000000000000000000000000000000000000000002", "00c88977039b0c1983d350b1311f01619923bdc18822eb4320a98a88bd841ea28839ecb759f73e1550e11172d5065997651abe6c86b1affe84ab8ab35f85a22712d7dbc66160bd17ad35f22fcb8f6e4da957976b06459b119193e777a65e15bf6176252a244ef295c20ddcf631fa7473ebe437847bf3fcb7524fb3f83cab07e57b98a45ae1f165a2241e087a9cad9081d392d93a7a41f4835bbbb38ecbc673bc38a4b610fb92b4280173c697a0d8730d67bc103eaf5ce299c78197fdee0dbef249bb4dbf5d27b0239a93fd41b570aa2fe8de04fdfc2826dd1b89d8cc307a0a2a7b507b043f477f1b40829b695a3a814d8d2384b1e20afe1bcb3fd86e087934d6f06eaa79e4b8a286547d2c14e83baf1d4d1cb9e9825bd1a6d938e262c7befa95f9b48f989f50349d5ae5a29448f79ce2e50e51b4c86d4b916ad18446d7ed9d6b61fefd219aa79b02d7ff12027491cab4014325fdbbab416fd0ab62bd033a209d52cabd960512301e56ef685ecbf8d7565237d00105de6214b77608ff1b1213c268688935531beee7e2820d94126b5d37beba95935c3b4efe5c739d05b1ee016ea70e74b0029326b4a1a4d751781b711ee99ae2f1af317c566f498042e52c2581b180f0f578b8e449166b5e5e716407e1289b62a04b4d31cad276012cfea76875df08eb0afed1f3d78d014f5ebad1d24b4c026d7b40d4adc202a1ef2a7b59f2451aef406552d1bc2246e99808bd4adc4da4169473b31ce7f5101dda067b04cd5f9d291fc0f986749b106afc96a40efd3d51eaedffd953722bc7b41e4c0b2cabbc19833c87a26a62267a7fba260684e24d85da99f1e4dd773f7279a3ebd7b0df076424167438c3a461b579975602bf7e24824bca98c2412d416a11dd910844c546247604b20e9ee9c2dd74ac62cee7d7f3a384bb2aea96c7aa4baa19cf8331ce98010a8742566e60039c63084256e60d734de05e07240409577d05201189e220321d7bad5276023f9b207d060d0b518dd5a4bbbf5b8408ab68b31a6db2f3e3152cf51ac09ea602395cf9978f1ec54d2afadebff459136a06a5f8101759df8453dc6241354d98d6f3fc4f44fcef7520acb43fcc9954b0a23e98324ca033276f1f42fc65f40e95808886c3d093f1c96587e8ad0b073f44c4f1bd32a83bd3cbf82a0c6dacf650e034256c052c597c6f45dd694e302453bbd5bc456743db11c727585bb5fb27f7715efb86bb31e6c7fb91eabf418e0f247f87644a3f13164af2970be637a9b7f7582a4021336d33335ac3cb61b7f3ac1aea8da145df745c7a0c3200ef4a8882864cb4555d2956ae3aeb19db946225a4e13223747b03f7b1a2f1c8c7d30db3f771d14a4a859427b26fcdf17f2f65ccbf4a69d383dc5f4ec865cad62a1b6ccaaf84d916b543e8a581c188d72b2a014571a1741f63ab3b2905fe767c1e4ada65b9973b1d19cef7fbc8b288b3f592295cbf53f53079b41fab1f97fe1224df690b624c12163753079e0495d36a4a5b5fe6ed7df57a01fb9406533dbce629d51437d6b115ae54cf8aa99a557addb2d38ca28a1ef6e81e18c21c473f4c21a44d617d7b3236ba2e04ed984ace53871d1b45d79bd97b47d4f431e5bdf85bf498a4b78f41351dc3c04bf1995bb85195b61271e789f4153dacd006f1b32ccec81de70485f333929be50932d95d6b431cb64c15d96294c12b5d61e83fa576d9507facb0f407924b0fff741d81ab28e299c1f652df98f47f1c8d2247b2f1b32e055daf67d3102fea782e8476bf28640f9b95fa491767efdd78d4b7f07aed39d4b49ee8502d4e7682389d325afb19b9a976dbe8c36c207c608f1ebf1ece1f71149de44c445b0bab86f34d41daf9b41fbfee6453e43b237f6305c211c00b9a99a476352a"}, - {"0000000000000000000000000000000000000000000000000000000000000001", "008ca82f2a0b00b71230c0e903c2e08d8565747c6c1c9e15f60253bdaf090c9afd5f64910b1e5939da1006e88d04e522cb17adf2a5d58ef77c8f13857ba2d577e97e41a16646cb950f79c97dfcbdda9a2e9fd8e7035bcade728ae7cd7ce2e2085a9725c8ec1a08f95634e28c9ed39975b3387193f34bb61fb5dd261be0a623237bba3e2c0ae17d9a74637ce53815e91b56e6866cd36fbc0338cdc1de6ab6f932d2cc9ece1d5e14b80141bcad92075b128e2a218894152f01e74313c5310c6062dd2762c8a9415f13582ace61535401bb5874091df649d5fd2629f3fee0f906d854d858b5c523a0408cd7cbede304ef255666a3ddc864e9e44eb398f9066aae61c94659d0a6c8a63793e027e6fd41dcfc63120596acff99915779f8532d5b33013a5bd013fe5318a8ea1ca5da750ce6d7d36224230645c83d3dc7dd3feb539a3be1283bcc6d781e4346bb0eb79f3d50fb00a111f6df11d2d7e28a914b3c773564943b52a2a60448bd2d148f030305633447e5c8cc4efa2ededd01098ef632a92e26d9a3aa03a0bca0f3f59d65f9b6a727fa128cb90c375ec565494deb6d778af885dbdb890c8e00c86dd4a5a0b30b547c5bca6daa53e35d33f2423345451aaa9e77d4b8b68295c62cce981c7b4f4125fab4a9c1172b27015b43810afe548a552db7bf4834155688a90fd13c840f039e6b580832395958db3904eff89615dd630984e5f0ca39424b4565d996c370120a7cfcd2ca29a37eca130193499c88c169513fc710093f592e4fe4110cd864fc8ad46c1e2b1ef7983b3a6ee76603dab5250b3423c582ffde0965e38e8873288b8ce64c51191336a5f309892a4cb244b575b016438df34394e0d8a3f83e369eb97c76d9b00eadfe6b3225ab4caf5cd0c3ad5823dc7e3a0685eb6331a62d34e0db15ebecb71bfeefd4300b75db1713855ef24d0178560b24ac8aa3ee1640cb4dba5cfc3e6c9d74a9147c33c5f824647fe803289a517e8bcf014e989fce109b944768f5f855ee2bf40d6aa5f25a67fa74242b2c1ba51bfddca9e31f2357bf47f20ad394f01f512404b91ad8ee8eaf96ed7a224426a659e989df74d2c33537ec63382d3587a11b447d05c13b5540f84e103f1b73bae51a902ccbb794443ede307ecd5505787f2f279d53d47d2ed17da4cfa370f6cd8289526b0c8213090587acac4be2c4d74f48cca14987bebad019fc1721de2e63c51f72eb365d42a210ebb525375472a92f099d4ebf7104ce5fa5066d2a846c9ee3a277be718d0b3ddf6d934699f24f9314b745f9ec918b45af6c54228b91d7e94c1a53f5a81364b4ae09a5d757df25652a80ac81fd9002a8825f63c0e27c347d1e6c7b26ab2cd17e7e4e1de3470c06859fe6b14cddab53fad67f3b64a3f9ba34cfb1c81e59859a6dec3b7702bbd77f03293e1233842f7d564a849481f77835d5b1d2d6c50d6eac4e55cc055fec2365f800389fadb55c34007309d9396157994db1c3cc073d8dcc40ca3eb838e84a0fc8a6eecf48d62fb34c6afc82f10f8ae77d9e9bc9036deb6b5fcffeaf4e05f46ab52ca41603df93ea090b57f287b725f66bd821721b55d4e2312fd01b35720b8e3276bb72de23c76ed58d643559469d2c57a087457f1b279a18fbf525920af6bd7169c78dfc5df92206dc4090970c9f3cc476856dfe73ea2692c75fb1c32f9f6398bd52f7beac61859eed2d1f929ffebf51f40c23932eb1db654dff28138af8545e92858b5ba2972ace0fa1fc4edc69f577c2bf794c33e954d171866211273e61aa09bdaeb46cb56e32df0b95938d4f35c412d26f1128d849854e3432403998854b328bbc31be1d07ac8acedb9240f2fa94d159302aa14d0b8d4d232a6a56c783510c6334bce59e02cba0ca48041d03d1"}, - {"0000000000000000000000000000000000000000000000000000000000000013", "00407be58849b0be5bf121444e324798fabfec59f407617c83e16ee0278518a412f9620b71e01b5d7bee0b6a6d01458ce82c9a12e147c323c181c103b35642267aa7dab94c0742883f62cf0a76303993841c4a540387ba62ef82a86d7b1081bed7bd878dbd34ba62d42bb046406e6454593a1842de0fae82e653eade32f509cb5fce4e0d140d1e866242357ba781e4f2d8077b0e95f1a47b85a30a40ad41ba23c7d1e11b06d0f7af03043bd3da95e5579fff4408433d3bd55e1e5847ea33bcc7505e988ce3ed6cc78597fd633e25c5d2bef806c2cb7feb656bd5a229419d65772ca5682f3828964832f6e37e940e45ea46a5503060ab29d6bd5a0a07128a1a269411de02e6aba44933b752758888f2d20b1ad4615acbcc5d7da2e1a2e5c8263291673bd4540c1aaa155c811b5808ee55c234977287fd87dcbdd1bf1cbd84643415f931f0e652dccf7ae0cd5ac2f6a60f02abe902ab81236ad46091a458744c34d599fece2316b729c022a1d0177794fdae58f3d10797381f9cc434a67605ee99ef5f2edae428f0c451d124401339f259f3e3c3b9a63e5369d9f8f01054ec266493ba4b0e0d697a5b854926c4c256439f46c66e3a60489384dd70adbef0c7a3b23bd001d70f077458a20053d649bd36446bfd73701cd3b32266dae276936e77d018eec24bf45df056acee47bcc537d31e751856e0f3991eb60c9b6e7e0d49bb8e7023f7713df3e6e7b6ed9e50bf16874c03bc076bbda65e6375c373db39711abf39ee1998a63d7bbce03bf7c401e1bd3e177ad54db7efb419c17e82580dc6df153641a8e8d5eda652d9b2d3f21ff2c3f3278c2d028cf7b25082a5f49d1416beee1d23d31e60e192d721a5037471cca3c7930068df6bce36b446b183d228473668353020ab3c819b1a16ee2e3ae957572bd54e934e95b73354be70ca5fb233d14800455727129c39a9b39c057ba6c7fc22691d363c631518f5191d858c1b352c350ceb40d115dc95564fbf066d0d0603158ba5a4f335584950a9020a3b11b664122c5c09181e34477e28e1cd48e38fb7231cbfe82803e0aeecb404fd7b8e3074965bc1083eb582dfe7ec0db3a21b8d2685f36b06e36e9cc827ee6ecf16ff660413e1dc109c6ad9504a01fe8e9719e6e70cbf66d12a514acb954b8812a39284a2a16fec113aa21d2a5700d8e130f0a1bb39e60c247a92b70df5942c0ee03504d3a86d5251553918bd5254bfdef536cbb0b9e1ea0aaef980f4d6eb52e20771ed291d8d8487b8b7810120612a3c68612fcbe568f499b42f279212ac3ac99f0986517f6e1ca1c5d5f4e2e2c1fade0e88335e76624df72cad4069fd4fff2a55093cd0110a35dddf40310ba7715c880d5225c01305dbacfeb9caa1d5588d8611f060f7175bd57da2a5b159328d850a29c3580d5f00d614f5c55e149b2bb104caf83b104e0de638af290bcd85d2366e46c5bea302eea2c93c220e007ac41b0b161b933227b9654f92e133ee33fcc105c4e9aa64170ebee6a1d3f165ced68224ab5eb6654ef799386312d333afaeabb079ede5419ac9b61b6a82bc7558467dc4469a02a8a2d1fe54f8992546c69e759919f00d14c2a2a098db4d0bc76282a7763fbd1a5bb95d703714e9afd66ad7fae72fa8a1a417b985592ea890e4680bdd11cd628b87819196f287c9d4688a897997c514115185b9330a1c9d3379d2a6c8c41cb902dad4c4630d9b1ca50c053c3af7cee3fc0c39149db2f3b3bde6723285ddd25d390d68f4cc7349fd4a6f2b26da7a311014b4fc7c4a7f25d7ac596be25182f2d9b57f528d1b10d2a50ca87489d214679be8e95c16b984579ca21d8a0219606128977749622d2fd813dd10c890546a3d0a1d723575f745ffdcc58d254a6d0a39bb74ec64"}, - {"0000000000000000000000000000000000000000000000000000000000000007", "0086e78bc80428c26857520d2dbba3213939977b2b0181e407c9828c892848c2069cadca9a4cb7fae42212afde40d164e1f54f4311a671f7608db66b9a773619e0c779ed141238b42d74e4ede3a1953f375de78a03f12bcaff02cb94feb7d60ffa4377dee12a9758bc07b6a7f3250738d75ee7670731dce68681975801b8152d7e5c7623317f885334785a6344597cc05a985722684c9fdecd862cd9bc53018ae424de7abdffa01e00cab447af023b8ec38eb140f31fe3a4e9c955819d5a3c96533de0baddc30eaa682bde00cee88cf98e211a13118db93498b9a9b1d5811f6707fe6c459cc9c81ed627804cd35eaff31fc356c542d8ad9a10505c3800dc6495dcc07dfeead63788b85cc3c626981b1c4801e00b2a68ead23bd81887882d6655f2fab7b7deb70e6a6d7f5c54322bbd8b84cd224fd0a709e79f264128873ca8c99c0ab76d9477043a7bd6a676b934ac3206a85ec68309bfd5ea4d221783f5dad6e2d9776620169a8b092d29c56d693072292dc1fa1ce290d4acd01bad5c878aa49699ea752288a95225711785ff1cff1fa76ef20a18d187de5cbb249bdd9896e41a1ac9cc2770eb8a7b28346faa7313c25662c2a9aef89aed6644b0f3c1b122ed01bccd1472afa63b46ab97bb66b3277d719c29d9ebd52623955db1aec6bb6aa83ce1e728f2f9860fd1f0429391d81af878077f0efcdfb4c808060052080f70a18a0ff4e31b76d5da3f541747e62aea6bfadbabf82786a4d36324e4e1f8f68a6fec802aa2cf0163ed5b337b3a53250635d25d85204c55fd39d53aa13dd36bb9f231045706bd4df601abf7f87f0bff62736589e3297414b2575d1566a5e7ca3e541025dfcbd7f95b2e8727dd13b1c84d43d55d977f51bb1b7b81513b4f169acae7129c96f34555d00d0eef6b52270613556ec5cdba464a9fcd7623bb52281c73dc01c1eed9924c32768f6900d841ab47a93260127e63268d6e912c12e84cdfa253b46471752d1d9739ecb61c32ae12efe6268b60bf243bfe3aca35120118368028d03fa117107ad094ba12e5a7b2125ee443dc820a13393172290c44cdbc4f8260c1f9ecbd926aaca1561d0ff53520d0b861c7e0a78ca776f88f0a63f864152340591c54e233fb74e74842f7fafd6299c89873c429dffb6bcd11fca58091f3b766a285adf38bfee91103e706e9252dc68572d9c0f6944f94013f3fce5b392d2fe60b0ccbd32fb9a6f30da5db187d3625d9ff02124f5cc1afe739f7fcb502eb2dffe7f8db1a393dfa3cd71ee71e18831ede59d693b0e12155e311b6a056083b39da2f57057745e1f4cd86d17475f7b7571a8b13bd7ead2ae2bbc54de4873dc067d041d15271822b0a5526b66750fdd9e8ea11ed46692f787c1c17ee3213b0e74c1558254ba166867b26592d71b8a17f203f02d226465751a7e49ab60441d2d911b2cb7ebef6ab13ba1c86071c1ba98decb381a5589c71078afc295e21af7b2b6dd0fdde96478298c7303408b4b14d990950cf9550e07e65aff5e7d66664563021a15a33268403f5c871d396f73709941610f4ffc362165b784ed604d5f69836cf0e78a48cf210911bbc5912d46aed2e25a09abd6fd528f9a45c84ab7ffc4fa598404f5af7262bf1a44d1acfd976a52a1f2be9134a8c35ded5a9087d566affc54ef783c7643e9fb58cbafa34fabc644da17d545c1c585b448d27de335a71361ad37a32c140d887894b676a0feb53641f45c43eb63c745ce79a48c6edde549a946fbf8176669cefc24ac43dfeb5560e39b17694c7732ffbbdfb6155eb18735f63bb634715c81b9cb9ceb73cbf3396ea914e777a649d1b988420aaa267a35c51f17b13221fe694b49d68ccb86d2135ad71d3a68e7e07e22b64ed2c53a609906fb155ec"}, - {"0000000000000000000000000000000000000000000000000000000000000018", "00159fea549b6d0ba566c513eabf08e38ebbbe539b46a2cd52641626f929e7cd0ced76bc77748dbc09e50c1b47839e2d51698f18c11daa75ec8d01f3f20da82ab43e9e78a61f7bb3a3c55e8e50cfc98460325b910537ea036b43e95d35d967275fd93b5209e3351dfc072a684cca0910e7a904c20549a680517956f09d3d10116ec4508ceeb09e5a032a683b7ccd8e4eb4be1b3e4b9360be111687dd9f45fe5a7f3ca6c7351aa408005a6171edc2a6c363b6e25c4d60acfa0a5b39da8c078424f314dc0d477a6f02ad685d428710b3dfbcb1021799d37d09eeede9e4a37d43ac6d157ed5551d463432f2fa669ecff1f45414d2d4f84ff61ff934f72d01d94f999667db9df5107256a01e0de8a29e9d966b1950cfad8ce84e8d42a2d2845178addca73957d7b440313aff326366fbc109265152d2b2e1c445af36dfbd4937a273f73215c0dd8d0bf0ea688ba43b5e136e024a235f232cf643cc1a603b41f3e044909acb783610520fad6e67fa6d45ea44b28f30b88aeed9da4a350d6f0d3f074e218ea4bcf4fc8b51385a89dcb94ab3222542f35d285a93d957453919aaf853cfb35fbe8602b390cc8a0ee9d48e8fc303263401010cf11d53362458b4161f1f0ff9855e8327d866c6392ec5f702f01a1c8a65ef06a02e6451a483163d6e8afc6638398423083def5f14897d9a80233c74bd2856511273ebaa06996a6d17780821d710e289f564d5e2a80d5c3efc0e3b4c90430dae8aa16eb2429eee66fd95975ee5dd06b11538c49596ef4cde73804bf817b62fd8fb6adb1adb5c793399d9f970413514caf63d055b0c6b6fed082bb39ef8446424eed4b0a2a94eee810a5f1479790eb5b4309b4d7453b51311895dddfb9188e01ddd7b131fe537abd13ea9aa66c594b57bd43f392d3cf74d15f2bb7af65e623336fb14e3a07d8786663e35118500522a0892b14b8dee9142470a61467f8bb41f35e96c1c179e5ddc87dfbab639b76276f08e720d16ef720b3aec111f9564b540b604c6cd57f97182b15160171cb14669da6bf4858836c2de335c165196a3dfe99c03207ebf898c9e119b2f817aeec02900fea69c285916c4663c5e93ec3bacc865cf617e17e20d8ff6b64604c467302c4c4762902e54bd8f37f4a1812ddc11430a838abadb9877d194c154259227cc2e3689d9056b01bafc0f36cb921ff5157396b17eef81d4bb77073a02b11e1f6f4cd457fe95e052ba4423a9c8a49c82800e3afc296ccefce11ecd42893d7016894378384c82531d45baab190850d7bfb7cf24f4d8aedff1bfc172089220d0addcb9136738a101ea2f2e91231fb0f8842b03a97ded4ce7c3434b9566a5fd294da8d52fbdd510e26e90a9ef1ba3b961460f77483771d212b05d792f8a535c5b139f43526be5a006e13c5e24d7b1a52d01b494329c8c0b2b9cd6b306e7228f15880fb6c826159652dae04ebc41655ee626594cd80f6e787d48dd10167145c556dcd2f8140186a5dd1b21a7a714e499132fa40deb687b4375f9330e959fc5cd09edb73223055969f58c0923bcd0a843e248225efe2c9dbcbd6e59d4d5998365bedb660766623752162358111ec23b10198d5bdfc5ad7d6feb350d1bcfee75da0e5f09444bd1bbcf1653b0632e7c49cf09d667d6f2fc7ddd1f07c0374926438b4429f8c18b0ecde5f917e8d7a98b0e37bad726d249ede5241954497272faafe797461e0a8861e2aece8539475102085468462ea682174d3445e50c70b9a15b2fe981a4e05c3c0f8ba3235ece12091e8dfa99dfb059a50c027c7f5f95adf4c81f813c2a9979e9ef149c79033354e40667a5219bcc92336011cfe8d09997d79337c5b1c51ca7826ea5d05bbced326ad5d7a1b5daa3f4e7561983796291fb6617399f"}, - {"0000000000000000000000000000000000000000000000000000000000000001", "001e4a4eb6687b097e0a4205f4466130ded5da52a66067c6b7fcdfb2d9bbb8d734b375e21b2c1fba9e9504df40683f5f8acb34135792d35fc175f271ff9c51357a6471b42ed15db319d3e925e9f4532c979fcec00aee043165f46af3f770734507f00a0cd26737cca72b43cbca795c620f4b2833e91dba30f5f409be0a2f126a2771ec9acae907c0d2696864683b312e5b840212e17dea8d84d7646e4803f3713d142d9145cf8bab0279aebb0e042f0ebab3134467efd7f55d9bb316231a661487f3b0b55fe47b032c2737d05928f34bf10914e2c1ccfc49c78be95d319d8abd30acb1e48b08f11afb25cdec72fca5ee91b885155ec25706689e48bd0772a385ce21e7f514da724f02d3f2a1b218b1bd6623eb8f8191cddcc942f2050e696dbc22ecc13f53ba1bb13ae7585e01d39182a4d5943aa7ddab3dd2119647b0bdf950e2aa07de8e953e6353c92abf7b973b7b024cba3050635a4d5c65489e5ac6917a58b7f5b8b130f09c3ba06935ab5b09dbed50f213cb20371afc80141c6a55190aa27c825e4b768d6241daf6773c7cdb22bfe21e34c98cf161712287031a03e677c43652f40e7727075066db93fd10258812e320a963b016b2f97778cfbd286cdbdfcb6c789989e737f269e7b86b4937f47e4a7123e7872124641153ce6beea3ddd577ba68666cc40a9b485352cb47c4df594d52439efde53a0329011521456732e2ce829d463bb57f219159f2fa0ea4044167e092efc0d2985582d5670e4655f7a4fa12ec612551c97dbd2dba177902f5d7aafd64ff5bd31cd8d2dfe0ce56aa7ed044550cae748777adfd18600d0df5abb9dde843df157641045ad4f67e35b4a9d21ffb5a3ad2cd647f5aa4f4afd635a9c163c8cb36b21c1f1370685fe1f917e0c1ec13b4dbb66c0f9fdf821ed2b7aec26c33038837560815e008b58978d793b501f640b9f6c94fa250564387ed4d1ca12e7a301f620f0557015cccc081afa1e48a22489cbe1f7c3c7a041a39e47b5965abb7ae51d8202769222ee3d31fe8551b6ac9f851207737f0111355d8cffc99b3d23e32380312b413424d215fb8f9313f6ebcee7aea099c9b8008ebf7348c5bc6fddd5810ec571ddf91fa889e504809630a898b826015aedae1f4079ebad25925b639311ad94bd40906e0a6548223fbf3b49f21da02741ee902314a1b91cfabd97c58304c5ff42c603a4f0a415804e75b6669c6b1867426e46d6252c48f186d5b2f9209b625fba92696798cae159f9b3dc229a28ef5e65d3c49a596b9d615a702f7f7741fff56ab6528fb95ce117949e6f78a9ca9a096b65f8f38712decc1f972081a29513df459f673db12f3b19227ee9753a33cdfd21c3469bd980a999eca9ef607fbb2f446087b9acb701d85b43c32ca45028278d68228b8eb85f63b313e040253b27c0c2d133dfb12c17c98214f90c6b1ce71e1086e57c2b56c8c93be7535790cbb345e358ad924b209bf60c16f1caa1d3ce781456237ef55b2f55ac8951945093d2cb9b47fe4b295b72b771529c984bb8b6715bba37ed78916bcc349884ec477f4b6a02fbd27e42c12b4495577848dda0855f224342cc70e21bc3fac181889bd659ae4f1f36a391007eac27ae6c1ba53d318f0b0c91e61b4dbd2d5055c507bd02a226b1df414078aba47a3cabdfae996114329f712b2b0231c27802402cb7654aba25dbff4e314f12a72390fa82fbc5808dd34ffb082fd17fdd8b4ae2df34c21907134ea3d0e5b22bb39dcd4879ca0a14c4c685bda0ae2736fa60849560069699211d1fbe0f668dde369985eef7bc41d772f3a2691d6932b1a9659abe6ec9e0e87deb3c40a1699eea70cc41b1feeb1f560793de8d640f9325d256a830f1fdc01e5b96d532d57cf96726ee993db11"}, - {"0000000000000000000000000000000000000000000000000000000000000015", "000f5d8671c47e2ccc19e3c39fe60a654b05badfea01400ae7708843a30c2c645c14fd192e3e2397a6d30b7467eeebe5125dee7ad5912b46e71995afdb670d18815ff35d784845ca2942a43c9fc8ca0763d0972101338522cb681dab73e8a276fbfdb211c32d3ae19618f8faf29659c9537fd9569331d942be36a094a626093862020609a76d54b142558976d4c4d8159811910e5a1d1e07effba5cb58530a2afb51cdb17c51f0dc09c69cdc1204016d8fe0d379b0694ea73e861ffbc01cc6ad720ec7afc924695565a775c886722b3ad5611575fc0c1b62dfcf6aa202f233f5a7c8bddb4726a9166adff721dfe6bfd2c7a2767a25d690a083147a160a4e58c5b9cbfbb575d52789213c7ca62b38df5fa123878b582ce84831cc0aa80c1ef6dba69670da3f7e0dae847c5c8f484fc0c93209c4f560dac691fe3b0813a67a3fea04ffdb407553744dc0c5672bd3bacbd801e0cba6c10f09ed9be5c19214975389efea706ace3880946ac32c764b7fcbf54f09afe96e04cefa5b344bd8130fea77ce27f109b88516cfa59307595bd3c253159feca7331ed1aa99f5682757d19d8b00dc4c8d0201eaf8e9ea3dad8c23712d34fb9de8d0cd6cde9a1a54d5a40ce53cd7f5a8531d327cd73d28073cb2321d3c4d82be9ae5c165e5226c09a1d870a92de7be6e41dbc2db6d5a2281312397db4767e8aa5f1574db2804cdaaac9724181bb203b84d03c3fa72bca216e6aa0eba26894894b511fd69ea30e579887f13bbdf5cfb051d3ddfe5aa8d0bcebbd31f9a1ad02d4970fcad9c16b04d3950c5d8c36a864239ac70fb7569481ec5ed08c901ac4e64b207304f40b1feaeb8a0849478746f7d120e66d4fc00a3e769d88567f71b3a7d65fe9ec60f803db61858a4a549112440a4b37b39d772bc786233547ba7bb22ba2f85ac94190a79383e84255d6d13008478233dc6cdefaae762bafb25a25cd1d28bbfa9312c37368b1da065d983062a3f4c244ac57e7683051f9bd55df3b52f1beb10020c3d4d35c969f3bc65e5295ecd5640d3849f96b0239273ea5d227dc5b93b7f0507ad2b8149e2097de0d127b7ccf2a27d85160bca1fea5b884a1d00c9dc0a2209cac9654569292d49a408946acd99c5f415f129b407f6c7edba361f7a099e2f7202eef40edb35819c45b7713f0192952cbc21e50317343e1d9e35df5bcfd7bbe46d8437477fda8d3b3d332aae9852abeb2a18c57dc9771de9990558a78e0f4f6d4dd9061c43f9166133b3aba5f1fca7321f85104153701329a2dd94c6e4052a3b50eda129795e590dc40542c31daa836a51511b0ee952aca1032d17b32f749c63ef8ec8b96eacf73671da9579f221f0c27016123c46f210c1e2a201f236c72f72d9147f57a77619b595fea425a8ad55dc82e315d13c30d21a12db28039a8f472c0fcf515f71b8e0e84e030a4cabf831ef0ac98d97065163cbf316637f2af2636f4b5e7c0f570654f8d807c237a5a414d1708a5318b1607af88acc3c6b7c2589ab1a85c0041674a4dcb71a18a2d7837d2a2cfac977cbf6913a80543c2ab961f52c71f3e92b42127cc153dbf7cf7b58b53b74aecad1b5e6f95c46386b9423406a8d05e5f7738b2a2f3c0d114758cf2a44e57d8ba59607d4fd7269e530eadcb332889d2617044cb4f911c44946e3b181fdc847bdce52e39e397d1b30a1621d9cd34b1f99144f0ea36252a6f73fc71b0a459db40b8722f764e1165886cc6ce5cdf0d605b029be57b3686f6d07eb58d47aa4488bb9239f9d9d2d19cfde2c830de0f76aa494bb862fe6cdef969c9bf6294ae377dda6836f9830534e3273b962736f581b0d3ba174d41c8fe10d946a5be5f87b353720a83df0655a7ade13e197c701dabeca5375f7a5df1e053e8990"}, - {"0000000000000000000000000000000000000000000000000000000000000000", "00e15d5d3d01f47cdae4813a7a9eb62f5c765f76ef24bd2d93210aedbbf5b0c3dd37b35d8ddc421c1c5d0bd960fa4b0a304718e801c05491ecbaa1b95b88561de5aa230fa6b1633cdf21e895f7b864b298d9334503b30988738813014e7e907b8db86541a85fbc485e1522f1d17dc8e6ff82a9d20b1b17a235add27a4602160f3f1774c6c92ca10816471ed893b217f51ab7e52266daaca897fd312e038622e675e8c5df915ee09f031c196a8bd68ad5d0cbb7744d7bfcda8b573c2f30070bc9704c42f6c05d16429f147bbd5b4d723da54e03fbed041c5d2f3b5493e07830e0955200e1140b0c0d1331726a50f0b7517fe13f398f4eb299bef764ac085bb11ae8860a31a1f5d2347a19d0d71a2f1a955a1ad424f6384c94b3bcabf63b407b050aa8241d56ca2a2ea263ddd1a0edfc7a84aede4f8e2dbfe338cbb32d03c61a891d06f764d2c6ded93a90d2a7ddfd0282010c81651099a28fd14090f8fb60007e46f0db628265984b4061de00e569ce381658ef06aa392b7b67600a47ba732f067e4c9eed93116e1f2adcd878d8fe1e4a05fd2b6f6807b7590ac974c5e22aa6b1ae5843a6043ff0d08584dc2debaa22cc00e7d12209ba7d4e304634a2d172e743e347c3f4dd1f4ecb4dc60a7272a81263671e128ae2947fcfd28e9679c5b369d65d3d622809f3a6d82eb74de7dfe31575acbb597c07f64e7c07cbb9d4e04ea9d7c24ca085559c43f29e6036dffd20ff1c037f36952dcedda42a80c4fb9def477d8ae90e964432c3cc87a1a50782829a29ffeda1f417c01f19b74c8be6086f10e6d532f84c57014a938b7f010009c1a34afb97996b4990e0ca1b503d6590121ff3bb0f7bffdbb232a1ebac5cd39375403d65bbec331e9309e33d646b1a438542ff768395be78425805f443d92506f9721cd162538d583355346b79be2386f3b36f01fc38919610a601dab2233a2bbaba80ef9c97a6591c027505ef6d842fa6d356df08dddd1618373acefa087fb5f684c7424ce9c8543b09ae411a871355d6e240a03a1194253b1da56a249835f5af4f69619d2457144d628b6a5bfb5d5564468a4362259a861ff9bf4b155156df9c875817c03ca20b6463f7de985d1c7bf72dfaf6c48253951eb14117ab307b2a46e2405736b0597505855ee72f075d3755b7f0343596cd40174a36066855f3ee0fc0eba805b61d7d7cc0fb0dca5f84df09fabe86e61ebc3138ace1f7ee1821964e4eb7601f0ce2b974e1a996f5d26b21aee1af9c5ceeeb6bde153807bfddc9533174f05523d994a16eb28660fc93280c43eac3691c9478efd4232e79780c25c98f75719111a6ed2ff20827c16b9893dfac73e7a512316f10de1497ccc058a67f019d2723b843f2a974fbbefac8501498f3c67c180b8fa7f631c1fd28279aa7011db9890460e0e5a00154f01870c0a19d89cc331a187aa74c37cdc3e475d16e55ac8eb701ed4f9c16eb2c794b7815e1cd63cc4eac16c0f5d6a1d256e5daa56a5e7dbd185d12b8898a7f6c726f11b08817c8fe5eb038a33f1123f9298fa46183eb81a197dc1e6c7876da3a8daa5e0bd78e9a2a5f35734ba712fe657f31d48870070c2d42ac5e5d9a532ad467947ec8f5710b12d8dbbd1333c277de9554aca0f65da48584e86e3e1ced76e960049d6a9e6dd83788ec5ce2cc021e29acddf49caed6054a766d57cda9655888d1d769c42628cf058f0fb23333cfe71a92602d061283ef52d575fb12ebba26324a6b5cfea8da5f4fc3740bd78afd64df139eff25470fbbf22134c9264f99e3819a5ebdf3599e382e376920dc3529a09343c729cdc27e1c25ee2ca8f331d0f31976213ef5956be0c3e5d3a6b17625814a0a1eb2171e045d4500d5a0ef552042ad64349c70affe8dc438"}, - {"0000000000000000000000000000000000000000000000000000000000000008", "0021683a8c05db7e4c76e339843d29ed591991b55014aa222ff29ff8818e24e87b5f50a2a26bfb546ee505ef1a45d7d348b3c51b76035a49a291c9f05cc9ae0fbe2da1a9775c5fcd0a71d83421fe80e8300b74b003bfad836b1edb513b44010a8e9f033d178316148e45820eb6975322d7595b45897ee37c568ddfbc1917363ccd168e1fc5973ea0a40a414b5c36a2687fcf0947d22b3145dc57afd2f3351432f4692694d67ed11e00d9cf3972148bab96b2b018bb6f8dd07347534e1214620701f20e4d1556f483d345642dceed965da7ae1c415a4b4f96c286f634a96dcb6b35fe86487a58871f01b4ed86b152d3bafc4464ad39ae3d3f999b913806c12a0c6fe1ad2d7613b49751416ee93a2acbccb323e0cd9e2117dea3a292daa6615e29a2fc60fe6a2d15f87f31a7586d2d5370217eedfb2fc1581c5eb47c273ebbb12aa103555ec674045de412e50cc46f900a0197b82f90618239809980e96464047871be924feb0d2094949c54094ceb2c28830ac819ea8f0cddca0f0ea1d363ca4723699d2ab0f60d0d328049974a25fe3ad9cec8976027c94e33359d17ff4155e75e5d3eb706f849ff7253e0ab5ea370ddb23b73dacefa777b580a8c7a44b01b2becde2ff3cc7dd7bce1aac1375c3c260c7d918f8d780d656984c396d4eeba382495ddc04a66ea714914d74f13461924e37472378df93d40e40367c0238f19864b9782a08b27a3a3dd87b57a0ab2176e15dec1aa8d07eec5e2c57871686e9605fd58f42876340d0061391d2ac956e147b9990eab505679747a47076348e96e574ea377db6b461986614eba195614cca73d4a14874fdee0f3df787beec7bdb0ff93d8329ed70866e2d72faaa614b3cdb07f494e9ad59f4019dfb768fc17824d4a55452e2a5787fde0fdf13966425264832f9a1a615919e6efd2bb470abc54fd67b10071aac5e840ca891da4c2457231ca9b137cbc6d34042e779250637c1525d92191907806d64fc47461970bd3dd37509df52d98c1c552f5c6cbb2a2475741be184736060b8df263d92a41c33a4dcadca6649cbba40d90d0e668e0a6aba82704a48ebdfc695d9f13103012c8044e8bc76d46dee8130d873d3210e3225b755a1e25392d542c5ce3da63833bc7a7de514f04d4513b2aca2465d0522e18c37d74e305d95895b90cb145cf030890e64ec9ae4f1fb5209d9253d9918bf915add51f5df12f4fe1d6256165a336355a054a6b5c76482403a62ed0840d460db4a935f0d52fb675a4e27f6f62211b8ed9d44a1a2861de84c00936094ef2655db50f0b23b72ca3c5e212305672e6ad974c80d46677a9a94edfa474cd57c1f1c75c37700666818e8533f46e4d40c9d52930236b03597db4923fcede1f83567e4380430916374fb710ebc124c8deec6652ee4bd539d3cf035f9e6d60caefd26652e20a7596305a3420d6ee7b4394945120ea2739622765b677320c5e765a3c600b06ecac1cd4442a6b7c4785f353c849f220caf8802f1c5cb6b89d5e195f7b930818935ef66ebbe99b39ae057f1203970185e2983612d20224d9e8d8c770937f5072dc1eb424c7e1fd62858885ea7175c8395c9448662746ed6ee63d73afa7a6ffd53b43ba5559b94d2372ddbc07d05d63bf07cdb8e73fd80b96da4f3e31bb0981624dd09bc4df1ce184b5e45fbb027898fbf6ad4a604c9673aa5b85b1d94813d7cd8df76c3dbcc6610c2004a82387e424f1db4464ffd5b1ae4c97fa62df40921a2477d41e99d67a199799dcfdb74d313d5e07158a27e42aa58d4b8898248039c38ccdfad1f69d061c2a697e3798efc6ddb8b55f0ac5d8f162b27f02c8168e71481c46197dbf792403254655fe75dd3df30120d9b98b3e4f0aab0fa937c47a52f502b626de0229"}, + {"0000000000000000000000000000000000000000000000000000000000000017", "004e2b5a2020abd95263f39c4d65c1d9112073ccf30a7df5428e5e8a7bbffdb556d6d4fb1978eeae589e10a155f665fbc57bf3b4d1a10ca38b9d4f9ab6d5931524deacd7cf9b774fdf72eb87425950bde392c8cf0c8447c08156f8679702a1a3866b7e4d13601ca5761003db87feea6febda45c5a3b76e5a0992b91182c30eef5a91516c57b3cf8102af61e893561c0e3f6d48582b8beea1de094b33ac87c8725c2386a2eebf434d01d46cfa27ca3ca54a84e0b4853a49ef2862bcb18933a9a41efe8f1081c57fc661db7dbe56c2e7f85af813b0dca2e0e233d1a1cfd65a013de09e12d4bdcf89210246d735486ffab49b468606e091e5e2ba55617602400a7cb91de9e3a217252aec3c6d861f75f8e0611ece2c4efbb174558be083cbe752e2bef323bb6a74179fe2d11eb15627b53321f73ac7684b591f3afb8819767f67e406d78eced8840c19ef57fd38e06bcde60152101804a71d0374a9f34f1fcb9db6f9b9f8ed7418bc8c363348390d246253275fccb27e872e351eab0f7b02899043fd0b4c9ae22f6c95ac52a91fdd185f41852d34be23f14be1de966838724956d436d8c9881199ced14c5fa8511975a65e02c358522cedb334fa2d15e47bebaf62b1be11c3b84265db3a36553a59eb14c24fff633573adb1afe53a2ec158eadfb27b82fe24df22b2229a2188f3d8044c6746a20a2c13b7f53c09ea775af45be369d209a3470644b765644131432427502d6e585269055c48136166bac32e46c2d559a80e91e1348731e7279cd6fa21d1ebc1ff5f451cb8a1134847da0450d1bdf534e3e914acfdfe8f0a1c39fb14b55f027aed21a7d7656305eea2e6a9cdacba0c612b0c0c43c0d1a16eb9fb4a81246a5e3337e5f9c6581d29e3566b20658f843fc43d09e71a220bd5bb75353b2dfcb708340de9a1da1580807c2a5987b8d19870004f355b95832071b52c72747a6a9f58ac41997e5a0ef9509e592229d315de45fb62d7d649eb6ad432f60f5f75a8e1045dfe69517159d6e850c9a3c15d7ac61b77467f04ca7091a99b46313dd5a639b4a77e3fd80a25308062d56ee0eb1eb44f784a316d66297be48b26e8d24e0b4fc88ff99407803d3cecafaed8ffaee81e19dc76f06eae5b790712cf14b3b534b8743d5cf93dd4e2a8111e24f17d2275973544608e88237d2fce06d62ad6f64649dc3e2ac3999a27b7bd0dff90aca9119a00aabb6ac8f1b6d9f43e63e1c0222d0e3b219d244551eb4e5c068b416d859f83d431066423b807ee3e2d5b80cee773a1991854c56ed703016f4febabd2159483ae1962fe5be771fa067ae8b95f4ad89f93141c7609fd8b9cf6b98c606222921eb9ecfdcdb06afa1cc2647e4d22d7411e4079904dd2fbd314f45abcf31e0707a6a85fd631b41fc3432be18c7b5b9b3b0cbb014de9b53643f6bc629ec0dcc82404247712fc62820618a6eb8d86f36893d7e199b678d2b22d8378246008402c962f9cef67db64c32d4231ec9553a7500fc410486ade3d8c506dc517b29972ae9e7528620bf4cc075902dee7ce6439d85a610d1badc39d7e4e118f22166eae2c0f492606f53e019c754df61e0069fcb13316b3bfd82e946497e97713fed435bba57a8f75b66419b32a435b24c907289bc1c6d527821ac4e4bf3eef04e9564b9328b82fd179c29cdfa6801a45a5d540900b894400c88c3790cb3260c59f878611d2881f60e00a3c0ee7ded90f971309c207caf1b8012d7872dd891e153f5cac1643bd54e51436c12607ba22d13e55c9081f2204bc07c996485dcacc41d794df509afdc0c00b4cf79d4e890dd4fdb9c19b2e1373f25b88d9fe5727afc6bc1ce57e2156e8f3c637d2cbb1826670252942df0be221d7495759ef659892bdc75f47c63cace6"}, + {"000000000000000000000000000000000000000000000000000000000000000e", "0067af1274820bfb2e16e1fca76120ea823e5e13b2229815a4cadd5a3f69a062dbaace24d646e73c6742151c1cab9a6e78db9bb8e59d497718be11c5d61c2f160b9d9ee28a907301f977efb9f9efda96e6ff75dd071421260fb945c3d2c5dcbb31f476ab4fd97ab81a1491c78dd2c76954e5a4d426edb110d1ec92bce38611dcc17d8a5435a6aaef673acb3e026215d07be0f0165884185c21819fab0e23d4051eabd209c7f11f040618ba8e4e91f3e9493fe2079d23030dacf9b415552732071db823633f53dec479315eacde8c94b7bb9928645146469b0d6fc0697324633c512e7d8d1c2c392ba9bfdf1fd687fce7a3764a45d79e22787ffb4a3c0a21448ba26ba2a1c3c5c27defd44dca084eba029b140e58ea37a88b2b50ff2a1a1162ab429d891d4c462f5ab9fc615ce14544fd34ebe0fcf8f145ad1200ca3f90d3cd9f2a90f178ee44e52a4ba2b1e6293933f303a3a54f7d586ce3a2263540a7caa5a5d1823035821ebecab9d531c019b29c5387b0e674362c4b75c06913771d4495da11d4db2bb2a001c97c3274f6b6c5f451378aab7462d0891c337a38756f092b127f1cc11503ce8ee245071052c779e17344fba8e72e8f3b1a4b2e6cfd9d104f4147aab9b397de2688f350fcbf568b0ace4c8abf45fc50eb07e87953c44bf6dd5f1775281f353bbac14adf29d3b772568f43b6b9b9b59c35d505bb02ebb455043f0b9070db025ddf02b74e9d23441eb0cc90f4cbdeab6e390a4530e99baabfaa9d84c716803e6239fa0663d47ef5ed5f338b3baf247dc78322d7cab715d3bd18c3fd7539d366ab8d691e1db73e1140ed5ddc0db729186ea24062e8fe31d2eadd2ac01fc737e476c95b6f1f7604daacb993c596c5fda7bc1740d66bd779115beceea175136a5bcdab3b5543884757247725167095ec41f7272dda8dd65e9e787ff300aeb008354a18e293f700985ef36bd19b0cbbc0444115bc05a11be26fefd2448741eb80a9291bd293c817854b84061ae038ec5ef393d37b950d5aa517f2ce2586dc265312de4974235466112ada1572962f3d821fa29e4ffe76c1b5c44084e76ec597e1e518f6ddaa245a4b25bb8bf5d10d206257f64c5844e2d6dfd1703a034424e56b78b987f594bcbd292fbef73c1db13c5d24134fbb306053b2ef07ce5256520292f47514d701a312da0c664097cbd2f1741aa7999583dc585654045d354d615b7a13ccfbb57cf95ba7ba5f219587100a602b30894cbc4ae7dd464496b3f3ea7675d59f072611d3d6af91d655fc7d2635e4771689e06098d5660293e6905316dd9ff91c103157d9879c1ef7e879fd066f011782655de589c4a119ed1197e2313cb5ea640878f0bf2564ef47ee57391d0ff83826848f5b59201ef99f409b9c98b521015682e9fef849b6701164a6031ca11109954dc9f7493266dcd8d635f7b331a7399f3427a84cb4a2bbdc0d09fae852ee167f96ddc2a430214ec29025c14f31b7c350b734959b00f03ae4013e230e5fab29d283f9af487ecc6016a6978f3c49b803fbb795646d79e7d6a4b22c7cacafcdd59d15943f0cc589f193455e5e9bfbd7ab2aec97ea7c19bbab6b0ae0c9b7fc23bc0f2e05b1f9acd991962580d728202eeca5aa104fc80be8fd886c43e1a7476c565b82b1050d75cb5147a7c65d6f12a860bf938daae6b6d13e23e717fc291b34f4e0fb58f42f6fb9030d637d89a507a871f03ea86881d6e04493d9c6c3759bb6f75481153472086f5e93e3867255f5e64c42f3488d1c50f5169767f29893576dfbf7f23767b6abe54fa48cc6cd1de60bb07e12824578a872c2a7538ee0b45f4fa36f397c0bf8bc2df303d76604e0f4ba56d3844a9eff9b4b079e97a052d146c18b67aa0945626e44793d38bf"}, + {"0000000000000000000000000000000000000000000000000000000000000039", "012f3a69fbe4852dbd5eb7ba5e6a284a651174d15e0806c99e6517e048ef61516e0774b4353c1a36693602d5be8037d079e5d425b1c61023cc3963b578da010706fce809dbd9ad849872bf65e0da167bccfea7b50ec5222cfe20b355b05751b1742c06b9e7f7afd519328aa9d494d80c2f5503a4af3d732c11db83b6e4bd47f45d303156e81ad54fd78648c889d6335c1a523b51363faeae6743d97ced65dd1ec4f0ee16e672ff6b02ebfc4336596e4cd03ba72775528919f41ad8d5cb0752e53b5e8c516cae6ef3d588cce01501464e0529569403c0da35e4cdbfe0662948b5963e036a9951d373faacb8872062b97ea8685bdb6786ef17039a0f280581ca5d84817511a54d56680957429aa8adf955aa56a1569bf06704a544c95742847e2835f7cd3a692628ea73366d9a11770ece790781d5db16cea29a988235807fe841a94e8bf8cc6405f5c454ca28b21b17350329c74c772048fb9026e5f7cd45051dd1bbde75ab0c98f11dc116683f00883a0f3d59a7d6fde0186cb623901f1fba687819e980e63f0cfb9801d2e7bd80de30e25d87605812a6cebc8474a17fe9ca41947515b106165bf6e95b322ffebb44cc944abe21f52b949b341b627f6a2d5588a9dd7492e8f3ccdf8142892f23171d4fb36aeb4935bb1eda3726ea753d7bee277fb7d961ddf71a91aa3b71f1e7e694cbc82ba9cb7b3e423a04bf0360dc32dd91f8af30ba61436071410e1df9ab0824fc93648bf223e223025a5cc724d95d166cd14b0538664e4b1950975dfa2132dc8b6e88cc1e094fac05675d166d9eaa8bc81d527bf135d32d6af4dc36410948acd47e14e8318804b29be99e49621779d557601571fc257f2622395ea152bcd361ba60eed8ae4e050bbd6a57371f8591eca6b2f46ba2ac7519d1d7eb1513d68d2f7c3305ada496e1e95b1a346b75fe1ff5180144dc03da8efcfd8b0ba48aa0504257580ebaf09b03c4dfdf29d17674cef1844249d13e05583d31260f05dfa686b484b69e87b851d77cf39761eab21bd9931a4a342da51369f5362a98f24849d4aac8e5ba4f24035ebec9c9a860c156b4d4c37ddfb23e9779d6ab273c6c5dbf15d500f944f669f45a6d7fdaa28cbaee121a8a7a06418e41eb66f2a63e10d16971a7b9f8b9b2218c4c0951758e0dcc46821e3819493a2b31b576a501ccb670d59204a950a551519792f610d5dcbbc22f193d7d9537b300fbafb3d5f2d2618e71e3fbd05d480288741be713054fe621530f722dd1f24c409566ff1ae0894bd05f4260fb29c2e176f6009122151fd4bd093f27b0ff20b6dd594c919f791c69ca5813b5f45c20b1c96dcc4be72723cec5a4d148e155c1045b4ce3177f894ba4072083c46411c41d46950ee9167ce6eb3464bf75bccfa90cdc1b5352925906aea5a29bb3070291b2d89561869db3bb01847737f14dcc21f22285419e4f61e01636cf5513850384488ecf27fbbe099b107617064e18447fdc15554b2c54ea8e96745501892a51b67c6cd95f7ddad5e8788df84eba9cd75e890f05c995cf62c46be46bee730c6ea3aac2e6d0bed9bf2408afe5ceca4e0e752264dd73e69672ad3cff6f030702067cfae0a437ca33e1499ab7131d505dec46741553b0cd3fc9ac365c5f6802db4f8862f5f4797282030d565bc66ca0a790c363ad9d6b47816e780e32d317aa82ee1e530c730e3bc59cc274dc7199476ccff72a8efb574fe5ea6bf9bcf46d17d529eb3988dc72934d721b7de7e05765cfe787242fd0e80746551f6c640ee6dc640d4d14da99f5a6ec655b004e60c69b7744303d04b7d8e3ea5bf4526872964d635304379a0e7d221f7b7721fddd45f92af259cab3a81287a2dc0530287d22b30492b2bb1d354481b2323c4ed5dfbbf0b5"}, + {"0000000000000000000000000000000000000000000000000000000000000005", "00315eb8fc4d578682ddf164933903e8ddba1ca90322f7a5d326700311f9dc82d0acd6b214c8d6ebdc6807f40d5b4943e079dea1739d4aabf5e6cd061727da14c0dfcda695819b360111fb9d6649926fc653d7ee1e1e1c6522deb1ed48e6f46f127e7081ce2a328291292b9d3162afb53180ca2706676972ce4439fcf0ac2634c9a337ad5395e1c9f3e1832edb5535b893ad98334e2fb747ce0e439187a77b674c0f4bb95cfdf1b400390cba29d24092bad472149569b0888547bfb7593e2506eeba9397d8babd07fa834c99fba158ffe4220307dc03d0c6e02bcd2b324cf11981128165f61a9d0b137a2edf698e1f6f84b2a8823baa6ece225b9f2d0188ad9873957daaea3101b883c812c999b7d9fd5c2316155a939fed619c25f32702bf29f5cf103e069635ec139b6ab83ecffb0d93d4f4a6fb6f1eb9df5e62588acff2a3b158fd9a7a477a6cfc63663c8ef70cda017eee67e9434db76ae712ca26a08a69217c09540d6f485c7fafa2da0fc7d317567fdb53e62667fd02561714299d93deef21413ef58e2a376a39ba94b0765b352dc1d46bda765d6bead72426ea0eb3c482ff716615a23186f6ccd37f798961c70f5bd741c715bd6ffb24a0c60a291f2491db12a7085653f836d791ff9c572261a51f68583068de670647be384a01927d5a555236d07eec65537659b17eb4518bca4f6220aff84eca06956084a1499bc94b6d31978772fcca4c663b844d254ed3bae09b900dd61e95d12d5eee366c3b5b237a0d6e40a7c115ed8beccde270bfad2ee5a61079b36937994f5288235b2d2b01062eec454769b92dbffc4f12cda572da6f4f0fd9c182f49ebecfb284503a46a726d67c340a6bc5298e2435b2a7f1b0e6033e7df2c118081b45b5cd517706c3f1e83a7066b54b003b5a1c23a6df4ef1a0aa55d3eb826b1e2dd6a2ea8ef964e800fbfecf1ed41fb585ebf97041ed193a9f5e5f55e81593c77563df944f42ae427466739df93fc4ae1a9d1458978461a4220d39d0b2d11d2d7bed2b359a2adc1514c5cf4c559135265473030c4db84f3322bb066f05b2a04d2a10ac0183a634739d420cc54acaf6cf4c0872dd96258307c4b32592e50fa8184a2626d19b0a0b02447d55d9797fe7f6825ef7dfd05938081022582eb33eb77c270241b97a157f1af8db01b7d358687f0229128be307ab1dc21493f4c27817795f71f18f643cc75e7d5451efb96b9a264906c7210337195a226110b078b8a1c7d4885fd35a0f3a7a44f2eaed3eebd434a2dffb1d11e43d2a9d779b106093a62ad8b5043706d8c08b3c4d5c21c37c32b5c6c7bb7cb075d9452c2ad23feeebd5bf1d3a8db6b8a46a9175f95658dde11b5d7d6d8c14a09f097be7bb54f8102b21a25924ee8982bd9044b7773fd18bb89e39775952b8b239e26001216a4333b1389de3cce0eef196175e1783d1c327125ec521510af88d21ed015ee8509a4dfd7d50e0601de3b1fbe1c797bb4ae162ad1ccc0f8ea1d9fcca9e2c1cd641554c7f417929175036498a1f712afbfb44053768d6dfea7367eb267400c0ebf58d121196ffe4272e0b0ce78d4201488ed6c962e1a8f667c2f76655056511b13a55a6bf63433119e57e6e61f60b9a43bd0d7cdc4ffc4cb8f59e6da62abc423d46c2457fc40f0156efd3cbc7d68ff5da24aafa49b709cbf3198d894483f22c041998015dc26797d0d0b0fa1828f88918066f0c581508e50d8b9c71d8332f061ce6037ea1e52950ae8212a563f9bbb148869a7a3f1287a958f4a209be299d475f9de3b1811784c7cf7b6ed7e33cc2d90c7dff20fa8d9a70da2089666b50667370bddec0d726897e1b99dc54f0f0fe2a84b1faccaeb40c1d6481380235f33f97bf21c3975556546f73c1f17e74476a"}, + {"0000000000000000000000000000000000000000000000000000000000000009", "007636b7d700cf6c94c7e31e417aef2d13444ccfb5012d9514e00a02dadec5c10ef2464f50adadaeffbf02c5b1621befff41b3eff8c38dee732ed868f958bd1e60366da214b0a3ce14b287a6f772c2c644b9b71406e74f2e43435c79f25fd145820f861ced6d93d74b1007e51c85458d8b3a23a170ab1c13512da397fb320bf9ee07fc243d37e30f26b0e4e79722a4509fe2bb18c586e495c8fdb9756fc1faa8c1de16a6dcf99a020a426cf96449f67fa265a1fa2b7bd8f559d5d7f29e307cf58129672001a3caf711123e07c65eb17d63e01410742cd29b807ee3b0458370b9945e82d27d70f019c3c580b0ee1ae79231a4755ad1e0b581ac33142d0d5204876de25717eb8401e545ed00ccace65cdb2a6dae05dc10a1cdf1142b075e36501d3fae3fbfe9b20e43992e0ed01789f998748f0db7336ebe705e23292a42ee01aad64a4f285b9ca21cf2e83f30e179bc1802ab3ad655bd0d2feba902831ddf3c451f4fbec28c1759b79a7ed6dd4ec8d9b638f0d11911e8049cbe841094e20a1595660f2d3a814f48226b0ebd4f7a8bc2406955574fa1a0d78428a9877cd10d82717a7beb0d05e4d3180f975f4bde54813ae42864a56c8f9632520a4452f91c5e80a7674e92352b2f0b4572d67c23841a8a9a35e5a28faf50f242d4d8bc4c85ef0856d2049b5f0d21aef8b31befcf49ddfc7e1836bf14bdfb500d21e9b88090fe0738cd51e8c1e46aec8f5706b24c196693a1e220f4cf27b3b4f648714796b1c0b66faf4ef3764fa913ffeebd4856f1f4716f4e9cac598f2460a86311ca633d197c56573c2a3d9873056cb8afe42a1cfd7772f108e5f46962d9b872a310cf7c9669d32e19ddb88c5a897de73bb8042d5990aa74667726c337b1f9d8a2b0a7f9ae2f983d405535567b68b9524c427b1ecf61148c52ad1a24c9c53484a240321a655a00c4adcffcd19edb6d470616804932c7d46f5ec0b41e6f4473d0626c87c360d284f6e19ed4b73ebbe7030a9a44c4d7dbfbd7fc6c2267a72f2b3997ff5f965f1636df70e550dca9f602625b9e9c5f50aa557e7b4c015acf3c6501b3a3fe33a2d964695e552a1c39781409a52b184bea227bb9c4c1431a784b14c530565339082a96edf349a5133513c514c867400dd46a71937209ca9cdd704d7315432ff55157b808031d3cbc717203a0045d07cd1d91f9d1a2f3914d00f6309cd8394a0b4ac3b1fa8e7052f8207221a1f6c2d0cacadb6f741263676e1a06ef96caa1d2ce7c51c4f5aeb1d4e78835f6c59eaa9ade353e14056a6733db224476956caa0cb44401d7c47a1062682b32ba5f8af75e12db2a091da681b6f9a4b7797e20d29cb1f4e43167ccfe21e61868251adce8cea7db96e2a9ec28a7a4beefc74d6232096f93ef60a39d1e5723f512d0edd6ad233c11a0030766fdd0e14079d65201ae922bb1e4d8d116a2458d12f73288b2068baf792b8ed9f5adcf214a9be69b152308aca00f0c5d2555a4b27e48aab1b09d3118db3be2cc322c5d1a630e3f742b6edff4fd91def6798111f4c322d395d12dbbbf7854b7f2d1ce17e83498321534e503b89bd009c5ccb89b865ec91b5b913c040a3a0afb5788f603e1fe95469b1adea2d9e4529e1eba561d4424be7cc3f5f14cf89ca24e97bf56dbdda8e503e23e217e5869a58b78e9190a7eceafac2f5ddf910fcc8ca9cfce3bdf35f3c5e8785ebece6fddf4401c197f092b8c1688d734b5641451fac9e9d50df441172fcb5ed111d561c3387826aaa6bb84f1f43cdbebb7071ef3c4cad2d9b9c68985b712e45ab99879f199681001b594eb875b5be6d42662aa72def9cc973d40e70999f0e694d39b5b94eec596e1d2169b15177b6c7b0cf091e32de60059b1dad6a613d87689deb45f5704"}, + {"0000000000000000000000000000000000000000000000000000000000000020", "0048c6dacd48a4d9091658d30050325257e636f68003a573707c08ff046193a08a75d2fceda084f4a8830ee75c5bc3dc738d3d4ad175d90e2309a94e7748853ab4fca24ee3b047ba85a4b0782ebb71bc19f3827903c469f670101c8b084a105d04949d9a17a91286dd26841134d0e570a762ce32e5fbc4a636556dd43b102060aa00358c84996579746863d8de8bc7ca1ef1592dbd54e09b60335bc018740e89b36519f3f01dba4c063781f8f08a040d970da2128036ef11645b7343631be849cb6a28ef7b7e15d2343ef814a6b3f65b4bee1f7ce2de1ad82c62fd3f32fc11ac19ef14083e8ebc34958d26a23894c1e91939699e6f6c7eeb94f98ce5130c56b50c8f7119f17ad33e44bebf662c5f742fd72dbc7531214f28e5ae02a413afa4f3c190b97e52fe1f65f29738ea0fef8baa7586c2ea538198993c6cb43fd947f2429a61c3fa3fb7f20a60d4a2c9c7dd503202a972101d22294159b8c20e486d727a9e50bb401e0ae7bcd1a50846b09399817760befd91556fb971780c3a3a2ae7844660fc3c351a7644efde236d9cc6c30f21590cc10f9767a90183489f20d5ae34fafafc1f0541e4645b093ac9893dd061989cdc0e388993e1ff2de60387c324da8d9f2dd53c0062904e28bf92069e0920bad3bc928576c85aeab861e8ba7720cb99a10b456faea4135f677d1e61984a2affac0704e898403203d38ba5c0d10c1d1b8a03dafcd2cb4562da7a7f3c42e47ed5499699b13465c51c16b3ed7759d7dbe52413dd5160c0237b058b2061d1144fb96228d377faa91b2acf70cb5b1ddb4c68244cbf3e47be66677e79920a8a8719df35a3d7fadbb14398905d8c56c7d3b41260406572a8db08596a7b2794843eab71fdb21d485226eb2b213d17b75151ba6456eefa0989f67c99941d2eb18feec1f3c0b3d84fd4b78fcb86c1f536d4f207017e1a87f5f0c795a70293d42aad0dae13dc39947c12f49fd19ce045510358e6fa96d8f0d38c52bf324b01b51bba9c13e93f158f51c375ed57d146de2ec9f82df9fd7c4018931994be34b622eca4093533104f05045d154dc16be633729741a9c2bda0c5b3b372451a07cbe901f21838c6da14f1c88b5d04894959341f622cd253691b13ff457367c5a641bb363680e2d4a26940bd3214205a240b5f1094afe0f7d1ee23b8de70dd01d47b495c5259f18f47a8d1f46677bb33699a9d570c79a52076d20535b78b62cd00d1341337517ecfdc0b31870d0f8f080cc8a6839c4a305e85960ad0605c75763cbba12ca20de78fe814a8c495eafcc73c1c631171b3128b10ce5897dca1992a76cdb767eb7c718c16ff9c738ba9de77f86eb2593861e7255062730162172581795d8606f392fb127975a34c54babff21f774ee18aeb60a503e943301a3595e66b6e951dfb6bf0051d7cf5df66cc2d3c2a20cbedbe99c915e9790def60d6bc232de181bdda7b4766cfe9859ac8cc5728743447935479173b7f311154f4f13391e99d136d4cac53af5df0a0d50faeebfcd59228609a717aed6e5084167c2d5101d1a5414263da16ee6a9f4343f8da599c28775a70f40dace09b3cc523c866d85f83151d25bc2b6b9e135a6ac4a9fb18a34cbbfbe551f93cde4ceb30270ca676710b199f38e565ceb3f39affafdbedf6055cda63f1213f237a0757a9bdfbee861c6f56ea4b0c87546c0363109d7d7254369be4bf992ac02c19fd151107555a74e219b066236a58ca47d9cb13f9f3171b6c452fce518a05d1d2a371fffef2669aa21ce0b110cfad72764a13c4d78891f983d76b04c9c2ebdaa24bd2c2d71fa51bdf98a2f932dd56f8db62147d1d3f27312d9330f1ff25d9aa8632e4c72d2a3867b7232232a33d5ac45be18102756706446302ddee16791717"}, + {"000000000000000000000000000000000000000000000000000000000000001e", "00300031f011ff93ca7dd320f7c4aac5aa695186612c84a6bbe2a3a09557eaf59cde41841672d8fce0f0081d091bc5e9150bbcdd63ceae7c7b2a5828bb34072543866e4313e4ff4a1fb551574d401b030519157103d40974ed67696fa5bfb67e00fc7e15dcbe9eb41428ad2e80a5a1ed3f97ce93b8a3593dd95614d4a3e715de2dca770aee7e64ea9315d72c14e0ec924af9084e3cfad35f59d28f58e4971daf39d19e06943e08db018ea7681a18ef25c13c1284fda08f9e88fa1485820bfb5f0eac973d9ec050f29a57175a1654d6fcaeeb172f67a993887ec1f79653a8baab2bcad739b6f5652c15c4426e141138bca656c0baffeaddd00c9a0329042101432e1690f6e378313a6d922ea15a05afaa0b20ad295c3f33ec91a08483fc2fb10972376ebdaad705c574499b1384a940bc11709bf32993c7661fa36b09544336efd1db17603812415f6c6755b4cc754ad103c97186b533e459d6d8a26ccd7533c3554adce1a71805adf7d8bd09f1efae23057b5d4d3d84065049b3088e6db401cc4731e309b587f4723eb70058f950b51c10a6b69c521a5f162564b20339d2da84945bb08f12b07a62ff4a7653f677a38f0a58cd82811bf61d3d72fc052bc56b6a5f6d6a091feb6f56a65d14f6bfa324afc756c918417ac3eff47dd73c00a97b080e70ae513fadeb44a6572d8c12ca252ae0eb92ef01da8b7404860921980ae093820281a33dceabb91131d066851c56c62057716a0bb8f4f3fd55549a09e56d92d94807003f83676accf556e423252ff3a3c9458db9824f096a3b194c83320c61b860a65948ca1c9a9bc8ba310ab74a8865887c579808145d11584acd95689bd62720c69a1111d413ab6302325b6d1e66ad46e97de6d518c9e6baf8689dd9fc5232cf1cc63bc507a6350a7b28288fc177d7a80b0a63c68cd1df9a631d64da6917028743f628e1abfd3f84d2ad40f3ad912cc2ade127110904d17f19f6f5861bd3f836dbb0a50d9f10349806fa8c6666f464d9ad5aa367442ad0e51be5197af32d9f472b0d674093473e23d84b4858e6adc8973f5f21167f4085d02b84d4ecb3a479e9a43de9ea3c9aa321bdd533cd5fd0bbba2912cef534a0ee3ee6d20f372e9072a6e5a0bc2599313900e34a79ee95669e9d2e66164e1ab79e25ab1968d6cbbdbf5b56137d1675cc03393ac7f7489686b30a834378c2e54d879e59ec251e539ebed55cd1d55eea28f5485418e240aa5728720fdf19af79d01607bfd3668c003893b3172adf214f139b70cf5a094b14bbf0c1a847189dc4ef8d89baaf1178cedf29512ed0a69cc319301b1c56fe0b5daf521d798fc908cbfae19017f4be3eaf2f76cc3dbd653529a64df493cb0c55241502d8cb57489cfd7ae8738248dd0dd613e92233ab4504aacee0e63271fede7a4b0320d245159cdf795a9d736e4153ac01b578559331033dc56252f242e1f791a69f9c55cd7e2a4e718f7212cd57c098a8f929daeb82eaff54634936fa1009f82bfc7f75048fe7b3c792a38f90540555ba12f633c310703b955c5921711e0c54dc5dff0319a5d7f8db931cd867d471257e7bce94344bdb5e779595d4ed42f316974248298c9410bdeb38090d7e67a2931f59a1d92968115aefa041b1c6fb050bb5bf3bd5be555ecbb307c0276f97d8e349ba0cd559d86f02bd92106f592e26c643da125b09b56b79f672117e4a05b942304f970b05db9e17561328cd9f9204dcc76b58bbe26967b7251787b38b1272a993be33f8294bf30586185d95e90bc80a12c94ffb67330ec986a5532d8e680d5d0499265dbace7e1282cf5ab785f1e3b3cdde8df95e6c6f142ec6a0034fda19b67f029ad259375d6187ece3132bf754e603e58f59736c842f6423eca9160c3713ad"}, + {"0000000000000000000000000000000000000000000000000000000000000008", "009a41ce877363d1ee5860fa19102756c11b5f196013bad670a9eb746bf29b344ce7fff419621578a5451dc5c94ba25c01ef1ae46578a0d1796999538e97163e9867213ea0737f8f6c19f6a97803db632c1b842e0166b525d0d7b8a53cf4103c10241afb23d0fd6ebb903a57ed0eb76757f74d19fb9dec8dbabca25b3cbb08ad89dcd7578381af0bf257a91e8dc0fa086c166a2a2b74e8c1fae651e2324567acd5281643699b77da00b65ebff019c4114ba47485c56642b21cf2d49e7e1d7f5641d85e268540fd653f6144c16d881fdd62de0427b751be0e7d70c4f9928381183bde8e729ee331131b87503ae99e99d0c7f1da03e0e3a21e0b741c0704327247cf9292a76062909ca71c92489f59fc48df20273bc6188e691999a2c49c96e3f61dbf866e457408d6d85aea628a2d2efac549dd64925e8f43fd60216d6f067c60fce977fa5c06e7e5ea54bdd13072aec200f493b60dd753ef1fa61401b0fd60337b47fd9a19059bdf531485c7da59ce91a42fddf169224c2fb6310192e5a81ec76e8fff2091f4c0ef42b9a37a921a2e2db1841d32d82e0b06ce458d2f44bb9a47ae34f2be04427895b4c76da145f766d6a458f46706cd3faf4c35a31487184dcf736216538f0476bc29342c6c4ab90ac60b9314231241b630d3c3be3c6bdde93c993aaf2cbcdd117691fa9495dc64a2093f4116e5315d17fe063bc65787de0fb7822f7242a45b35963d865cb7b70e3b74df7d1fb6c7b1da9423d0a96ee3092fd8639b0725d31f11c4960f502c9617b0fe4c61bd093ed4fa232ce26a89e0490fda79040965726b42455772d1df0a3664c1db346dc3d60403eed047325dd70f324390165b4680be05fa23eab23563c43c456196ad109dee0eb7c9e5e550b4f7dcf1b26676c24184f69437efe96188ecb6d1a7e145edf657f916578e0eeffed9a03c01549bcc6c4d66e58b1c1039d78dad56b25e1c529602b5fe514a5a3ab1d4a835313cb6072a2e10b2c3680905c523d8573035255e9223564d0ddcf1dfdb5e071f89d27b2a8d626cbb0674437766eee9924daca532031220a2aecb3ba38d21e83950f77cf659b0dd794c222572eec38c6db5716d14f66ab4b04d7f22bf5cd605566be496830e7eac9331d33eee6c0d24c06d6c7315247673b055699cfb17a37951f23752c59a7e03fc01ad904a5d026fa5fba1d5c8dc505ed5e85ddd1e72403a8e3815e17e6b77d4757fb1b109f20bcdfdc98023bb6d00edecbefbb3b13341c9b464829a8474f1712ba1c5067d9e0643412222f251b994d528d5d2c755150c59087115928927c9324df8d16ddcde404fc7ff269ac7c2c6951986d27e83910ef26bf53597ba1c771f370b7cc65679e79ccdba86a2f701beef2b9b5ef12c490549361e44e1aa808304209eb49b50135b2a380211549cc346d434bd4693304b307749c3c216a130039d01a63d5314a7cee6803d1c90cff04ec71d00410ccc5584608f5488b393334961426969ec64df51b42391ae7c7673d517fb271983f272712a64d35c3e7805b23b1d4d54f4e5a2c4443f7bbec389bf55d77990116516af405cf5672cc2b236185858ad4f2b2eebe81661ae0b8d4dd3b36e3633b36f1da3a15f8cd7e3914df16cea6af9b567cf3e59e4eaf7998b43dc5d9a6203516cecd1d85a83e520f20c81c50aac9d437509fe0742296d0fe37d51ef0ca12c804ec522fdf4b896330d1b4448b303a2cf229b311503b796154aeb3b36f10de522113b0bf8b8935d63c097bc4c514f26eabd9506873508b38aa3fbee462457c3db94671a8b1b132b2752ab64615178049043e27a9d7992a57090ddc8ec0f4f44ab7e1165dd7827680d41583696f5259ab34a154374742a157bc5a74983e9f5a87b7d2dca0fa2fd"}, + {"0000000000000000000000000000000000000000000000000000000000000028", "0028ba8566cb549b6729ca31366c4e57ba4f5fc0c21b57a1b9aea04acf8f06a2b9cb1dcf8a2fbaff1f8113822bb582922595a891ca07e9fd0b47b93c1fd8b54894e5234e74db73a88ab67ed5e815034cb17dcf7c059fc192e4522097420c39f5ccea3f6aa56adda3f408516b43650f6e44a5fc839972b29225cfaa9f26e01ca87585cd9c0b80f601b463d0aeb1a310fc1986553820875eee1dc0dbd668542c5b34b7a62f9cf98727016c949faa1fbe29e739f785cecc811b09191dbbfa0dd4636ca74534bfc7ba46a154f43fe6e4bbda100303fb5614d5337099c2f8f39996e54cb1e9b8b0b5414bb532c075a334ada46dc72d06f961e2e2c297bdd30f822b2b1554b3fcd55bf18f182b01427e179638691cb60fd2ffebc5a3806d74dd8ffadfa180bdf8dfde358b5ba197e1b04b460644202f57df152cd4f29a036e6cf56841a43887624a6ccfc9e9c3374f04fddfd6007ec81ff216eb4f382d61d97c26a8888d9896ed8a45240f27a3e475a39234169ede4c894f0be7ded8a70093045062847e03bb167037c2952a425e113530643cb8d2bd2074ca61bdd6a47a9abd6c917ed90c2bde0e930ec53a15b2099e304101a6c2b64058cbd750be146989819fa7d4d3472536ecc04fed49bd21d9d4b118c75cde96d4ea5d3f3bd326a63620096bdc53305623437c2ca88c933481ebc64c0677f0af7afabdd6ab01711574dd67d369ddb531215dbe7194f0e29123023e5923b5ff597553f213249655654301a2a12ee3fa0b58f7ce668de8d3150340c9503e77f988ff9792f627889ea7d69fe7abb38f82a19f6a6ac1876c32b9380c205f16fb13809ac8a4d1afad5806a57d13792f3515e8996da36896a15937546a074f02829265963cdd1e30269306cda0f886a5c2686f6c4424cd4856a1281ea79d9e60b165e5949c42c31d2218199936f12f73011e46133f40b3b703b76210b8641d593c6cebbea31d3bf1a77130a841c162657386b3622960a25a02780bd9c9b12c389707c88d64cdf8e6cb222181b5403f17db4a78568eea5dd50e3409b12753817dcbcd8cde06aa2712f9cf813711e9418cc09dbc00d19893bbc008b0bbb2bfd01c070d35a58d524ecd5ec4d198a13609de852ab353023b768183e100b74585204230eb4742142b7db65ca69722ef9534be386795615d5ea2c2029d7a5902cccce78d16f097272052683ce85fd6f22108fd4015db5a9b293ad25b06c10200e4c5be233b05b6a11b29f1b55ba9fa633576c061260da81bdd2105d297c72f2d4c91a48945ba206270c3845b5cd76518208a4ecae4744bd5f45283194900351e5a8ba735418f3dfb9fad92dfde64d5c22eef5d897a00185f671d92c1e0cf6d369dadb676495ae5bf5368ed3bc250232137c3884b304a7104f426c9e68565e906f20d9209b67eff681971d9b89151e59e335cd1600810cb3f179c3f2f6a208ad71a9f94d74cd6b4c94d39b465b30d53662ee1d04d8b7cf87291881c0466244979112f1971cedd2e86d25b8441626623b2b9c94ef6ddab720f62111d110edb8b22b9b1905aac911ba3c41f3c3b17e97f0f791e72e5a769e4a12f79ab5187c63e9f2b11d9c3772657165f49a0f24b867998812d085734762fcf0e654ed2e0e0b4bb245dc838fe16e177beb91a0bbc8b92d3ccb79c850251c02277767879f0daa3b72d90723cc590893adb9cb4bce6bc692569682bce622170120d03490ab5991ea375917305023029d8d0f24aa13c83343091f996ac54ceed79f08ee7a5f9fccd128f0f8c6d77976fdd388172fcdc4bdcd30eac49b514230fe28613a4abb139e521bfe9094eabad3e0b8c1d2ab515360caae7c29573c9c0310096846999714f4e523e9acdafb1cda334088dbc6a6262c52af7e471"}, + {"0000000000000000000000000000000000000000000000000000000000000000", "005e10e25ade6dbb9f4a30b487a53178fc6ad3efc50ee83d9b18885575e3ca08a76fd1688251a41a89db13ba975fc245f79b735a47e4f6ee7a667f077ed01356dd935cafb0dc59a47ba6220dd8e16314b21de9f70a70b933d285f510f16572d5973480d8e1e17ba27528bc450faa0babf4d54dc67c87cd6dbf5bc1dbaeb22012174efd65bd83dca2058214d80c89b3b91816f22ea9ea866852a8d6e5da2c597071bef370857d3d2500d26cd1be85c1e1131123c9c4dc89d6bdf95c8f2a32ffdd691a8eeffb56b164b1e14e9e89524f14dbde055bee5da08ee4415b5f04806cee677936c02d61a52a4454218e1add637c2ac329c6c475f90c6a6ffeb703c9553e6d475399f325a21735e6272556c898ddb413bd660f3250540d873b63be28dca85288581513db0b492f213945009fcdb61470e5f1f80595cc72c05924671468fb9b84f5d24cd4c4dfbd456a036a590cf102a90bcf202786bd9c30306d3a16179ddeddf126c42d353c774c2f53d587b8392c0b701fc71c98bfa3ea03387e75fbf02bf9b11e13cce27f33c7c436df092224812db4ce0cad13e2e8631c44b4b202b4607691c00df8f677a55e269b88c765520cfa148954bdb31c88109efb58c3d24b7336a415a7b8398675de8178017113375e3a5ab0f7cbfd5386d09dbf5f7dd3ffdf98481555cb3b939eb80b72a8f25cb37b5ab6220959f15102d86b551d41c8e7ebe6c15cbf2538169fcbdb38a8075e054618a9ae238ca5209bc64464b20fc4f6c8701524832894dc742fdab2838e276164a29b71764fbe445bf7ffe5ab3ef3ec77c7922cd6cdb22cc9f7a4610a782ad2b884d69ef9dd661d6f7a54bd8e800d55ad0d2bac272ae02489039ce29d00d852761586f23dae30d17c44fea793696d8fc4d969a9f485639bdfcb2d3dea7bc0d41481f556b8268f6ef2d785c671f0315300d9b52fc41df40b3412601268e553fd113629672d05b8d2b8c191f40cd4bab0f2f2f0e3d6a8b9d5872c12ca16849d5731a6cd097422163f40c92966ab29dd1358fb2bb8e555bde2dfb16c2eb4a5cee3281cc21509db52720f2f6a95fbb982c136a37ab1fd449356dc1eba6e18f434d529d68cf3549eebea629320b50f242fed338760913e2acf1c37252a7bc8c6a8903d31f134fb8a10ffe3cd77e8a6f3fc9f4793f5e3a439cd86063fc56e999d902d225e33bfd577cf5ef232de9916096379b0c2505ce0e129f09d6b512bc8b5bc7ff9d40c6e0f00f84766072159d59a5d3424ad846f79eb0a14087bf5dc54723ae7a5718f49c20df6baa296f0c312d92648d78805ed5f7e52b7bff3f0d7a767defcba21b65b5eeed6e321a320b98c1bea1ab26d111d9ee024d3d132899950f11f9d54d0a42a84b21db678c19c27ba84f8e259f31ce1a794689873c98dac7c6d716301e9e69ec5cec3293f9912e7017a33f0ca6d2a0d7a0e51fe159fcbeaaef1042110a2ea09812dca9f579d18046c36611390e5316f64a622eb72efc9db3fbb413fda829caa558a91b0f2472ba8bd7e66fdd6788bf10389cda3185bdfdb2bee717c4d9393053519fa476f2f5aac52f034e34fdcec84462c3e51a67af39580c511b29ad2b718bb8b00d2e48b5c3739f5501675b2311f9daaa2ff53f0cfad70b31c81f49e8daafd92f11502aba187d21f641f06d7355286543aae01ef156ffc111f630a88a3924b45c1d595273892663ce79e477c165746b511c744defc4e6319097af15d56d397700b37f85f627e55a196ebbd743474bedf86365457966002d45e9374ca10a67827a381dab09dada93c7743ab1569eb6bd71e27018d44f529d535f49be59fbf520808a835ac471344dd5ef919d96e5804cb6effdd7ef244214eacb89503830a4846b9f455e0b9caf55f1281"}, + {"0000000000000000000000000000000000000000000000000000000000000025", "0013d902acc168f4772161f59bc274ddde6637cc660929fd408d183bc3da498864e072507f1cbfbbf9750e95cffe1c5ac0dce7cf512f964e5a31b90c8f18631a62aefd22dd34a9c82564efd24020f1b02ebea60a1820266102912491304fa22f0a67dcde78bb5583512fe99c6cce6c0779796313dc4c663d3d402f95b3e8413cdab98ad7c4158bfec465783d7f31af2bb143af415c7e13a2d0c332f63955ad11e6616b93385d763f00660c8816af28d5bc0613faacc54bd33b3aba3129080ffb112c463a25d2c590c6c4e8f5e1d2fe3c0e0e08ce6bdedb250faf39a79418e3bbf73bc2081e579a52ee45823263d2cd55aefab4e156202eef22d7bc320843678d0b0eacc2fd5790a7ca25877c4e9fba592b09362bff07e5b6b5b258e3d054ac0031166c6a7ba40c19e24e08cf2f53d1eb469cf6564072e1c35d1fb71165ac2fa404a80f9ebd31a1455512acb403cf8dba0182239a24e79f87f4c8f19bf50dd2f2ee5c3d299a11f610b2f8e84021986ae172cb32fce67d90bb559a06643a5be82b4c25a799e797acedacadf07651c54112f25a5ab62e244ff33f556091dad5866f87540a7213455c5bacc7ca26c73d78f2e4d4427295d216ebd4344c05dd1f510e1fb17df5b5da507dd676a334a8c11cf02533360e01a519fa05a6f33a644e849d17e49a29c52b414b5e9b34f63723461d3e4a02e0811f67c706bf78e0f8cb8d0fb06f61809cdf706534287343cd0c9ed326fe98f1def93e2352b2ff19dda7abf29eb318dc36e5d45a6d9cf3e352c0b9965b28dc424ae32a40cefaa1ccdf1f95a90dd425c2e7ac2670931afb1308d3e4eb861754492dbfd554cb470d5e9ac5b9fabd0d18164ab45980037e64d15d03552224bb330be845139b4f49491becef03b9415388986d6893ae88b0e616a60f5a5da2a2e7c10276586d6199de9a521dddf700ba683addd758b312c2509d4ba13bd46581239d8a30ee11b271a64711c80ef97802ea946a693f16c3060ccb85270de6f043495f98d397df04163b095b830f2632d7cbb8d0d3fff4c39d46dcfe58d358e25f3bb4132b26d88a06c1b3e3d7a32550301d1390663f6c1823cd3d6735ceeb6ad9fff2dda1f35c011306508dc918fb6f7466e81e577610646f1b70eeb649d95f4cf52d99023dc0a73daf50f927b41860bf4e0335b6c776082c7b66bb091c7d37c718a277c60b667c61f6cf1423af2990c2d840bda5ace5448f5a93e97c19ff4fa2169e8f5e19c609384f47492554f10552cce5d78b9f3ea964e1e2591855ee1c252337d2fd4200339833c20c1e03bf1e852a2d1691c7cebc56ae0ed27d59591a1a824365dddf6f27fa76b22d6d15945d79581631a322e69c3ac4d80b80f624c262e9fdcfc4a1675832335cd2673a51a091c12e63691ee675517a574999abd6024e80a5d8024b328fc094e09956d629c6ad3eb9ea052c25b7ed4bd3047734426f954089a1145b38000b0f978e5d2d5ddf5ba28881460d4ef34cf7ccbc2c143941023e6d703263aa9395ee015e4c7dedb6f64d5a100239c6850ae62396b04504a9c82ca7144b796d891231ca1fbd4527fb6b93d48c8ff8bf0f1f869ebf6d115a5a192353fabacac0e3b01fcecf3f34c71fb8435527feb3171d5907775f05c2a3b1d6a2f8ef3893250d372abe33879bbc60c633fb443256d15bf38fc23220e687de154b51cfc161a21e0fe310c6a6d7bed1b20fd778c08b5436a7d538228a8bb1b07e792e94fb4d1ffe1fe8cfd3b90b82311473b4afdecd97e8fbbd230d71e9d8ce10303cddf461677fcde6456e2dbcf26d715c65f372e36d5997818a6661fff2baeb1bd949240de6d3dede0f661accdf84347a5b9541f2f3cfde8c48f56afea71665b6d5f284e4d46f5f6dbdfb77b1d3"}, + {"0000000000000000000000000000000000000000000000000000000000000029", "0068a20b33963dffe13d80a07426f85a5d17d7a4496bec63ea6f9ed6e7c97af76673f3f96b0c945f316e0d04b6e7d10c3c8cf1c406889fd3d7c5ba80d2833a2466bb8123d34ec98aa984f1405e35c5d9a67072fc0c216a4900d71f7fb676219a3dd75c7a95b6dc8c0619b66435790f52a5015a45810db8062d6167592aa70e17ef1cdf94d94b16740b7e627f7a9b10faff45781a9ced61145a6a0be486028ae67ca80ae10d57be61022467c6b294dcc16d5bc6fb94f2b11298ab57a25d236bd146b772d051d2c87488bedabd85a176b23b330b8016e1d5c9755fc6c00464307968c65ef8db40f029b9caffa4684b09bbbbf787e077f8bae7bd17a3f90f713cbd4bc432319484e45ea240986e5ad4dfbe51112decfbbad4f08cf3be954db87debf69a741bcfd912d9a420b5a0717bf92001755fa90c74743bf89ca21c03b7a23a5189efd7f839655bce8ec34f3bdf144702fa91b160d03eb53601b09d8b183d3936b08bf6c526388e8de6dda4011f2bc49fa2ee2c5e00affeffa30d9b9d3af49382593e2a221ded929b956914f30c491b94d18c32198da95716829159f7259a004f9e51890cd1b37cc74c5e9523fff33d4a344ac5c4f4df5f1e20568c82a818d953688df2698ac3c130d97c6be66a12fcf12f44133e436a04d13accebd314c2e3fb7d2c2531079d60eee28ff512360b0e6332c2c9a15acb4603afba102f5a96dff90335080d5702765e76ddfb7e0c936ba1b65e38b8f89a814170d7e3ed2a79ccbf2f0777f3de461a6cebe9c79477b2e1945de1e0fae9dd197a0515c89cbbe2fb6623b0fe2e30cec7427b595a061911fd8c291227b37b734b4e2e7915d451dfcfcd06a2d5f0a6d865ad634480f0415916e0caf1ac96580703f52dd58dbdf92e0144e1f15d4bba0670748cde2cf0b1d96a969f13ed0cd419ab3ba59dc0f2722ace03c66b9fb5ab7a0dd79c049eaa475e8d6d5d5374a352153e01e2a0cd0b65eb86c20abdd48aa4863cb2430a2db95bcbfd4c21f35941732a7803da2022be79f02e934f7ddbdeb153e75105c1eed8abca7cdb366c48126b692fe896f95369efc2a5cb7db161090c3e18a42e10a3f1f8501071d27e374f5ac2e6864dac184cf712f171251b2547175206e40270fa6ffd89509b39571bab0c9d1e61507f2b5422937469c4f6ba2bbf890206a021e8ef56874978b664c45c4b117df9b9ba042e271d89c07bccaf392f8826210a39c39191b191b2b60c295c29510511b0c5ff43446bf6f249618d9db7d23f29a3bdfe9b8809a76e25b6ce71473d7604b5f6490c7d5a5b01cc4e5b717f7143b7ac28060e4a55dadd0e0d2964961e5f1d5435a49b733b332da38657b9172209eed5968c2c3d5bc75794ef67f09752ac3ac10262b7abc2de18df4f5c94da8fbdf4dc86e97339306703f2a320be07c59d5aa5720afdef29748d4cbfaed71215be30228e0cc2c47347faf946626e85f1d548c6286c24e193948d1562fb22f731ffedd4ecadaab0b43de68c000b5c438b476ba61026336d66d68a96d685041729ca1a81f1fff140417374c48e7328b9fc8391126cae4d4f8c9131ce1c024dd420fd1d178790aa150461c7ea8c889f579c4263d5e634bf81ebae373abc10641b05d16c7175a43e4120bff13da579f1ccd1b60440af7d0304323ddea3c55f81bcfa72417955932441cc7c9324e01fa9e5c0e78a975f221361dfff4f9805541a09ace945e5e5ff32567bfbf11d23a2f726a112c35292e00e1412f52b815112484effcb683f6da20799dd30a882a119cddf76a6d971651a2d4571736c2c3bcf76a9d58bed2c91b35ea9a15d84eedcb117df0feb1887188f0c04ff25419ae0e7d688773807e4031985b91aef468c99c7d3488541c574ba9eb1f97669"}, + {"0000000000000000000000000000000000000000000000000000000000000016", "0114026523aa61cb9c0ef1a0283d6164f0dcca4a283176afb68ba6a141b900481fbf776b12fc4a597580199bc7a218260c8d5529e3fca9d226c2d915d7655931a3e2a579db07c9c44f048da0aabc4a0d94ba19a5038c45e13118f49f6b62a2715e322b62ac6016aab22c00abe42ecf22996db812e8ec471bd5c652fca5b50d631a05c64979689701d1a556f930393233ddc7180fd554b5d90f6f0d724262a232e9ca65892f0d5d1407513dd7e3e0248d5b53e5553fd1f38167e8fc8096132737810c0b491b56ea740fedb9cf762343fbfd4610e7013591c47ac033be434449ba1c0e4b9674ff0929856f9682228e212b4552ea9064a5fd26617b55b9131f8f2fb454119ba93fe3abeef5c1014b428d83113a9bb73d76e68735ab5884912bd8b5b25d04b90c9e1b4333cf038d9254db60634f89e599957c6131af553ff17dac66d3bd6977dab6a6b5785d15eabaf4156201fcdb6580d926afc1a740eace9712ddb08295c43804f9b92cea91b91782b62238306a784219e992361d1c19af3eed50622307029433c4dbf1e3cc775ee3502432fc5416f4bb7dffc1296875596c33921efd146f06da1a52c0d539ab6bdd0397e8772393665f5ed19c38a12a5fbfd92ac4ff83c415abc361669827d5b9ea23f2947ca55354910b173a5854e2c00ea6be1fd1eb36cf234a1194095368f2c65f555425776233dee2720226a90200c20086f0eb614251216ac482232d47c91c2cb9080fa80d337c55c1c8755f7e31c90e1c82f70585df997a0517088e2962c176e928163346921940085c89096490c21aa1a150b18846d3cc4cf0b1c51207efadcddd9f231158ec03afb038a40d0764bf87a22d23cbf69e17bc1dffd1e684c53a4635ddd9eef79e14bf596d4447fb0165ecb3da89bd15de9f9cbb6804152c3bc525687aa78e83c23d087a7f7277c6fb9fc202f8cb48748b649edbac4137591b71ec4ff19b66ee1ea3da469c4cc1a0fb15e59417eb2529b3b1d12dcc06987432501ab5e5288740857efbdca0a33f48d5c72591d2c069d2b0391f36c523b2e99ab981a0ce65651c528a56b8efe4d383cec2a9deded0a95378af3f334cf5a5018533e019de8f081994cf7a5eeeb67b07ea1e89dd1a509243c391ef942297d72ff6c8abfe24cd2f630ea9fc25e58d912ba57ff247c529a98c6eec0b05a9f55f308e6bb9b201616d786259e0b2207c422f11c9e529609f22d99ce131a174e842f580476df8750e4d9a4f6d8841fc4e36566f3abf804de2b993333a2cbb7a3731982b7cc27257974ee711bad08ad8d7a317014b8b5bc7b30ee1d5522606e41f14b694897f48455b8f5dfd9399aeb43228ee99e3501a45b2d6cae719cc36589835cab5c402e3cd14faabc113fc7881ef1f899ce27bda0da30084953778cf4005d302942cd403011755214d9ea2d63566c48ae88c529947f8fa1117933221ddde1f55f3bac2ad5a5b91c662dbdf715c50f40f8796e96bab6baad88fdc5e6b9a7fdf3f4a905b48831c969a985347eec5e81b57aca6ad4d5575ef0cb2f4390990b60bdb5b118ac8453575929bae935c10ac5f1448e72fb19bcad2160f6059cb8ad13d0c1d165acf666886e073241772025eb814e909b86fc04847a94ee8a02d171f89b9f5f9354970d1946d78bf01091d33cdf3b07269beedc24ee71e124cd15f95b86f274b4d8b37603527ac4582cf59b113f26d6eb7b8d9107c67e73404add904dcb17b8025c6854de454d2272dbd61e780161f870452f4d02bcd24e2c48e3750590d090c962cc601e912a8b27677d16b4982d1dd3a2510b38c8cf69c4111f2bf91bba16da580bb60d073c71497e2f872c816895cb204e429710322bce69ab4b621661b4e902cdfe3a58cd32eb3edfea5045a9c6da1"}, + {"000000000000000000000000000000000000000000000000000000000000000c", "00337a3fdc5a3149803651d9c42a1698ba6d4f7a04072f15964cc6b212950c0314744437666e4d9395f00bf8254ace4a78b96114818016ed92edb00538342a17985a2f946cc93fd3c0249b0940db31bf9575941f00af32c134cb8c331e81e3802fc5969188a19abc7c073fe4fa46c9f2cc61fe4280ca220f266aff36069c06ec91b8ba5403637b8a1088fd165055b71afe22180c3c94b8ad1ba1af7d2d51957bcc636a1ba6d23c3b01865e9cf99d0667c1390466d8577a218f074dce1038f3fa07d799eaf5cc5c2477c7c6c6997082de22b30f5bb8f3a787f66069ffa3adfb73b02a086c1f2e2e20c1a4d188a863218c47c41b875b8a0700c67e38b109ab4f55a5f77ab9ccdb629eb9ee123156acb0646d1791fa277e1276a324bc021f614b9f38e285b2020f0a5d873b30e95d0fd877a8ae21d57a6e56505b53bf169b4c3bce1a75fd4137b286f73004b256b1f5c98103a4da5a3a954a98f0983a0b5b76b9e2be4bdc658e068a4458abf513fbcd79e270bc9f1c076f421f716505cef53d4acae9652656211c90bcc64c79df5fe3270fa669bc150b6c72cb4b66100c3f079e7990d4b65113625e4d35e8ff2dda45430e0a6b8042915cfef34c324b0ba0e7ef7b13c11eb5d63de1868a2070b2758e1d654a3462b5b3d9bc294af6a8fc895ec3ac77f0252467cb0d1e20ba63b32bab286572a63ef8c8de977207d37acc4885b9df3246d3d1b962b43142d23b599a11901931d65d0a7d1757e6d3364c5626041d98d24311a86663b75b3321c43c98f1d0e56e0a42a69647713182730c32e497d597688ac9385af782da05fa5a930b565fab56876050b541057e7a5f9a868342956c4a49b48d1635681abff86965fb474bafa99fd9be768013f2b667b2d48ab2d713b337115dc9f9ecf5bd207717578d72e806d498b411328b91692faa51d2dc4bc80097a046f3c23035c03421e58f7933015dfb35fed70d3b93ec4b6a5ed1ab8db0fa70f51fbd87f9b601f80766d72f08942deddc91a9986068671fb0173dcc4b0869c36f5e35c9d3b9a4239a805a222d9506f107bc0853db9339a178b30cdb371bd3f1b6ddf2627e3aad3d70b2bd045bd9574eb1e976e055d26f7dafbd68cf1d07e1436d1bbe55d2bb99db226d628f62d25b5bce4031d2bb489392fcd9be0635d5eb9c2eb7a19ac58203959ba221c355661e1154f05d6ee5e284ff3a62f10a0e8d7edc44289ab8fb123bcbff5032d7971e45fe1310caf4060fe9b339e4d160735b6fa1030193829e23554f04bd9715affb87247c91b221330a4fb8842c077a228d8f673ccdbdc2e14578a5d7d0b8ad729e9437ccbbaa8cda168cf395e50e47b462f353dabbbfb108549dc3570ea22cfe4de47823785fc937d47fa07e2086b642e9c851f70fef42682398c5b59ca112dfaa0102f66272441186d863c386332a8554f6f2fa5d9a1174943bd51442355bfd64fde83a49d94c63d82e2a05f164c8a92923bbcc1ec1f7619ac50370043c837d17cc67a9eec9ae5e7aacbdf7ce73777f895f5f9c1407053ea7668329cada2e71cc6c4928851cc14e0ff50aa15e9cd049ebdb557ea1627cb75e008e65a7760114ac5623efcd1985b5e633d1fd2148f92cc0588eb8464b6465aa14b819e491c5f50f5ed3f20da434cb670580c610cb862997a9f8641f29c179723044fd68ef18d3ab8b86e06dc1f8ab31afaa6eca5ef271991ac313cc4d0fcff76e53d4dd91fe3ffe78e5139a3505cd276424e6b0da449d602975edbfb86e05f448fc6be60a2c563eaccb3657add250f09c91a7249c27571027643623b3eea4180573c5a91b09f360625bd37f672a1659e4a95792dfa5656dd28fe9a129a61bd032e8f1340096c0fa51833147efe9b7e5ea85baf8163d54eb"}, + {"000000000000000000000000000000000000000000000000000000000000000d", "003947af0bc096d6e35ae733fdd820b28490ba62340af649a5643c04afe2913532b2f44f05d4c7911f6708e1f2c35bd7f91775f40207bebeb5816db111e53e104423db231554177c13c15fd0e14d3ca6767372671870247e6b54750ea8d25605ae46b7b61791b187323ac0fe693897731f52aae6c0256e49127a15d8c66a31e7b7fa7f976542f38469e82d57af3a98d1579ba7708e1de6be39b153dfb207f6bf45c9c30827784425059cbf1bb1045fab7343032368e66cdd8d739a3262460f6ae1682038ef09c9c5067a6780eabd3fdfe48514e05319891fd28b3bf9e703d4d1c2fe4d733d99392a3b11c1b4160e0b786de3944f551bc16ad9f7cabf075653379e0d79650974b800aa77ac7f5fd2defbe314d5277b6e16114dec52233ea0cecd2a4e13188ee51fd0e72db2e1400f519615f6f0ebab257ebadcf62d5283fd92df3b2895e2233d69ed6c841fc3b87e483b01216ca64a01fddf3a1c321faeb37bddf163df5e731780a4dca6cdeef3a0af2714f1c4ae81ca4854299919b7b536b3e3de2b29f1856875d1a7328eb7d8edf221a92662c61c8bf3a1386303c898838e080e79c12e0368f8cf785277e127d5b3fb9a5c07c503d233e4712647222769d660bde38df2ed1849add989174f0d9d0865ed5c77d36eef2376a1546ad328399d1ad22b8913257cd4ad5d2df1b4c671c86849e921ecebb85e2b04c315d0bd90ed698bc1572fed7f376a4652bdfb910fbcbc463ea26ff1e31f8203cc51d0f11a611d32ed08351d058d8741fd431ff5ff7ae35f5db25239b1a8194fcf659951956d4b9d241cbdba5ad20d67bb429d0bf4535bafa32ce15c7082f503f7f439f63f3ce93c123db0eced1eba9b0f8635745b4f9c95a8eef1da420c215a1542edcba7b5ead5406fc574b15127d4d8921b75bd30b3a234c573d67d2c0c7a24af65355bb91f00a481520c082d20519d52bff49bb60dce421bdde01dcd73e1494f6520fcef32e879d4102957136de86607986f3f05de9a89e0a9e0c5b7e654c234571b03301a230f5e00ca9551bfd9f52412c19d79cc5679b982030cbf2c37aa60415fa35112eb5d83aa9081b6186e149734f86150b303bf94119c3cbe7ef49c92497599134d6f508d491c01448a34330dba5d7db14a7de07525a266d2f4eadb0bf848a32985aa7d39dc959f3029039a8ebe4f95158b136101e55ff31a99b71cd248ab100e8275dc1536e8bfdb0163e56ddb27007bd9ee86098388fa348ebcd79175f684c0dd7cc9b5fdf4da500a81b136e3506f5d9fcf60af1a78917e5871351d37106291b51724644ddb7ef5f97f596a399cceece73950e0eb3d802ac8f3f68996fa91efa1d71bd07910e81881194dbfc6c75363d8c4d0155f697a4074dfa0d91b82877e4b13d37f8dc212f04e4527d971b2d9e1db00dbfe5bec61d057ffd172943cb664ed66b7d0702f0478854b9b70b553f4c0631003711ba63fdff6de4a0c8514cd6bcd600285abb2d95852ae966a1957f66943e974dcba9351e2c4de65a20950da0a03effab0fc02b7b709b1029fb1d668d162fb8e1a9db662cf7b6c17d95a1a14e8e519aa18f31c31420da51398f4fbdf0382517a288428ee48db13c0672bf282316598ca690a5a8a14ff9f6baf4f2fb21931cf0971b2527f92180227dceeb5d06147f304f2c863a65e49290f375691416c74bcb7a8beed7a6185ea29b4cb22def31a3bfe0f30f48daaa309b33ac8638e0a6e338d950059acaa3866960abd61970be4661556c638780773085c0906037f9889cfbaf2a3ec9645531dfa190f1a75fa4a9020c8e793cbd2a5ad40e1ab0e65ffaaf357789d61800431b77d310cd9789f8060bec1bdac1afe3739c4223d5b5b053bea015b60689469d94f9fa6ff9c1b918e"}, + {"0000000000000000000000000000000000000000000000000000000000000010", "0024f30f6a25882567ee711f7639c9bc6a556d177a1a528b6c0e86bd427b80a263729ed7291d7249b76d0edd43152c09c41390c9832c6571078e091cf2dd4b3fb52edce3dd9a0151ab369c2afbb249f00a9ed6150607286179f01a9fcba290bb3f32efb86c5a5f1334192c6ba7bf5781d1ad3465062fee9f4996fd723cf90cba5bcad047c0d371bcf30bbc699f31e0b0bd59111e1c3455b0f8d26de541b3658d48fed905a4ccada90b55f6c14f1143999bded49c3264bbcdd7e2dc3222315cb2f99ea05a17c76d836b882d32f1f59dd132650e1c8a7ec8ce503bb361d3dc5ff56b54f76b0a347452de37a46e58220da9f21756a7c57b4a7ec874acdb0e162d36c12d876fe79355b265462f55a6c81124b5165763c81707784bbebbe29220db258a779e1dade11316518e06c984a57a1804332335f55b4bc9ff2ee52a6015f6cff20893e66775d00278253334513e42dc003a38698c130569423a654adbf2b1bb0222ba56960da25a2985d39928aa39211d2af53cb84db8f538080f325e300f48caa1c881c43a51bcfd1f99d39dc2ff3a0fcb594d64650d66ac042b5a23bfd2363312b3fd06a8e60e102e2947f56d11edf8a24e65dc0a53b81c50f224481bb4a60ddfcb2893b2e5a902f150188b6015512ed0e2295d77811a17393bf083a2383f1efa7717fd537b1e86d6cc5ea9a28aad41b3c5322995563f0469678d7e9dc21b2d61f18d9de70445163e7497d22b67317bf8958dfb2eb58704ced631a25f6dbc6f1e0efcab9b6f968b87448d470e8e735e3b54ac1b515c56a4a3c5b3ddd3556b30b61b0f4c763ab9e19d87b4061d80601db0ec879e541dab3dfb8827a0b4be41e7227c6795ee8ded595ec096aff2f043bf7ba73ec12807e8d4ac10dad3e36d72c3efd979bd5d4a0eda0bfc095f4ea2b6cebdcece3486c4cafa47ae111c36efa300461bc89a2fb163d1bd60a48b48c948449106be8563f7bd9941dbbbc4ff97b85e8b67a96390761d584522e7e93b7e0ed5374bf856744165f059f71cdcc7662380215bc52e196786e52244c92b591ca56076bc1f0255f8ae42662d2336356296946b930149af9a74453f900e2f58e40eb3f6e40602e2ede835bfa2f11c44042829ee68492c5b1dcfb19407d43e399c1091addd66909615b26082d3b59f087b28ff9ea2a4df7b3c13084379f7694f1d149935210ee07cf321221bfac7ec22aa34aac62979d3ba06991533dbbfc25feefdb1b32195cbd35ea3eb636de4f23a12b0b105d67c990c7a49a5a29228a162c1fbb3fa4ae8eaa0f69c0affbe740d6c096561ebf7e9f29bc4cd21a8bf1318df9fe8cd12a626e61f475b193d51934660cba5832632bdeadb3a5a6c53999a2bab7c2564c8dbe2643320873c57cf4c480aa2fba71edb6d0af72d8b5ff26df0e53a22220316d49a40de8db14e3f0546b4d6994ddbcbdea8c9147896e2ca47524c586da79530c326a6a279be92c751680374b92b39d799cc0685d577ea0eefa41db1e95f1fbc28621af2cfcbdb569778ff1f8226907d904f0761c354be4f4c555338c2faff1808614f70fef68d1dbe07d4b38ffb17767d53bbc12e8ddd0d151782ad0b38a87d9a0f109990eeb2d320cf1c78df6aaabb7e2eae1f8f2d143fc2dfb352ec47a18dda4857fd2a76083027968c4829f7a904a2677b9a0fa0f6f436233d2682c5b0c1157eb7ab2473446e9be9891be1ed6bd508c61df845a6e7a163da92845bcb43fd7562ddc96617621e07fd74259fd0aa822c6cfdc17cdf7292bbb50fe609e0100c0f156da2923e76489eb6859e3edbe12072cf03b14d04b66930f417beec37530cda3cd8bb133945c789d0e7dace20b4df856bec76dfa01e195326c862f5724c299f711bd7c83653fdf9fc09567b9d"}, + {"0000000000000000000000000000000000000000000000000000000000000011", "0133ee8bedcf9a133108f3bbcdbc20ea045675d4460c9a61f5f791b15b91b7c0db1a98890582d4af7d0805e55b0b1c875c872acd76e629399a260362b2294447998efe0658d475935e383ab542ef1b14fd5929ea040500296da9df4d9cd774571d5fd981d040dea61a1d8114b75b60d11b0d3661f9e7bfa309da505330c610148a9ee44cc0e3175586361848302599f09e4ce463c21f146df3ededad1e77bbedc8a0ceeab61c82e5023e9b6120c734149756f126022eecde005550f1ba17489287858afed34370e335b0d79e5256475ae6f013064ba86cc8550d81d5730f4b23fecdd5ea7c17533aacab23ce6104b9d38e25b02af860b60fce1d1f1e1457d78d1ccaa04494ec85c8bb5ab61595cd31b3043beb6a3a854f9cfaf0aedbb8c77d32bfe3819fa6772f7db6dab772f323e358d75c2ed4bd434ce4fbab3b4358a380b5d32597c70c6507c06c85fe23a5dbe4fb01f9f23a4318ae07c873440d457553e52791d784830bddf9c0a5de768180287160791ce08b20813b53770caeee1c2d162a31add7e103a1c2d0010b231384612c0b71fafd923967818a43f939acfef2fddafcfbce0539add5792042b99f8d89d676f71862991c550da43c841410e395ee1ec885f3edc7521bb751177e8af31384e6503e222dbf630bb3b6e8b49125d37ed97da2526ae33048ecf5cb775a5a017ef653e2f7c97d50f4083c02ea0f479dfb091993cff5dec1861c1f77088d16af6b863415b000db43d4f790502715ead3d2b34a257c139c3cd9f9e4d2c1c34dec4d8e15d05e1932eb30120f01238eb179daaca436d3672e7eaef13c28fc0d9814b1007a77cfdd61695c6af0f3b6e76c1a092c37b38e806d194e8f05b188e78e7b49be4c62b91a560ec80d3d107164ffb204c67123f7bc3e0685331f3d28e05991a6a1afff58d884da125363018ff237798b046b5a5324181ec2c296f11cc4ed4178ebb16795ae055c83804dcd2714c45014abf4c42ed64c13d3ad3f102b7b22f3d4eec8d4e3b2257caeb49520886bc1e91d446da94211b978af11127370a0f53c9d1b31071107923993c404b9852a8910f7a8ad314e9bbf997bea0e2d463a9648a5a0c166f1732da29e399fb796869d0a74193e165b1cab8880e128386a5314631a37264c2bbb643c707d962dff31e531e4d907daf541f98ae9075aad322ecd5b39b57331602e90a7f95b890c36b721de8c6f091183e8fbd655d6807c3725f479b0d4fd0ceeca3b3b06a3a6e19374e1455c4d1d52758ad27f1d8286240248742539b55743625b66d2ba287fa3740c49272aa80ba4c8a06a2280eb14fac687efd7467e2126ffdc1d90c0efaff22415abc0665554749f302b140f6ed8a5dca60b892197a05ac392bea3ee5cb0af169af45b84987a1745dd080030d8756ee1fe5f85ee0496bd28dc9eec59570e52ed13edb00d30116c0ea00e1196b1bec78ed24103f3cd66ba838202afd0417e0929e16c98f60053da41a4a385eb5929d23a2ef0894b389c569031310bbe6e57092d4c3c26812aff0b5b07889cbf3f1dc7e5aaabd595cdbb5c31c7ba760b822363295e921051152d0695cb2ccae9f70b307c866b08d72c5b025045a5d44a60b007f71f5d30cad4654323f90375a329044bf32e030b0ef9d74558591a2ee00588e0e03ecb374ca50145f4b239b32b0b11bf37a2242517d2caa4a27b79b793f78542604e5a9e3cb08e17d5a73b92c9dac518a081bd7e9d5eee206733c833226caf94d5ae72e9ba9173ba2ba63d790c513b58ad07c0c329da151783484302c54cd17e7e2beb33284f0d15e3986dc9d8897bdf5724084ac9de96cd9cc4f612ed7a1a72093d3d05c6516f5f3b6f64d25c0b36eb1ca6260d4d6022859badb9520ae5abda7a1f567fc3"}, + {"0000000000000000000000000000000000000000000000000000000000000016", "00ad4c1b755dc9c58e34f04a73cd72d1fa52b1b901026c53f7a34bbc8d6a49b0e9f9d8147730727d923304fa4303d831cf23e0c770c23954aa3db6fa781ecc19d0046acf8b2cb3d9b591a423db77e5318dd494e9132255bd9a4cf7a1da661286f4a90b3f4add9be4ee13616e6fd5487344697922c68c3f09eda234baeb4917916be920a204013d311233e9991acca8833021b52b746554128ddca1c381b81865eb5236ea389fc610015c26eda3985ed36a68d049021cfd7c425a73940a3a3734845fe7bd7bd5b5a871cadec99699565653371b8c613629c95832a460c4afa969f7699e73fa70ca2294031b9de3b57f428b02956af9f6aa1dbf7cf09c064462d620ab60199a2923af322bbde70471daaafc28018569bcb794fbe5e295a6c6c2c0ab58813d19930c692a8e7d88d88a878a6557da3a9e8de343d5a49f3a06626ce293ddcf216e46dd4bb9c42a77609745cd0234d86e1520c4c1e6c200e8c864f675bacf95a2284658dbf8de946d9cc48ae56d14e6ca0f490adc3f672cb2df0227b14b9de92d231311cacf0ce3cdfdee7a34d4ede6b2e1e505586e474451f441975eee1e7eae0416bda82ad5a23df8e4f1514a418f58ae980d67702f4a652f78acc7c1afc5f481bc716add96075287e329dfeebdd84be8809831b6c2cfbfbf120d9e139ce13fbbe7672a2c302d996c96c272f3e792657f7dd03704650c001bad0cff9cf4a22e0cc63185b1e9faf617231491ddb98b837ea907b77f95ebb97b37e4fa9da628e214a9a9747981ff4bf5cb79d70c9f0a4878dd6b4b5407417525bea1657fa8f7b5f8f4ae4bff1748a1088adb41650598db865355dfbd57a4de9771ff11bf0973963aac5d8d4f754487e59ee436727ec51acc0718ea30d446255c3f547ba6762fd1fba6dd3a79fdf13962ff87511a8aacdbe743a71ec5955d626b3a7c3e00e9caab2614aa79f8d1e8d424702a3245c7fe701844f83acaded41ee53b23893083e788debafe19f3a40486a5fda582caf61af5a184ed7fb59cf8c7d438521b0ead4dd007f6afab892350afefab6d4bcbda981903879c05031d05bdf5f6257c415a87aa1af9dfae8a1ab4469829df644b7829b3fed35ba622148edd45ad04d88ded050f2a42fe4ad084677addec35c6efe69617e92271008eadfd5cd723ae39a9efaa47d85460af08305c72384789b50bf014ae2ff20f5debfc7dcbf013e8a555a9dd5dd95dac81d95865e1420eb930eea31a202958dea56b67e0ff6500e655c1a966af2b836e269a2a790f953917461e04cc96dc7dfe7fa0be006e0c0fb4c5b15648e7eb43439ed73686cd1996a923c2166318ced4062c9e7541a4482e28db5dbcbd5d363a342722137de0cd353a71140704cdf0d5bd1f16a3c74a3e52999c33d289b767288f82d08b22603afc476a01c242597bc13d0fcb75f2349922d9fe8fae376ce136843322775b5cb928d9b66bcabdd5032b39d9e6ab0727ce7e4dd767131908f12b8bbd8a3daf517097101580647e2725fab5520e846946efee91fee2ba711303fcd640434d8d1c71f06309d2b998326f3f95fa3227c5f61c2ed57f8d4b58b41144ddaf319eeb55a1a104477b0664cb74e3fb69d08e3c96df31d7795928890b5da88cdc85060a5263847291d41ac589863537280a37829bc4f4dc6ff2c7d144f7f86dfcaedc6b5dd2112fb8e1afdee45bc400261b39dcec7e6e581c99e50ec480b499dd6eaf8157816860bee36cb604df26d911b5c2272b0b822c84a6f72754f5e7aef93f5d4db80dc5cd8f6289f2725d28d8d36cd02ae647ba12a50c35f54a853c18797cd79cd376d8b13131562297e5f7113472769978ffc7df12a639ef427f05fabaf921ef21c8fee985237b2f5f8d35a057313dd9c93f74a07c"}, + {"0000000000000000000000000000000000000000000000000000000000000010", "002847a9e24b3a767545e138e4dd96516698cbf35528036ff7b170f245f14647de37f498ca93c87a134822575520850c1a31cbcbf53ddfe5cdfae2f55c865b6558f719629bd4abbe39d6943e45a83e155dfae96508c3b531da5c15d1d097979ab87f20b3a7255e4d630fe9711dbf92dcbfca63326bd898f68555e919101019b84d29a7117074cd476473f1372149f343f12b792dfd6c73f296a859ddde746aa666efd96421976e4a0290183133d93a738261f368002ab9e1b7c85bac1c0f5e8125495b2b5ef68f52a7b5460e2e44bb790cb10850bdc05e10a17edc78d5df9a583792510c37f3621634ba4caa53d68eafb5341879300667a8a35dfa7203440ca72641369c2b6008f3a2d4f91a910dd690fd0346decf48dfed91fb1ec11d3871c0b22df9b4553108fa947f9b1f841505de02efa66cb3726dea9c0768116acbd1bf4cbda712fc23c8dc446d99f4b291111f005e024f4a4f26cee7d15368c74d3e8a3388fa537230ffa6742c91e55771388b3f1aefdeb74a78bbd6160236609de4614687f7ae63f1c3a2c1e2fc4fdaf43c40bdbb5e749948bf609175a9b361169f8b453c7c57057dbd6e9e94c4973de8e2fc8b47f8c62cb1940e0f2ea83574dc6149b3e243c80085ca629bb0327f71f20d142f0b5ecef5cf2167a302d2aa600f4ded7d70121080f99edf8766036d1a235cf05991d201073aaace0326e4796b050ce559fbb123f909848d0e0149b32e27c8ca71e45236ef444b33ae3be7c8f94105fb62f00b5817787f211503b2f83252e63805a9026f93374d1ea31ae8a61302cfe71b67a7c7d7fb769388170272054faddbea5ce42b0ba4d16c3eb6544b6136be40ad164655f4419ac07956c13429f632bf72eed3d8daf0089a715f40647fdfbfef85816569761338d83f24ab1d5b5d8621986e6bf5256a1ba854d72b52ae9f412a006d704df8db7197022a13b0dfe61c0118bcd45b9a285fc3580ef8022fe97ed2fad3793b2d2a57ede2b9033bd6919bdb9c0bfd0de372e6b2c392d1f93e8ebb1435f20ed0673a077b5b4293d0e75d314116af14bd03ee42632bd1e629c68f8065321fc1ec735edb0ba41115ed819536c15fe66af3575b4415f4e076ae2f9a09d594b40fddda23da8193f97b37443d921bb686ed66b2dc6f4dee651d969496b6baecf91fbda73f4f040bdf7e6c8dced033e018515e969cbca90dc29cd7e80ec8bd83a1466f0b46facbb96dee8c375bc71ccdea0e0f3a82ce531802c44284c10b61cc260e641eb1ec16f7a225be28bc13910de4317271310952464baf400c6fdb9a07e470d941a0e1684bca68f4987468ba23157fb70fdcd1acd89aab023aad9d770cb2cc07d31c17ca66750ea77319878321f360f6c8648d4e55a9231858adaa238e8551e71d42d8374708de818ed8168b013ccafd1ee122b1d6b2639e5624dfd270c0de23a2203b7b2a2d2e1ca19e1e4411314f3ca190dad02cb80777f1675e45ea26a76950b4be21a941990c9de2613cd91ec3ae90af059886f50d92ffc1bb5605bc1c8607ed02a64bc6ccf2c57827ae91c8b66a9cc43ef1621e5fceec4d51383ef8f1c5bb51508d658bf915c50f0ccbb140341b01fdf028d6f349cd47231f5c1a44b419048c14fa758ca3d9a822b53db171a201c39c54c0109a1eb1198ee10d8877d4871cb6c4a38ae8be3628ac1b85fc346bd481cbdf3b3a40646e3718d51e8afa198801c3e496b1cb7dc1549f3d7402767c3c76d237264ecba4e45ac9ad953747b78c7802137dbd5c37191c98fe7b4ed2a81be2c8522d86cbfe5e1157b2b8fc58644f1afd623f09d062ed8eaffaaab36cb35f6de728281c0145f3dd35ac1e471b273b2b268f5ddb3bec3192facf438d639304566c4ac6f0e83794197ce276"}, + {"0000000000000000000000000000000000000000000000000000000000000017", "0234ad6332dcf330f5fc461f6fddcb899b0a1ca60e1c51ff039347c08ee76b14033dd30ec121769c0dfc058a4c74703146cd8b38e515b75503732853fa94db689113fb46e2da45a1d5285f8455fc2f858ddf9fc9055653070793bedfaa8f34151e2255e106f24998bf0cd5e5382905d6f2a889b398c0fba87b51a63e4a8a06247ab3c5d0e4cdddc8106625dd11b55fb5b3515819af119dd2637a7ba071a5461f6bbccdcca2fbf7ec02dd083d6f11a6cbe20bd72e77ef89d756777e39093f232f3eacd1a034cadbe4a55abde9934ee9fba4d6111854feaf909598bd0308e3354c923ac111bec1da20bbf404f3a4a62132ec52193a69f1ddb44b5bb47813dba9a534d5c8994be43298583b1699574dcf6e2f42e6cc05efaf490d9941c5059144b9cd82fc505ca71ea6b268fa08bab184e0d7f22172c10360acbd85044585dbb97c6ecdd7cfa844d567c567fe60f7968b7602423ee054823982b3bf7510874603f297031db5452124f6e6646693e5ed87b3aefbd6ac2d986f9cb3462e8966f602ee7d29e579834e51d9e8850007f0715531c1c68cc976e1b1ea26e466c1c6850157c8528f810661025ea444262ce98d74d7d436e35960e53bffd445e28e1bb41e9d5fdd7c145ece400355e51b1adc7a0aeb6efc664aa21d357c52d3c64d741a77b07915775442c58cf5a1b7cb34866a5b74def59b94b15d521c043a308d36518237ae59921401ccb3e91fb51c9bf02d154e9fd41266a5013274b74172304a10d8fb081b134b1edd53d4d9632e3ce86885e05a0ae9649ebd27200cdb7b6026358b930cb2c1e1a49bc61ff51c31120a4bdee14447961ccacfc6f51657d04a3102d30c9d3919562ed62735039be104b4d6b6555d5e740f14370af312a83cd46ec38b7052155795eebd97439c8bb61796aa49894c47ed2bd352cf8be97b8d6e4237d37702b3055fa4cc3db4a45c741b8a4eebdd3bb790e30e2315a477b0ee56f3a70f47969875241bdd113f909b0627a157a820ebd32b9c816869d4e4085a49e6a3dd1a8ce15e3da2c91920ac51ae5934868d8f58bd24810a8dac67bbce1921f8b364f45c2904aa0ee792dfc43bc84c9789da3226e84d278ccf581036411b18af0c2358b571254fe4fadb5e72feff38a1a6295a73299831404efe7b17c821e4f124943c4f0d29841c18b65303f5a4f18c101f57120c44d7bce07b5178489a0d97077c89e486a912e962071705a8723baa3455d5bf420baeddb22f15238b23ae81c461b52ba60d263bbfc731d9057c59ad88c1eebca3337ad122ff9537bde562247ebb6198152fa3c9e5d50c736fcc773812baae51562b45c76017ddbaddf875d97246a2f24726968307262ab69f2a159d653792627d482e8ff21801be8b2a3c41ba83f559fbc73d96d62c39611779cee90ff34102f27ffd6e8fcd04f8c1c983b8cfcb469cd07a49ed16c677666caded05882b11d04b7ea8b2a50abaa48b15923a0110e7b149884ba6431756042ea9fc3c20a01bc622bc2b6bbbaf9c9b424b372be84547c7daef8d12e2d4dda9454aa3801986e72b6eff4a56a75628e82f5164df1e10fef3c833d4a34c60e64dd09b7b6b1f17bdae9ee4e13069782d82d0dfe4aee17f94983ff61a4541266ea02ad3723071f42ae5a1e0f5485d725a09c37d5a072544a5629fb55ab642ca861bbe1f055f3056372ee1dcd3df8ffc091656d81ffb76e7feea4812bbadac26cabb89a587064239441225df503d193518c950c882c8d727a55d4602f95ca2165296b785270a33c220942385a7be67016a78571350c35f56be4c0cd512a0d71826858bef4754d03f70e326361a1df527a252136c730b379c54d2ccc1eaf830e7990eee982b8b5ad34e10b4fcb9c5b33cb22267d74e695c0c27"}, + {"000000000000000000000000000000000000000000000000000000000000000b", "0012b949cd1c913b7c4809115f6c369f7b6a9cea133415652c871a25e3fd5fe3b2f3b146ce2c805e235f224af3fe1b70b345ffebc67c4dc8c96eac9cbf874c32a85624efecdf397e3ab720075eeabddcf95386f701d86a24468c2de342b660bf71dc0ed8b0c02af85c41099f6e1b3078b9fb1a650d675bd27a229fbbbad80f7cb6623618da7ade7151810ad85b30f4cb5b5f783d848e78cc5f4f0f5a45e658cc3a037a656c5e163709e85ee7d64502332c8bd5f61ef4becdc10ef8d1f725be84a3fa23f099c0dce4d6a2f6d55b3b0f1e37b014663abdc68c4753b69b51cc5ae69fa4a9ae72518d28b57ff84f987b41a001e36f2424af6618085d7d950e8c0252f7dded49306f3aeba2f3934adc8b7ccc74342e83014455ba7faf54241515c95e51c05bb4b8db1bb9a327348bbff8be5b851bc5cf74597e951790dc1f84dc60f18bc266d77bc3dedcb7bacef722bf9fcd02bdca7e9b5adaabe9eb347ad0dff10339f83e82c81dcdd90ecc73e221e0e8352b86b5b752e5ce1b539203df03299db2216fd679c414612651f5e40119161507120745f6a4a1c3c21761fd19f4466db39af50e0f184d7e63be6878638d8f32781c6d7f632c4aba4e941f1ff5097d5e5934f7a298ba44f06bdab37f79fa801ef78c8311091e256daf42b8641c752d4f1a8ccc4429dddc971592f01d8967987afa51af32f99fbb468903173dd89d5b7c65e64310db1f6168ac71d8ca418a06e5fb2a65da0ea1e42d53abf86fe9b1eb9756fbbd2ce2bea9692124c391254547132ed0f191ca7baf2454bebbc56065cd9590e947938fd12d4e73439a5e870523889bc7839291ccfa633aaea667a2f3b01b4ebf67aacc6f761aa687418f26c713789bbf59a55c303e1cd62904b5d05819edce9305a3dfcd594670b0ae6b6252d51b88a9f93b8ccf67896478d8ca573f539486013db9a3b1e8cc2f70c8e4c07263a477167519ff9f7d62fc6519df82db6eda5957077338aa70971a0e1102ffafc7338f4f71c080a08089dfcf895a307fcb6407997c81fd46e6f1b2d1f2fb68752458f07f5db7b603897e1f0c61478f5699160305c95ce2fa1af809850ea0258f94b62d3bca81e5fea9e835e27599ff7e8803c005353ccb97afe221013cdb30b50d1d6c79252921eef267fe4b58266277847e44dbd75e87de590a71036fce65f2d8ea75affab3db612362dd5a5ceaecc334e03c3e267a62bbf6914580767ba8c6a1af1bd9bc09cb21e4725dccb74c90f10697a36dc56adcd6d4fa3d58c70230ddcdaf895a86b4befbad9e76837bbfab05557436782c6e91c879594d97d1034b4bf45eb8eb288e87ac390eb08c843e55e758f0b69d9246b31f8b163dc67f92557c132edd2229e7459b8cafd30e0dd8397cde63fa65b4976cdd8545023f0b5d9b9cb00f3702f8acfd61d27473064b434a18221d5674151cd75217a98b3d1d9b598da98ca3eeded8038246fcfc67ca17321b552e1552b7e55e1446e3d987f26574b9fab418b94b419b19e907b4ece45faa6b4732541474e79721bca7f1e3924106f1e393afb85d9268f1566cf0803c34250587e00781cfa3957040b184229804bd4b49249fa1fc108be3087fcdb61254edaf32b9963f0da8283ca96bbdcb1065bdf1b31a4ec91591edb6340af20878e2c80b1f20851bbad545d03ce5b1c4c81c9eea0e5b2b1284eb95a98c6d226e26eb19951ec7ae5a532ae9d6cb3833bf3bb7cab8a2f4c6e67a558ddfa55a2d0f2496f2929d49605633b14b78f3e116abb056eb0cd331a1e6561a8d459cd1e8e7925b3c9f02edf5e421d3270d0acee66703f0e2bae0d1db0e8a8435443e210c3f1307e579539f3ba259ad69811d254b940c8c32368a21145725d14dc3e43aaf419bd5f93c569ac2"}, + {"0000000000000000000000000000000000000000000000000000000000000007", "0122f69589efba97bd9073b0dbd55c0a2355df13142f9eb1f87f508d80d6985461666b17ab34fb39e4b305271f26c736ab25c2a2534abb5fc042bf1f3af8bf26d2c66ce5af1693ceb1c488df4b66a21ec83b6bcd02093f73a09fbb6b81cba47af15071deceb41cc3a92a756dce14d540c5d8e3931a96b1b465adee13b347064de7a36713d1154e00f22a1fb60be6acd3991cf60ba40a8396c778d2816334017ad2de5a5d63d7a8420131974094b04623faa8721292af6f6cb8c08a13ab210b1e1e8ba439034dca6350d86fdb2d39461a3bce095b7227e6a9c8a9ba37925e7e5cc3c52efa6a6cbd1ad86735cc9c6363b680956cbbc83e928bb17cdfa207d240435829a1f1ca66a6be49fc6f9f0952bca443197e034f8e57186d76dfe412aae8eedf3d79dc0b56163ba8f1b2e74059fdd402842529c8c8a4c53ef2aa228bcaf4af515da0f28d3791d8c6aff9f81ebd611e012ef6c93fcd6b26950183c18f4a4275aa74eeaf4f02e72ab5685c58d14b44057258ac7b3b91429cc0c51b829dbe529d63ddeea063061e32584d0401899ae31cc9b65c892f584d9615928e759f1ed53f210e14350217ff962d8e4bb7e122a220235df97cb6cede9f813a12ba109912706b0b0ee85e04f89bb2bbf0fbb7852631d42ef595c4378348244ed1cdef4eed805a75ad2fe62fb7e61c9d0d36dfa31a93f07671deab594a63016642b9dcf4cc1dbfa45045fa48dd62d2569ec272155c4d1f76d52c3b5d1791ff624650920dad3e70d7080b5d9e4e4afe44f268d58bea7e0d4a58ed3c608f092a3b3c690df3ff559fc0f821252941c7a6fe763f05f7d04f65930c45ea41543f40a75e55a6cad89ec4102f242534239c475961717cbffaf8a9f32bd8008d160ce18bbfa4ca636c50b24b4551d1e8a20dac21ae255aaecb1b11f64d856db3301042d35554080d3f8f016f60477fda27b30f8a80d327261a1197df9ab8e81f5373602f93c591d005d5dc36ef990e87c35c7c35098eab5d3194dae38474640578ab2f7dd38c1d48b80e9df41e17aa33cf8e2f76056269e1d6450658dfb903024e495a8fe42321d730d2b745059207649982260d253d3ccb6b8e29ac9af47f263a84821b1a7c6e2009d27dec586036a354d2680c22675816e7c31f16ca129b1c88427921d7f2f734513d3fae398c0e91f9950c261d1379232969ef2aeaf51d5da49efacabd3e24412d64b6e2e3c9e9f52175ec0b6d2d99e0e61d71221368ee8a7fe48bd79c06d79f267370e2ef7cd94b761998b25c5536caafd6bb34b0ade1d96341d15ff6470c9a78f157ac7ca57fd2c51c3bd50325adc312692218bce61c10df0175b39be6091e6d0fe232b97704aa0d59250a43c51394e12ca107efeb5da2390914e7c625ea8cb32030f2dd88d9b41214b0581d63691f111202af3f36a2ca986180bf86687dcefe762c0a58b1382a91be0c8ed1d7cb6a3247e29c6f703e77f53b8ac80c2887207b9d6aeb7cf4789b525228c743a37f9c6d1f9913866b098138f841fb1f865b5a1ee4dafca9410e4ade41fc968d2aebcfc1dc29bd22b173b3ad5ea52731355a438cecdc7020353de1b160de8467d4c3cb15c9c7f8594948ddacfe51f228eac7ad0d52dd1d6129e317759166d4e78a2c26344d70ed0a15899240ce02c784e229130532983f912435d837b05c5b8414af08fcf84c61a0252bf4dc11942c1ac7aa8a805ef86c4049ca21e49a7830fd73a57c5c2db48ad388bfa69f477c33d342d79cc1a744d8bd7b6e9b0a969d99d88c1a9eedd422b1462fd38de530a2711bf1dc5678615522e04aac0353a7ff5dd008ad465a5ed6a7a5d956472f7bfe6011d2ae017fd8e7a6c07f9e4aba929f061f44337733fe6baa23fadd866430b4e33275579ceae3"}, + {"0000000000000000000000000000000000000000000000000000000000000023", "004f01973c4ff102b9dd97838d712a664024fc2b75195bd5e56346be8dbef5e7307377cc96a89bfa8e8f22c9aace5f0abeb5d692837fcab54f1634bf3482f84a6872c838611f3fa004868929b8893acbea596b10044f72f810da984fb24e17d5a9ee20463c4b373fe42638698cd4cc3a848305e5d77e3f7d363eacbdff350fa45a98200b4dcab0dc93fa5628587d6dec9bd636256f823a370b830dd28f95a714cbb8b9f16171fceb084818a9cb59caf5449942f698cfdbb6ff9497fd5121f615c470af9d3bee96c2d1a83680b51a86dc5348279ad252eae9eb75dffff47b4175fd99dd8adcbe3f3d6195a4d859f39ce64443fc8b3dbece79b4f6b601085301da69430b964f5419f373573672ecfb58383d2375fd8d8bc8e10e9cf644000243e1a1b253de730e1eb76d18cf9d610aeb8729b877dc4a26e9925e3fd83a599e35c4e7082bb2705493acd8b5fda491528aa30a471ca15ca2bb874a6f3184e143e1106bbfeeb9aa155692d0df193c94fb6d76f810c2b9dde86fd951a115eccdf3a00c6652ab095272f8d7277d7c097c890d1b8a2646a356c100c47372ef3cd1a77eaa07b751060d9da58f34097257ec5f4186e190fe825ff57f5ac82e9641d52694e6b4cbe295d3d65c40af39943af044298b936f4f5cdf517206b340169a3d350d3479500e2ad674dfb250bc5ed06074cd4847953299137a79e40f96f1a47575350fd428c2c719a354216e4910e5821b5a4d463698a67793c6a39b29cbfac0f3fd9cce7f12b5272737e9ebf9a2d9836916a0775cedc6959c381dff099dc2491e5b569aa3bdfc6391a50192b036e01cfcab87a68990a7a39b4467b7b2ef71247a1a0a24421ca70bdb5111297563666dadfc022e7651382d862c9e7ec6e26933b1c201a31c10f72cc9a9cc1f5e0aa2ec7e507b2a755b59a3db29227c4e974c30ba75c4006e6be6d772b9b7b29523f3b84240e598033179203cb9c67d4edcdaa5c09eb6d7a23ad832eafdba7c3601ed9dea93eaa76bf1e0602b8a833d8a4f7bbcbef90f3164ec9a06f5f8f96f1a1353f014439d2cfe67c604e963dcfc4deff3c0d9a340cd37402239481ff1d409e3aed92b1ba5e58831519158354706b0ba16db43192bd2a5d08dcba1c10be4e418c4838e7fa9759b204386fb2365e1d2c3adfe0621d43f50760bbcda5dfb12178d418fa7fb319ff7262b08fd3d02893837d2f73e4c5b848024cbd5e38256fea5c42e9e97fbd7c7621ebd594bb50e0a3da064c7f62e6ebe0f72a0dc3e9d315acd01a90e4dc9b78715c75a468bc673a6b9a8921473db2e40ea4ebde5fce2a1584e641660951a5ce8324cab4748d45c83c616e3dada6d1fd5d16cfd12f41af7ec2450e5418dd5f927f2ee61a5b6d2999e8bf631be81dd3160d2814ca41559c73e2fc664b63e8f1204c318919a91414db9db50f47eb110857f342c716c548dfcccf8284c2d6c3359df51dd3aee8a775c7424177bed8f95d9d8e1058ce3aefcc5f7dfa45bfdd3ae2d43443a10cbca37e811853863799ac5b210d4ef6c06ea1d3d96964904ff405369554be8a540a24dda84223eb1f6a2d048511ff6c4237ae8ad7124bdbb533d3fabb7eb83e7c1f1cb22a8ac4d4b500ef84bf9f81c5567d63dbce2f6099c4f65e813f09e35f059922be60890f2213012b04df81855e93bd93e01cf7d7aa7a419814d48f5a61d196c64f38c834a1ee1247132e93c21443911a6092428eb2b34c0fad96b6177b0f4e9b2490d0b715da273f96b98f73ef9d9c26b8d30ffd9d311165b422d453c6af16d8412a954720f538e5d33ee3188aff044a537c5619236da90605cae091199e3cf2320ef56a2371f53e947d340c871dbbdb90bd74f893e33e680bb94831bc6e97460e2b51819fd293d94f5"}, + {"000000000000000000000000000000000000000000000000000000000000002f", "006096c727b210b9d1b9004b82b974adfb5df6c14e2a974c33260ab5a39f122791483dafc32bb95c6e2010b0c9177dae668be8462365c9e0546de581fa142f17e15c0811cafffd83bca7b759e5494e4cdd9432f302555b402184c88dfa55e15923e4a10612305471d812646ea3dd77fff5d8f5a387d2f16d3d3bafd634170ff7abef47da24d32ca16417e8b7c00278475ea4e642625f7451d9321f6b63aa09a7e821a28ec3dde6e301e05e57b1e0148784c3d32363993a117a12506b1c0eb01fa0126f59cfb633d353c61d2ce9a1b991221227db6a093351c6d5e6ed25ce8f6b95f9806f6de3d63a7b3ac299d44ef13ed0642eb12797f5b50fb51d4f0541dfc958f3482dbd8fd699f568d7eaa1175cae4754308bdc9bdd2d35b00bc6321633cd2ae081ba254311e261111189366d0744723f071cec38dc33d6136b55f545e71ee8c8b15af087adbdeb40f37b40bd8b920135331eacdcb465e054c0fb798efd1529374c108f15b87eaa38ae61fbc751d47208c7189a245a383d4632807dda88658e73da2535e743cebda9fa4079927637ea5e9704d435cd05103498f557d8416e8f9ae021052d289ea385caebcbf3b05e17bb9105603b7756c90d35a28a428bc57b9d8c221badeb27389be70a04870cf06939795082cfd267d0ecece5cc1e101a7ff63e24eab7cedfabfd8bba2492db05533e8d92cef3650d01d6e516f4cc4155b4c3f27f98c252a70aabb9784e126692242d928f9cb4cad3fffeb4604d43b83048d708981fbd3d8f9d0fe5d4445ddf3a7676dc5b9c6cc51efed4121953570dec81b84be3e1886b494bfb88c004d19d3d1ccab1ebaadbd1b436efa02736e2bac899270ca3653f8c10373177c4bcddad6b07275cfa3445056e3199e846522d5865a6417e6653e2a208bf74f32ec639b6ce57e02cce39b8fe2df7a9d6b2e85cf83302441ded5f4ad005eb7033a2815fc2712019b5f81629b2777ad68b83247f8c449b312926bf12687e380014f80731655a26f56f08a6d22a45a1a61c8cd8bf5f2df2cae8c7900ebfdda686279d69c6d5a35817d0c9097c1e73d8c2f61cfad213f88a55d8de2e1ab96bac0b35ad22e8d91289fccbd0d8cc9d91985ff458bd7918b97dc45814fa6f59fd96e76c775d09cebb52f25d1f9237c0af245205e928e9faf9565546e5fefadf2d037be71cc2935c610e8bd15649d70a30ac47a567d31998f46998d9804133f6549dc5ad847e874abe35b31699f4b096221cdb36a52437e56edb491faedcb49621f232b79f4c8ecbd487991a946b8c32b213dfbf380d738cb50b5da561e9f6a2ca547e3c6d5631b7a69e313ec6a21495dc014d74241b292a56c55b3c7e94b120098f9736a16c15baa3f35916f6c6f38492be565671db9bbc16a8e8f56429c8fb4eea372e66173c23c606e1bc9b1806d11523455360b5aabd2564fcf7a8c94bb71799465bf1c90ba817ea39f9f58dfae81a4b0a23fe31273d392907f36dc4410b3c26cdb191f5332033e7837933e24b0fb728f5d32bf2f2d2b8243f042d07b2fd6b13e6bd696815614603b5e1c20634b1e0360d53f322cba64e39797b314b2516872069d7b4cbc12b773d5e0396250dd32c96181742a2ced4dd78e9ba2fd2f3501f26a0f7ca48c99ad3e3d4a75f609f42db0e1f8cc4f15487a36ffb76ade862ceb201f33f47d1101d05765197c2b702a75497d066d449f3a8d7ba140e2e5f8f1de77fcb4bbe06c115cc382f0e173fabad37d21c75d950c7aaa307949db1beb70a2139955e2c1817a720e7b1d9f1b7e8b20b68a56fa48a7f5db066342564edfd5328c9fecea51358fe428a3031da466f23e5e698150cb41bcbbca4292854f86e70b79ab56c3d7774ec9a20e0af6ddc4818c8ca177a24eed16756"}, + {"0000000000000000000000000000000000000000000000000000000000000001", "011a0a8d08494acd366931eb0eaf77099f5f331eeb12ab66a72263d49952a612562efd7c511652dba74c28778ce5f21cbd435ab922eb84fe96012e6d1a1fe97ce00710cb74d02bb4c417f77c5bf0967554b9415f020bf73137a41603ee3bc4a9535aa6e213b9b9497907ddadba43996d92cf87a418b83cc026e97abcff052eef33a85d634565a3a6b47294cefa831e6cdcd0d153eb7db22919890101f7967c4cc2450efa857ac6e002e316c36c97430583ca31032cfc9c261c739ce7520c61bc2db09196f34ee7731838324709570ff01c070f71bcbcb19a153b4be243856c51ad9581fa1acc171c4a6e9c5a908ae707959275eafe5f2e848cdc541e03f6aa1451183b9b5bd1c446d1dc75119f50b2f6060d7ec943b934af5bdfcd16f506f8ba5eb1be7ab74729ccf584439b7fcf7c016a0d616c50d6bf4cb8c44b335f4472671e2c37e021b4d6b332cf9a34811dff7801591c4e8fc60161656f54ccf658aa02df6edf25a943370e1f2fe41fc7ef5814cbbcfb98cdf7ed5d9dbf09ae97fb6b4b6986f7d341fe67e354dcf017ae76c91a30d2373e1cb0e6f540e2fb805e654559dc3707e310f085d64284b688531444f0a939660282e19fc6ca24f0369b7fb8e9e3fa9fe335c2e240c6eb729f9d7f255dd178d172bca3ebafe51ada2f029b5de4dd0bba526d4d77eade16b30b9a45b2c0c26236b279575cd601a1e7d7b7c8fd29b823630d72722c1683def9dcbf2e3ea2863fa02387c19723d171e9bec9c3733237350288cb46be8e8b4496dcb296535a08331ecb9bd38904c67c26ab19245747b4570d94c9f041e030f50acb03ca34cb0a81976151ecf119ffa5b63616fdbc987649c7fff494a0c367e4a384e165b0c01d8216f357c9304e233ec1d23e32cd00e5ec795a1252d776f825333507c7285c2abba3d654d592cdd0908e2633de62ca0266cdfcd751a004bcde10f2562a5611f376b5ce271dadf6fbad140725d57762aeb86da32cd97f8b882d078aea81de849bbacaded65e1d5bd7f2b21bb6a00a3657ef1463574c33209654fde478945e01f8ba3bb10586a4ce50da5bd16322016cb195a0f5e00d75167f10568d38bd0a83f590bf6110ef75f34deb90f54a4e24a5597209500f8c932cc4b4fce52ab360289bcf4056435b71a7b0b0b1c7e8f737fac3dd66b3e89921f103f171303a5d1305dc8da541423645576dc75b75f0079d5b4ca8cd25f3024c420cd2eb10f086aa7c6dea097057fb3ed7a26396b7a0b50e78f9a82de16af07610ce4a9e69f06515a3f96357f6fe7c0992bc12b8b806961feeea168425b37311076ac1afb8afb3f857f2171807408ed21784cdddb354c67c2bbdcbc0b3df373c2bed09bf55b7199bd306c80270e916461052578e4ef3debe89ecf6f1ba57a4fe0976c2bef8191f9e8f02cbcd59a996915939b9b0fe8c33fa7133307ffe79080bbb4e2e91a067726b658fb0f44b6d717730cfab0f2f4b7e9b896f97f205d529192e7f4e1423df04d410d4930f11d07f7cae367193a970c720f19b48b89910b1c53d8fa8971f6e866740a0d227c394727d0cc217ce15f0ed9300d1295ca478886f62cd42a7ef2a3e31ced2756f9890c11374c5c13c5961fd9a34cd913d39f8874a585f2e0b1a8cb539a135c75db45cb6e50c0ce8575ca24a397fd6e5b1871ac6e2207e88db664f120d1210d8c4fdb8c8f703c5b0328be2cc15faf35f20dbbd86d75dd531673db680bef2026ec43f9ece9b419a24e394719b61c4ff8502a5fc68f9444ceb2fa80dab20e792b5fa4dbb8fc2df10675e991c08f4bcdb348add1d5217c7cd5388e3cf1c248eae242df84396413e8c77db1e3a1305ed87ae50f54ab32d21fbdd44577b9bec0a6adad3eee7866a11bf5b525a80dafae0"}, + {"0000000000000000000000000000000000000000000000000000000000000000", "00e60a09b0daded79b3d858c2657320e58333aa50a46a68d58b7204a95ba7154e20cafce3b0c14bca8e9026948d845ccdf8dec2f9612e338e13e9f2b7bc6b0697c058bbd66ada77cb517127e44ae3f5e84bc3f5a0b3c954d26570e0f7841a90fb3f0e4eed7421ff6e50f914d1cdba4855380c4b9593cdb297704657a76440f3eb55c095cde5520e8d58fba66596181474ca4c6543c3dfb579c9e07c59039211871aec70de01aa75b0139f26ca45ae0abb76fb24128d4f33e9ef93865c81dbdf2b8b0d0ab036e5d62d8d2693f397730d5b7520822ba70e1d3372512bd27a3b46df1be7a7116e49a1061688c1d4453c0f14152401230479d2ac42cab1501bb250a8f0e99ada39a211f8563aac607ad763e853216db65ea16270b53f3e45284e619d1272932f1d10ba1e0c99e9cf55159e651ee456bc23898492898231f04d6b200e08661241078496d637f031f0f1ceedb06d0f59676eaa109882b744348db7a922dbf594ad92b42fe601d65839bf2b11492b4fc8a72f5023b214b0cf3339685b155f992d59513abd51649e50cd4544025885a20c5e9d26db62e630da778d20956208b3cba0ee34989d313a346e981d18bfad9a7a466cc8c28a22c4cffb61431b739985fe634e23a558b20009f68ca2f3ec303aab6585dc5d7963fd074d9d6172e55fefc40205cf3bd936cf8a6c3b47db4c38051b26fee7d33108ed454aee43dfbdde723b432c008ccff257641eb269c7aa2b9240cafc12b46a98346320a4b7a759a9034b5ba1b57cf317ac4b2a7b606d1b60e5042fef8bc59075bbba4dc3183fb5867259b6aa55f1804f9c9d113dd6bfb1cac1f719cd541dbc02bb22cee5a52dee1306861956f955c1df4a1e51a56375a416a1b2c75221470f425079953b3382d023d0d29238ac962f9fe5120f24f95b7ce96173b7f14ab60f6c0d1690f3ba1e0016f947ac2815f224997e362df9f370cdf0e9c69af2e2c46192ccbfd93b2bfa76483d57dede5d6b015810aeef7d9ad6f39a5cc9985c3b3d0ac8dd85e133cad0f1578c0aa2f9cc7ae6244aa7770fee9ceb4721ef901c3184e265f0647f513009d302e898e1f883c0954075e926d7ec82d6a5ba5710f593bb97d048dbe51e80e1445a4dae51b61d9a2d147cabe8127437f3f3fe51a1b7438dfd0f035ea3e06f3dddcf2da6eb33ed9b70189ddebceee9bb37c178547606fd2e5d98ab3792946438f635e6f16e39c9759521266a46308a23857eb0f35ffecaab5b1bfbcc75422af39afdd801199c3443712468c162d955dbeacea4d1b570ecfa53a3e2206035d197b6f42d995147b16c55fcd9b0dfbe7b0144929e5297de8138a3f822835deb7e7ace5dfe333a5be0678f59c70e33f95ff9fb1b946b89fe902d67c77750d551619f69a00ced7be367a8b7d15ba662f1787f401b4f88b940d608f986952aac2c5b5fd6f6f96c43f3d322ed389716b03e403683e05ee06e333513bd9180adde39fd345232c9f9cb4ba34d928762fd43e56974395f2e8eb63e16d6fde15d37db47745d68fd88ab601ba9729b2898def6d83e10c374c83ae1b83b82cf40272b71664293f35d605b0cc44bd0bf1993ef005dd077567346b9660c0d156036ee4ac95f9215413f1b30bcc3c13a683b81cb9a8e28feaceba092148ebf1d90810019289f0c11bed39b95022d01de30091fd5c760d2bd68caf4f3c8c904504e8474aa807368ebc9ab80b7b5aaeaaeeed0fb352c1b2be349d9111a13c6604351327ecd29290258c4857f683c263ca94e4dcbbb7136c4af16149001ed61ad379b7a7aaf4f904717e312c39970da0962e51951d42d598cb30ffc47d5f774e1636d553b249fabf42fe4220f86086ad247efa9f002d7baa2af49d4d0bdd1e76d5fec29c67106bfb54f6"}, + {"0000000000000000000000000000000000000000000000000000000000000000", "00e85247c083dda6f079877a46f5820a8f2eb641362b2989caeb9e63ff802906e7b9f19ae701113feb1f024225c44ad11ba355f7b7615a505dbe42deb4cc7b43521720ff2d212bf24cc587fbe93a8994e59db787017c6e75e9976d31aeb0d4b996d9a4e39aeb5f37f304caa8584c66f5d186d8e273bd18cd356f7817a38f03eba740958ba406d6fa314f22be117a4e9c576d73546d63627ae2baabbf90c91dd7555aeab6d9b9488202dc4f60d6d6fa3f1c5a22e072740ef23021df77221d72a386422054b737e6c62551751f41ff9d71d1281e5c41dc17d5bc36b59ee59119e0a625beefd100a42580a4bcb1576087739ec5f30c4e9a0eb73b3ecf18069559405eca6d087c72e0984a19630887f69da35a0db6bcae483c4ee3fb1176c9f4c224f60738fdbe5f0f72ca9f95109e2551032467b863246573f8f266b9197dbabc072324eb5e89e1d330fa3a0d19ce17d981012765a3e449e9d18d2fd0ba95291ed689cd1dce5204ae6c3ea70cd86f4b71e1b834b07a269ed21aa36b028950c65082c6c82b0f92700dfdd1ecadb4730dad036e1252e408dc4e9edb345e4668abc5f40e9180aa10ddce4a5cc7416f915ea1c8e031b78094d1fde415962d6f95c5b239ddedc75b339dfd787b515e9d6cb318a6377a33180848c801d22dbfb17ab2a678f83f393be3d4df84ac03cbfb7cbc32076313bba23f3d1d5901d4e73925807634927a523a05dbf6a20a339c275f09fd794ba148bf4b877e23ec53d7947aa8205b1b8703436f605943f9c1c1551860dff042666c355bc823088784551b88450a53ac124e7db84845357a0cc86103bcc8f4c65daefda4149121ea257b567acbfddab12d5a773d64aa7239af89a2f1185a244602bfd338aa24ca4208dcaa6139c711f6a588da1496005d31d19b40c06f0ef2a58261569fa68ea7e217021d0fff1e0202a09226a44550d25789d85abc5add375f397dc17727af17e408224c6fcca149d801758b26e2c338e9c517cb04b596c6758cc0a3c28d9fd8c3c1757338a03c327abc9d6ed6fd3de32a14fac06b8005d5cfd0fe9904aa0b1fe12d8c8fe8a5449bbc7cfbcb1247397fb906350cdf55a4b82360eae07b9f55b3892aab1ccf7e39f6cecf2dac2e4bbc66c77f9858cf2689e9fd8de36583f458f0a08d9fdaaf98cba6d9cbd6354ebd964103e157c7e627f189666ab1eb15a0c4868010dd985f183f2959aad4742d291e73e69561a59122842b4848049aaca3ddce13496658e0f1c4b6a9c0adbd58152336ff0d97f7d700aad2dcd9edb0df7086fa08192aa20d67691b374c04cbdeafa7208644c89a4600976208201307db21181e151717f328a52fa580de60e83e95140baad0462a93ef7ca662c06bfd933203b554ce8e3725b371cf11b3d33cc79523b0b5b5779eab9e816d04456fc232557b6f522474f467b5ff126c1b1ba98f0c8e13f2781db937ef4f31c5b63fcc62cb8dd7418c0fc06ed4adda39d131c782f19f602e46d66d7bcbfd447b3714b8343235d4afe537deeec0f961381629dc04aac1fdc2200b1b60705053955dc7643599fa8efd1e15fcdb53dd9ad1b008d5a0a2ae3902dd833efd101b79edb4ee14081364fb46ccf3e5c1ae678efdecf02029e67db95f625b845d2682a5571e332bca1b25cf0ab44e44b5cfe3c90ee175048f2d156270e2385c8aa828f6da8f2c5f7f6aa7bb2343f4b7b312711d0a4d391e077e8e969279022b38826a6255aedc261cb1f546bcb43c8c16e01b05a104ce9bf2e09e17acbd5bd50c6207249544aa3b44d259bb6c663ffeb12dfe8bfa206c8219badc5b8b684fb2cd0fa41096fffababfff1d135dcd96137092feca89f1e1e7d7df2d043e05be23804f796925113b62ada49098413dceaa64b62183"}, + {"0000000000000000000000000000000000000000000000000000000000000004", "00b4d3e45fd4534b6ddcf4b787b87b118eb352c776018b895bbcd29420dd2e556bbecc22e16c385946cf0a624c72df66a1a1b2f5c55ff7570c156955f1e0270a67b42705067ae8a774e425d831146938fa2b3762029250f617621b59a0971781316b926df1d8104c84082822dedf59416ad008e674ae5ee3b5a0e2f8ac56232e538b622a553f962943858ad02bb903a7e83b812fd5d24a7e926b00c55c348d8678bd8a99569d8d7201aa147b021f1729b645f2a0c146648dc98dce4ce92bc587c2fda470e18458131906e50eceabd8772f5c08b9f6702c8c08c4c92ff533116c6c4611e59fe0211e61dec8c4d4692d011487f18b61f99ace0d1a366b10130ea1f9d026cf376914a42c297359ea38fcbddd10886b0af48989ca6846634fe3facae519db2ef6f2144c46e48e1d25a94b251432322dc9c9ab67f91acc39a89ae25612e6dfa145d4f854a8813a97c3b6fa02041d0773bb5919392bcdb4116241b1391b33b2586619f9691f53e5a997f3ba43e57c763cd5265a4d946109d3dcc419054872ad1b45c0bc71527dd0aaaecfa50d0f1f6530919c1e9b339118679f37ed00b275ef1e08c89465960a8c495f0890b4fd446c482f3a79798d226af30c6e4ac390febde51971b52c71673b32fe9b166f2b03e1d7333ddce7042e4cb7b6333c025b625f68b464d30c5af3d75b71b811f96dc632992d95d3ba0719e6ef4feb170d81096bbcad7f5a9b33a39ee5bb0f24e78aebd9e320f82bc1e503d109c5b0734ffaf408835670395a50e7663988cbc6e743723af99f98b931d2a5922fd48afdced489c723d6ee62f7427fdabd109b5c00aae6451970a2737b665cba092b650be6282f3346e7b9f4fb81d4a23b56b1ffc8a784919fff3f237bdcffa389be19e95cf4fb8861759698585e59ce35a7bfe9611abc19d5cae62c834dccaa447cb3adae00fe2780561299a4ddeae15c90231c1e5f1cd7dac519ec931dee65529df7ba52d5732f221d62398c0edc169de40cdac9c90079af34e3964a5a6ef2c15e8a9b1dc3213e41e3ba158306d4a5487aaa5581317b40a007baf9c9fc4bbc0799ee524b02950d48b4d19a514b470ff6d06e20c049da97966bc76e72d67768599ef726927433eed5b22f9c1dc2c92cacdd41ca405713142aa32f6dea9214517959f4e1fc41c99b56b15d00af023120760391fdad4e254273f2ab09525dfd7e4cd40e632c5b1e5dad494711f38bb15c9c4118eb9dfc8210a6e92d5c094b952e64b33373648e4dd49d1ae6451c1b4710754a74ec5885343ceec5ca8561c88d836c074b3e0aa8429909a8c920fa93543f9c5e622444861b84325e7a153d3f3aa37233236bca55351b165e3638d4bddf0d258679f840e64357bbdb9ae8473ee94d42b5e40366d6221957333c72fdfd94072b5cfa686b0264d7b495f90669e9d0026397b211611d6e700be423c77c4603ee115be71052bd0ce846914ac4dd31f40886bfd878955c8f76a931b51d37e27cea0ac910f209b841da8461baeb6df803481ba527f111ef92952e0280788ab3d2946f098f938bfc1f12a5635c7684f256f56f9f7660374119eec6c341595c327a3d798a9505f35e70c72cb88da03a2975ac6250e2db29575206200ebe764072bfd3cb2196f09dda07b2fc35bc4096059b29df8d9971a7a554f3518fc3345ee3f0fee9c6248d3e000cccb6913910e28aa8f03a8d80b8d6940b083b158560c696334af2f1a2aa348ef608c4f0c4542335d6e656cc1803cc66557dbd3acbb1ca81f62ac7089d4e30684cdfcf4960d094288ff1d03174a5c7141d588757bf1fc0a34e6f93f3e6f7febabb5717b8e20b3c9ac27bc9d721903b317c7772b366313dbdab9621c33601da77fa4deb5bd819266afd522bea542bf1"}, + {"0000000000000000000000000000000000000000000000000000000000000014", "00312dad99cd5e1c8c62b13a4e0dd02d358019d54804958d390494860f4c356391717c36a521d0ac82af08811a1ab545d0439b9331128756df25f1b271b7c7370a474c9851a244ed620535b6e7cb05705f1c180a0a1d0486846ab9395689555f09c8c16b0b5fde1f5e1a9f817bdfd120b3b44c66c71a685ccf6d289e390410c755285e444ba475f34330857eda40f9d6912b1c17bc057b966db755e2f171f617a6bab4a0fbde0bc001c4c7c872863804bc7eb0c1adc75a755f59f8d05f71c5f3f0626ee9d1b4700a0879f11c573d0f1c8bd30d209f68f66f686984979490f6dc05a1af9a38e3795434f32374568fd2bd7b56bd40e035d686b119a58b19b848df69c9bfdf16e9d61fb8e71965c9b693a9332852d798ef8ecbc33a3916e3ba4d9ec2fc34df0cef28978a79114ec27be85383c42acec32151d3de419935003eb696d1e5a8dcb9d97637e447937dfb1c437401800e3e750159508b53a28e932645c0bfcaf83f7b10d3e6f44ae4d073e31822d4155bf55a2d569c8da813528245eed072c8b65cc2182253b85e3e13fa2a2b165f9aa681cf7e9db02ce1f722d38ed25f0fd42ff00982864b58c40dc0ade4d325a4c18b2917132b842110d7b8d9d29490cfc31195071e6a19f979aab5769f0bcc5f445ae6e9afbec281c04325296201c875d8d521b781efa2d4f32f5cc80325ac68213d3de14f20ee037dada40b9718fafd2e522a42320fb58d4f5d400c0b5474745e0fc5dbdf01e3936f2d7109c493b53c130d65623529717899fb43f0e45c2fe13107099b79e60fcb86c9e6d970831392b132c7e7a2666546747556078ba1614852313957dfc0840012e6d4d0842ed23a1217135d7fe4639566ae623acfbedff8f7294fb51126dea7e8b79be93cff1177cad3da668ea0545ddbb929de496a1bb2b113db6ca4f0ccfce6171dd7f969a00109ad04d9cc86873b385a86ca66bf3ae3eada64241641d8dfa69894ef20f689c941e29712cc88b79bf60112c7790358ee58cd90b12f6124f02a8ca8baa2a70d9d9a8a21dd2194f665b15d8ad29c55854192f07909085ad78ef19addf964e7d50bcbeaeaf6a6dffbde908d7524746a2495af12d94d84f31ee2dd63d9a07910c7df87668a9d8273f751fbf7b8ea496c809b003211043faa2b2cc3bb6c90d59e9f4dfba1c910717ab901dfa74f75485f647119f1ba74fc1c9678669c4d781bef355de2e22059a93bf1c2604848b77db23cdf430289f9c64c067c53e3f6d0aa79aae378785224c6f7170ec5e39f1e7107dc6425c0c3d1f6ad78b4b110bf0ca427e76cc32cc8b00d93129fabfff18104d2e4440d533f88aab9fe47d68373df72ec520f3ebf9e285513992dcccfcf8294dde182c53b7d35cd7a2a6ef7fe2e7e56ce2351a9b50d6214f499e16e85654c79f2aa040eab284fc4e07fd59416f7d7f97b1df17f1c5de00cdbd3670d11ca01aaa301b3e34f81687a8cd8078309e9b7e02e1d1b09bef63105b68c4bc1eb08b6a91920f7bfa2b55fa8876a9af28c6d5bf249f6ce749be904bd11b673c89e93454f35311aae135e7b72f417d004dbfaad6a928b9b2bd617a343e1e68a0c9a16ffb80c19c6cd810701265e93f442074503aa265cd8e7464c56667eba65053f28e015ff67e688998f4ebc2441068a6074d142b5663cfa3215c2aa8adcb44a08c13a327b91ac301e2503e44d96cc2ed3a199dfab9a9a623a289cbb80ec1e6f71a7c44f76c34c6622269e1ba5704cde0996690aa97b8cc76814d8c3cae4519912d207175c2b1a84b051e7aaa3a224212f2b05ef1d458918df6645bd8fb536f7d4953081d0e4bdb8647e10311d02772a79a16b6b1ac8655d39f8f94235db5aa1427d047c7a4c62ec69b1c79ce16c75210739129bcb42"}, + {"0000000000000000000000000000000000000000000000000000000000000002", "004d8a744cd98656cf97a3c2dc6495915197d72f0b1dd822b385e4297d6e61344ad8cdddc115d70f7c131603a11165c84efce2a971b2782c6cca9a5ab58bec19bf92cb6f8fe051bd1c781264e2da9a9e58fea22108c6359763855e2ba211d17a6b4f5c9545717d1c650ac81b2ea92af9878b2062ffa91c06b777b7fcc2241843e9f705e23e89504802cf9545d329554a2c882e562133cab1999884e686b68a105a9e9bb0027fe6e600a96b5e35c7e929f57900c2fb398e40be0e2a119a3f241f8ef5117e7ef672d73fb1d116f28b321acefe04d6dce35952be03d5d47218a998eac9f29d761c840539743637116577745600d7d57111034d537accb21166058073633249b0d432cb0d4914496cad52279d1e9814b78799af6b515b948969645fb9675739000f260be93760d96e6954ba5271737345476af47de8ac2c7a2b870b5ecf87cd5513a64721db230756bacac5024099519f44f6af93ff72d70fbd6c81a288b8f62405e6c9ef88cbf513a70920d012f26c760e41d350f10df6a20e07059d91657542e980f154a619545c8ce7450ad73e89961177764c375637ceb587103f9f3cc9053ad06c17cb01a1efd660bbcbf345804e119af64a11dff1017e092f6a66f677b33949c0b218973f3d1724b914acfd123c215a1f139451fc80116c44f62eca76ca25a5d85ff3bbd6fb19fc006f2cef40aefd9db50dca532378497555e27f214fb510c322f3b657d4014f965c4360634ec173c3a913854a4d43008c1de83f6ed054b2dc5eafa75e82f6ff835af59a20ea97a7118068d69b4723e885970b68f4705df1475de57ec5ed1639a691ed128616cb8f2516d549dbfe98843720c91dfd474b36d2608bb0cb93b33ade837982544f13b2175ff1a1cd5d8e071fff24f0f9c238fde3b619b81c1bbf31f0766a28bff542830cca9e260248fe9349c60165411ed2b204c9f604818995fb426d84ca73b1393cc323e49dde91a18b30657c976ae622188eb5693816174afad40ecd9b69d154305263bd1980c8ec11a93ef6fc7e8e143015d634b5be01eeef1368897f3e8212b2b6158c3b64abe03613a4c54ffdb4fbc3ca40f738e7bc94f814eb70f76583c663e79e55c9309019bd2d389fb8a1d99ce4fdcbc3058fe6fe1a96e5993f0663bac7cfb099e76924c496a6dfedb0260d4fb739e4020315b8669759930b37c1051e1e86194a9ab6c52345c8cc151fb1c805c62c15202eba4b2d57a794881403b54cb16ddf70973e41b61758ff04d1c67b18ffda05cffe86a689aeb8a5b840a2d2abb4c0c25e54f286040cd5ac22474bb2dba07342756c37e4e12d98d2d9110279453ad11762a34e51f904129d1cebb7569bee0b3f17e3a8e266f3369d197adafe9c8a928fbf1a3c30ee5d1bc5d6a2a3d34df8ca33d7ec2a95aa9c64c60397063dd3de1cef7460962c8e5cf1618bc4d23198384699d8e411dedd194b84abad6b9a0b4cd1bdc66c0721a1b99dd118fee67e2270a04e79e13a94750771483dbe9671121798d823bb70fbed6d6ef5ca9d272f0a8333dd5db7f221f0bac12a36dc81a44a9f9aecc10ad3891687c96b853f4175959dae7ba6db7b96edda1e970bc1deee0cd3fc4d120fee54d262f89618973b387a754809d8cfd75a61f41128c2413345969e19620ed188f3910ba51f9823e23fca7700189835371a8e32e96b9dc2ec336d63f2c50927bad752b2469fb2f1177429a5fc4d8dab04748483912b2c2d252b0953ed32d78bdd40e5a863a55c973260742bf69ab0bb44930f32efd0d592b9dd866012d705a32ecd27dcd34c753eedc2ee2a22fb9d8bf725c4c9527eb20cc4148a6d17d25e35b18dc259c6cc783abf5f5c42d25edfca7d1f42a28814db7cd2f5ded48caea759117add16225b"}, + {"0000000000000000000000000000000000000000000000000000000000000025", "0027319d33403e08c63db54ab050c0062b07b971951e2aeda6764d93fbb980e42c4c462f4d5a495ef80b04c79f74c8369c3fd91478677353188663877d7c49108063ccc515873ad336216a947347f0b20ad2c31f29e8f2104964cc433da6b34b96455d1ea947beea0537a38ee14e5f4eedd3ad37105eef4dc639805345d72c2b637415aa226dc6520323a0c4b5f160631406532dfe3287c19b127b8394a4b5862ca945e8ea56961704c0dae6c1de326d990122565f727cf89bda51dfff0685fb2db9543eeaf10f13f5e4d923e9d85e599a7c218d35b172e2b7ed207cd2b01dab388707f7da3bf3476be3640a9ac94fd2fb257b49c9aac208587dc7fe0edb9534d917d27efbcb55543345b546115ed31d433a0843be9be40ec9c13294654c768ba58a704e7f2e1c283b57c9e42175aecbb6032d5f92bdddc551260921aa2ce62b93119c9a947413deb09303329bddb614062d2ec1f10bcd39d477921b22ec939e7b2c9b59f958618457802f61e3ea7bba0e1c62eec31b741e94ea165ed666cfcae4f27fa9d410d54cf77d46b8cf0618179dc63e6ead1e7d7fa8facde8d6e3cb36aefe586706cc3e204fc666a0ef26a2d19e298bed14c8c8fd1e5650c6b90bdc55b77349896da96eedcadd9d5905d11cc092a7df135870c8d0c30b61bd04396af811ef611dc7349c5d66e323ea2573f808d171de43b6bce22907327f46cf8a9aa5175e33ac29376681cbf35214c63b51ce17b190e787fd74884856f36c1e60fe5f28930a1cb799820a09c11bfd33184bacac8a90ee760fc7134ac5044767c93751ef0406df5de772607c9914e31697ca06fe392e39fbce4c6177ef52c36a325e98856f3b36d230b00031a2a61964f256f21ec8f67987f519bf7398c54b2d92cb2ef43957f81d5a0b1fd913af19d86d47f1178e5310c2e76b7eff849b7772bbbca1012651fb46ac1117b2ffb482a15771df8f67fdb6c52052fc6bfd92cedaecb004da00657795b73c9e132301fbee6920eb25f99927f0ef1a3b42169e771b27643e09b492685d83239ec3b3f92ce0dc611afdbb1212081b7e61a84f2f8510f030cf5f75bb4466da7b537f2a397418f554f35b2a1c04e5f4bff55ec50638d3b10aca9517d41a6f9ddddec658725c2ea6376c9adebc4575623fbda0378d50aca4f4e04d0371e9d7119b95103b7ad01c0f5d7f3998725e7afe36d959e77d9cb3319cf54a18ec4315971eb40a1b3f81b253e837601016235193d0273707428d416ba51f2f1d6f46b6f7875518153325a4038977a2ba931fdb50774856fa6e5a120bd2d79fcc0e571300e6a7043adf89d0327c6a631df5254ef027743fd521f7353cc581bded4cd29ba92bea32050a5749cd503c431f97a3280199ffda14f33f91eef206de879792be081aba684a5e4cc2991208039d298085a593db344dd351f6f07996745bb56d66462e7f354f9c68439b5fb79453d542e1fa1b56e27605e09de43d55f39542065160c3e95cc21fb6dcf4960ede7b45572e3f3d73bb7185140cabd0a6b5300d1206dcfc4c1f84809bcc4a73e00b3965a58a6c4eeb361757d1cff3952ae76d33032c025935125790562d570f4a2d2e52209b6f864691a08bff02e0c7069bedbb4dca57060dd43d8740de07f2dad6090a849eb94c9b05b04cda950377881c38e5154fb7f5b32e1cfc5836186b9c571217b607f41f34d95de62e016dbc6e48fd098445f588d74783475a02fa681e1291ecc3573f47226615aa7752146f0502624af6c8fdbb3c9e5f91410b6a17cf90ea797fcc170762d37c67e2d5e55c897f16f06bedb51064028c9f8235e09e483ab4321cc3a013a4f784c9207f1f7ec3814614439b24638c15169246c8fa938fa84bff5d628705f5fd5fbe29d9fa1547"}, + {"0000000000000000000000000000000000000000000000000000000000000004", "0005cb49890fbbe1ed60872c58f31241d0197d915d36c3fcee36ce5936fe3c495593fe6157294efbb2330ad15a4a30041898f8f8311a7bab44e4adf259854d2b81cd035d97f65127526425c94bb10d6051d8e67c17e578e1f956e16ff1af6333a9d020474fea3e70482e024cf5b350a97b1097b371d3616391d49c75fd3d1db75ddbfad85308ebd1334600ec3cd37937fc4f6d2d52feff5e0e73fe756f2548be3793a1f2acd2477708fc2c5fbe129b14e02024afea5162017961b711ad31aff4b64e525b73921703ec302cec99ae1bfefa74131f6bbf51c99da52d7fa4d282b145c2b7897f8f661af998ecfe222005882f827a4b1a166ab013be084e09fcb705f50ab19922e4674cd070d6825e3ed37a4a1cda93e4b713208cf2cc044aa362e102bd8db9586819e35ac93348e06d6db689742174f53a81961c3003921347ab7be5a4013fe53b3e7efb4d7312e65befb7007b362dc0441d6256eb4012b4ba5f30a755777d431aec1583466277d92ed8e4a5a8bd01274b79fb437910fe81a7e8d07c02976fc8d9436f6d125c78355d201d8e0ef26dd44a13f465e41262f60389f58d76b404124d0eecbe09a59ce24a12d97026e984be9132ca9e3dafdf459f5892854387f6ba23598c62b24dfb43b812d118eb75227cb5fcb7c2334fdef36d23ac2b907e1cf18c92cb87ee0858bf65b342daece21e2d1b6c7901b756f29b83849c6d252186c1fc5824805cb1a4ec0539205e1f1705fd0f1ca3cb72b3f92a39aaf87d0d08a2b494e1cfa6d1226f856399d7060a80ddfce7f43bb3b2f32654e09949e90500bf64893589579e11ac063b5629fe59edfd4ff103f0727f84224e49f514e81c669497f4189af9719d3231f3b8e37a2c51d9f0621fb11cc7ea52e3f0d4b035070f318a6dc768fdb4623cd62476de96439ed38834bf3075ecfb44621f38c200c7c6b4f70c436ca208d2ce816e7dc710551fd681035f205478de7afd46b183859d29cc221583bb7b5413848c8149e3dab13a0c54306c356489ac577149282e9b3b7cf417ca54c1d574e10f5327b6785f5d05cd088902cfd7162c2187b5f4a5d36391ee0aacfa805d27173ac325a4943db540e442d96c14920313dd41d2134fc5131355b303f6de852efa7c1d617a77987edf2130daef934da0994b6b6657053ebb62eb4ede769801b8232cc78952c3c73353820566ed32db1016f37a3f4fff0e64d0a7ccab98449ac1c20fc1574f5f1faf10243be3ed0d4c78893f73d9004dfd9dd9cbfa192e10fdff37d492abd3001e26b08fbed6ce81425cb34d02fec35a1f9131637b15d1dcc6f5dfc28d07168d9c431695dbf934fa45f9dd277f425534070b257cd0260545acc333b5d779fe13a098f649414cb3c0a8f78a5677e4346b2668c3b588f87a947969822497f34f9300d523e4b4c9301fa0c8b7df825788db8b60de94f149c94e536bf7724deb14b74984ef6632e4cd997b420dae69ffed044793dd91eb570076688393ff3d87f86c3c3f70cd9bce09371908355ff84f32e52dbbb8bd0d4ec96000a40cbb5314d59f3cadf842de3d5dc21314898dce76e40b1b55b1f44747f867b137cb71a39c1ba15e7a3f74af47fb6962e65f4c1700f9b1ca5cd82c05d3d511e3dd55a6ed46e6e6fb1d1e065719eed1023c401a8958b40d374820e4c823eeb9af98bee04a24c2bc96aead2d0dfb51534ba45e97aeafe09fdedb0679e5e55cc957f3f3d7f479206de77d4b0eeaf2b23f7c82343f23ba876e863564dee452d1696eaf4a6507218c64d84342f132b791055e913970bd4c6ad22a368c0f8d9b936a17e8fd757e82c09e818dc0d4974c0aba573d8e8ea4a4914e027491d0c6e0f9d26ca6610e5fa24d072badbdc75312399da890090cc1f47446"}, + {"000000000000000000000000000000000000000000000000000000000000002d", "0079283d17c2603c55e540feb3fa41b94d64589c5901b69e428e54993bff01e0712e7b4ddd5a778fd98b00ce35210c0e69b56172506713c5ec507f51d3bf390191750d1522112590a260253b879be5712872e9380ce782bc5512e64d05f25423af49c751aa1916ec68198faa507f9bfecfb06c12c4e9a08e8d8c01f7c51c1df9698d5271309de07aa1f6707c7341fff9fa09652a153ce2e5b1c9199c6813304bc16844f00d90531400ea7ce7613377cbd2dd238560d1c7018926dc278e11fab1423e98e7b92dba524cb5e7ecd2646518f3c314f7ec23fd0e9f4525723580d7415de5afd9f8afa73615a658388e03f6a619845d974d1b353d888bf77e027f885017d30365c078e09fed11f999372c796c1316a99af4bba29f1bceb96cffbee81f2b46a9bdbf2f2ff7c6c98e2293b7748fe383246b658cf67d7060793dd206a4fe91bd4b1c8a48d30e48269a597dbbef150439d9c69f4780be6c5d2cb7466f27af4ba5da798b188cf32f686ecd81a907e8844566698232c9bdfd2304ac5d231eda4a68fdeff3bfad3d39419cfb9a059832bb2a00e7108d6991cb36e5cfdc9369eb7579d72604bb284e7143d5007243f38dccf99fab29ac1e767c1078caa048074e123f95fa7b4ef1de06ba4a5c81c8067a61c613aa83d1f298c454a5bf84f24c40bd0ff406a04baad15b8b8ddee805e0a7b0433b68eb5eca3f0a35a5eff9528523f679182aa5513e9f6658df6411209793cb309a0a2d33a0443ec128d779543c9ababf1728473f2e1227b56364523bcf74d52e65e4be1f7855b5b5646c597d5d540d955fe67b7379a39d7fe6b010d952496990a268c46fe32b72757d50d2c166bb4c176599bb526bf6b9a592a5ac57d4edb57ecf1430ce14ed354ddfce3ddeb6ef91acf5c192c17870dbe2141d243c4b0d4a215b043602211030cbe8a2acdb2c05009d28a21e1797edfa45b2a63fd25eed657036cfef56b7ff01371da8a56ce0d9599969a95adf433dc2443e8bace91c54f8d1ec58d547f4f611f6c6e41f149a467c243067e3567b3e5b758b6ddc8097ef941fe489019336647d54e87fdf45d490dbed6119ee1f1b80412c828e383cb36d51a137838ceea3b888f5cc56fa4212c2c514d65f4c09d244e3ea84c5254aa21cbe64b920a68c0c38e1e0e77e9fd2e7c86e0e08e84688a129030bbb3970c8f6ed4d4860fd9ad4f92542aad12e23071a074cdde459357c03534302dda1ef3fc87e38090c0d61f823e98f2bd99c5570707817d5cba7ffa7ab11397e955e5f13e12a32441ba47a64166daf56ae5912770975444d3a39137ea35d1e36353238443e41ea1ab56f20fc07b71147eca273357b2bc50046dd8d7016418f1ec306c3be97668236d596d18d4fc70e351040fe9c828a6ffae9b608b622f26df589afa576fa480216a86f0682dc451e4712cb994ca6cf074c1a87130bf8caf65f4ccafea49b70dd5bcdf0a4554670f3b014dc5d90b05b8c1ded9955bff2efaca3879e5f9cd74a75c76413aaba61d797c57044af0352c8d8f9d5a103be323afa53d875a8ad03a0094a8d8f85ed1d4a6505bb472ac8cf7252f609f09eec7262e3a7abffae0905ac7afb3f8881b1b00a352edd3272116ae6ee2060266e99545a938f3cdf45b47ce06c3f755d37cc912c03c100225f362ee3f15b817c11128d1aa209bd51830bd0fd69b7a4f7ab7d57b37f9ae4d8fa344196f1cd249856dfa24f7e23bf14fa83ac54322efb2bfdb2ee2ce466b12c52107afb1162ee65ccf22711b5fc793506f8e7df08666f67bd83c3d4703eb682249b7a41630ffdaf0e04dc2053f298a3269ecdd3ad563a95343f102c8260005646f6b4499372c83e6e19e539db870f143d30ce549b59e567d466f1efde59625eb51a5b88"}, + {"0000000000000000000000000000000000000000000000000000000000000076", "000be8f3069e2d41840af4ad792af3ad9b316d18f429af355677e4cae5e224134bbf2eee21c2c331cdc10347b24c4af87f2bd477109e8e57272d5985b43c621feaa6af16ea2c31a7faf36874d32185bb91fe0aaa0e450eb4b1ccba1e7a97d106e743bcf5695b903e7d426c76ae05e6522d7052068973ee5a2dfdcc1507c23881fdf5759043ff8992672dc26ea95e3aebdfbe473ad4cf0e0265bc4d6b7a56bb2958d71ae92b588fe003e0472aa762d977df0c62b39d51819cb6788a316816f54bc6e998c03142b24262d0eef4d946e68b9afc0e12fd564f18c0dcc71ac3fa3120d91e284ad337285fa7cb530eb570aff3fbf932fdfff0d277d39ca5ef0d426aab3649117d9a58d31c35f62944f20afa428a194e748cecd1e4e6fd52f4d90a63f4214f62bc8d53159b294f2948c53c941d87b7926c38129686180a412e5b74678694ffeda791f7e21fda9b637982bc405f02a56c2eb91b5b3b566c31acebbca57dec4259e6232ee296fb3e4f098786d658302ff26eae10c71554b00b2246161450f5d187261376e2b1b19dab5236ed6d0e27249a62315145b093b0ebcc993e044f07ae291004585d90a75e46fb4598f49aa76ee252277999ceea0fadfe35760e4121c62c2785c67e008a3e74f220c80bcf21ea5b08908d709aa2080516187a4723f3dc042502834dd89f8139a45a04e0365226699a37bdf495059f92c769722f77c94242484f14bc96c0aebb9a660991cee144daba431c3b553622cf2056e586f80c4d0ed3fdd1e1b1d991e74d12ed53d773ee18c5fbcfe1340d44b58019e2356112859958346c260ead90955d05c8a2e79f4272a66a2ba2577e3f889d41913baf260b2f65fcb4d70bc8ced173180938243af1f39c4a1914d8b2221abe36cdf7f431c90c51dcc8c78751c5161ffc9d4fa663927fb24205a40fcb471d7325af6dc2002b46c3f74a4ed931d360f1acdf1756daacd7661f1bb809889ba6e6e3c3ec22700f1f65658f7492e50410a7762247a351cdaa4962680aeff6bceb67ab6ec6113a2f1c5a0ecbbb0066a7bca65c63b2a0277faeff069949ef496cc4e3ef5ae13c33af7c95aab3f4e58e4c898533fc1fa64dcb86c97ac75982bf5f3b9d8d8329c37c9ebd4b9835e708690eb36fc10e614a39384738a59f5cba928edba032b3f68e562429b2ca1b646e04df77be0909c2fb3de1a11093c427c169c076da00222184e01e4f7f48ef2dc3c668ab34bad5f27a64a408052a85c15b91536a220208ac5cab01163b6dc2662afc5663caf48ab7be83c2ee3f4d01c51fda36c19c1c35da4c3388e2a728c4d23d7e7531e3e4faffc53a40e8679b5497fc411287d42ee355b75a15db31bcf72396156c68b3d115d701180fc1e3a3fa5a7ddf95b44082dcf8ec26dc1d99a2251e7b7c2f168dff9bf4f40140db799dc152075a7b340d9b4b879126803f6f65084d17b4c32c87a9e60200b52230e91118c371ac4f22ce5f2b53628f5d704536f9a350b29ae88258f3f131565bbf109e43815c2126383838d9d6134f1e1bd602e8b678b5ab508fb741809fe7cac6c88b7ac4eed0117b867613c825a8acddc1f7176765ccb1848c02191c286ba567166fc57086e2d360b92eaa0a893b89812ee9ef58c4abf841c2bfd3c8dce0a3ca41a91c0d9d0536d45e2742d395be42f0d6e890928e42d0fd27dc084fba52388af6d9de6ce45816bc998e44ab589aae063c3b9ca442012186cde20abfca9ae536effeaafd192427d5638d3cfef1fbf2b455acb91d48fb768e9a06c484d208a9fa6756e385a917d814ad8e2e7599d42c53d3beac1031fd957f7373017556a60f24f3ac4806ea5a3ce5d4718b05b7454b524ec97aef1839d39e0e0a07c96b9d0023ed342133abe0686120a35d0a1a"}, + {"0000000000000000000000000000000000000000000000000000000000000002", "0014b7063799854fb8a070b8ab2921ee9d5cfd845610453b2c681a443b7c8222afe24c960f25ff5a834107187da435d1b17f1976f18867d74c629cc81b9c143476adec85aaeea1cf7746c5d4452e0b001c5b495b00a3c007124af6472d1706d6467f7005f3affcd9de4cbfa72bbb56287ccdbb45b1bfdd4b921dca1d25a70f61da071fc5a7bcc48187a7487ad0c645e79887d41524d6f505b021abf601b2452cbd4a38cbbd48e6140083843fb7c9643ba7a5233d667b0aa95029718c042a692b770f6e6ffdd52555f97b704d3f054ebe1cf21306fc016e8fdb4b7a77f7d7e053c5aa858bdca429286aefa65e288955b7fd456091c4a2f204a0ba2c7e021870e50fddeee713f9c1c002fa9584afd02876e907d2d2ca5d635a056b4f108b57416d1502def186c40ea86a9f21210e81c47993b06668a1ff482b9be19b1101b6c3e10ec7ea94f6a4648468f0059832cead50004ce3575005cdc86e9e52e0934ca055e3c87dcb7f2e1e749fba91102d1fae252414f4de76042fb8bb4213441652a3cdd37acb2f92a0ea361ee8da2f9227351f03ad92a5b1b2958f95f5b114597472c0da1cb325043da101088f376deb5d32d407420cf9ad02b385833f1ce384006e3b2df0a9664ce6e485e7143f7cf3f40834b687eec385aff1b243d8d33485567e55bcc24b4b3ede9e7c30262392fb761151b7ca4e6bc19e17c302582bcdfd1573b1ff82d3289945221cedf6cb042e2501563db625000979ebf7511df7616a1e823932590587c6db394a7a5706d752f6db6e0944f738b10b322cad0ac02e50b476d0855741d9d2e12644aff780c504115bccc07a9d55d9c0d1c23b299639fad516f9fd2322ab81599c7f95ee2f691db6fc7e1738203ac56a052ecd19d7a9b647e8b8229595ec4606df711cba8907b54a863669b9c952ac84dbb2f266de83301c647902f08dfa2b0d8e777190d5f015ed98368f8e181ab407d7d16e5652243ded8dd2e23d708b6d43b7501d2409151a368197c798d3abb47d96bf4119fac1b3fdd775475cd333667c8dbd04cb207b6ecadfa69b9d631d06643444fc4e9d089844e44c5125e04d2973d5a5271c7fde453fd02cefe15f14364141c0416e08ce9a0d0a8a09ef410e3e0ebfada580d76270028cf4177ce3170a2f55ec61eae35e19e61f276524cad3bebc363903965ace871b4f1b508e33bc2cb01c75cf2754abcd0da88e17adb0bd9fea4b647ac87eb3826f6b38c8011c98f7aa70d9d94d123bb2b45f29b4b55efb7ce23f2ec47d4473af6ee7ee28e52d1c3400c623ed1c073016aff96e8307ca3753192375b2d262a65cf8bb532c4a164b7cecdef1a542556539ad645aa2a2f7bcc6f519baeb84818d13f4ab4383ee53337d47ceb27f2cb449a4166bf1e4b8c3b740068dadd13161d8326ed9f50409073fd891403af49a3087b004c98998e21ddc9122d991de070bcbb9f33042e503f3c8c8ea5f278f0f153b357a821842bf62ef329fac24922d9bd0922e842b08dbe58899092bf49f138939f04afa8ec199a1d5120bba186f54d221452414f06af903aea37fbf0a2e5b2ee323096e2407e20669ee4fee91f2ee4b9dbc551e3252c770506964afee84c74e6b845de66e3851852d63fcf49bd7c24d819a83fcf365482f8ec41c959a0d73bcbf4252f90c98c112b2eb4c0641f0021101fd120ec72969a0a63582e454b61470e919df059509b92f71c6e3290ddf26f8f7c68fc9bc33e6135e354a4e30ad2190f111c709c04d2707886fc7ef471c1dd9ef10ffcd20ed8c351f614a02dacbcff7f7431eda65f43cae22c1fab2a2e3d458053b0243a909bb56b0126e2064dfaea0a17b194d1c62292b1ac294b71670c84345f963805061687f8700a48004cd0385dcfe51409e"}, + {"000000000000000000000000000000000000000000000000000000000000000d", "001b30abcb837a1ec9e513cf6347dcb1de621eadbc162046dab8d72d25a74d148ddafc4a99a276b346380a74b0c72fd6a43fd56d163d7a6e3c2998a0f7a5152b055e1aad13e4eff8b6c5a8d4637cae54ce792f4e03173f7ccba5e6777f129548b3ff3755557b1ddacb3e09d7b549130021ab7263f13bbf90ef53285da548052023ec4bc3aebefb9e733de71bb0d1adce90fdd50849c8cb6f55eb2b6e81e29a5ead2c1d91dd15ec8e005cbac67c21affb2b91e0ea71e59e5e46ca53217a0e78db591310703f080ea726f7ed466637e0127e781f3a23cc8a67d1ebdb90131dd2ca766e76f215960175be87f113e22577ee3db7dbc748ba6a86ec1e31671f358628e291baa4ef502684d947eb92413914c8662e773b9b8f66c591c477b416b8a5c5a14b3c4b2cac2e221dbfe64f0c67a18ba97fd374393f44e61d99a14b9156c5626a8b456312e7cfd5c5463b65d37f39a5018cb353a5cc6cc5e5cd83311acfeeb5ec0c19a02e0fbeb8faa1a7ff375f42610e0fc989a557293d68061458e318f28c9ae95a6db7365f700aca89c1bf72622b21b444f558acd3244585abddebac21c53c50cf7f02bebe2be5d4c140ea03e6abef6f22bdb485182de4355d1279cb94438902df6853d65e10ae9c49dc7d2d1d15c152def826a3eb91f79d22f7439e4bb43f67424993ebbda26a8fc58144f556b4482b25d8f8bdd811027713cb8cc691f18c4462db66ef39f984f94f86db0b9a4725d0139c616eefc42895e2954d9d5c2de5f202aebf36e9ce636f274ce327b7e67e7f038b5826e1056f58af8edd4c779e6a24b1f9d2f9de15c11e9eb902c33ab3c809f5e470e63579cab87d1d7b9c4da16e301b7acbb3589f5cecc0895814ee80a2d80b1c02fc087f7fae6730ec41b57dc4aa4c71eaa53b2e735e3418183476b09b37ff8729a5c1d7402dca8d96daeedc00649f2fcbb207d1e97d224dbdbacfec970cfab2120a88a79c990579b7607712ad05a8444674a3d775b70248a6fc3262f269fbc547773d4fb9c74d24bfc54e3847f5e2df5bf0bf076389d5b0d7112f307dfe1a8e0e160d99a305ba7a7125a2fb4f78cc72640f186ced0ffd4c494b143b86b82894abe5393c8562d64dacd318a2c1464bdfa797dd4215395331a316db7e5a4e5d1ffa72b60952da1ebde6422448227d5dd744b620a701e6e974ace344d38a489579a3e09281651bd64da532da4eb018d4ee28f560f667b3d0817a728d741fa90cf1d992a08fc1c7c9b8e610194e174a862c547b201d83f70977081e3050a5c558032e6d8b88443c7f390304d3d27a0b2461fd8c11f743d5a26e03903854ff06b0364087906d6e938ce4dcb93437016aefb8f4fb04c44bcb4e977f6156d00385b93d48c9e057eff9a41cc678fb03882b897a6f321d213234e60041b0b43f0092dd7df978e039dd63e1ad6a50fc816d0e3639b6054e3cd0b8155cd4ff0b32f546188f2e9c6256341701a045180f6b0abf5e7db87ba9ff9c8a61f21865ac0f69f6341f5f5c756d5a067a03edecdf4d9f9ed483080e79d84d42a39359c100f892b17d186c5f89995b0b7894f6c161045d2798f6ebf1e744e6fc9e9cadc71471a3a9993761c9d0af8271a93c6e2a715955a3d623d03e6cb0a9e40bf337924e63161df703ffbb1b8b0284ed74a1c7e55a77ef51d584229ceecb747a929d32ca8673e514730dd1cca3572f9e6efe6341bf46fe1e2597c10c521b718d46f2b4811b7a20e9492b8741519e2f748970a1b5f40b06f395f31c5a116357a8781e40863a066ade0dfabd191064f47cbef0d07947d92360fee6c9ed41e9d401b9597e7d3c3ae0cf9dc4c352e6a7a8c92575338962989cc2f727b29f41352f0675c2ded18fe05c134cdfc8707063f10f246cbb70cb"}, + {"000000000000000000000000000000000000000000000000000000000000000b", "006b446880e0536bf7282041cfadc1f9f7c8b593670178892734551c4bc526549a90e45d7e8437f5bc871a58ba1f9ef95953d9ab929b024aa6b5e7e4b2da2061843c81c99ab4171f4d7b0893765dd787851e31530121274cc34eecd59ab56593b4e27cf9ccded9cd5705de9064c756c46949010072a0d40b45f45099b024244e4da3bc6c718b98a373abe258658a83331693ecaf2a66ede9704995c7c17cfba56969c3b89b5f5ed3022ce963a868204f7751117663732a19b5c3db43b740e627433a59d8cd684dea348f60701ffe88bffbd907a9f6626c4ab604663e47cce56eaab672937b77aa270bab062fdcc87b4cf413ae5ba40f430e787897110f6b7fd9c976801fd29252bb0670fb655e16b8f57c1124ed7636c98a0f11d1d3d813a8e835dbb5de9b201f3f870317c7eda77a1c2679a64d746dcbe73dfcc0305ce27cd51876ebc01ca51425336ba1b01c2df25a0160901ff01db14f47dab6890ec16072cba8fac369078c13a1ef4385b14dcfd231f6f817d7a9d6dee1311b755b77be9e1d7da78454518e6f9352a2d07a9713561a1ad95a3a1febdd4786c27a4422f628ce938b9a05a2e9226fa75ef16ea07272eb950ce16434781a3a0684dcf784e8e8d5c476287b6ec7c1cecb07b9e9e106f2360fd553ed03c5544494d06a73aaf4e39fb24d2d14924b2b8d8dc8cd8ea6eec6c69b5f00a27caf840d380df3a4633bcbb98bf1c333c7c71534d8130e2211f11ac0c65dd81f55349279dc42cf6a2d673b302e0e38ae9483cc0441ec6231a35e17a0346ca95f3cea55fafc801b23a28bf2923713f15eaee677811cf56227ff924d4bd490dfbef8a85e7a70e35e44375e07c82dfb3fd9517828ebed9775839bfa64c68a269c85433908920f97966442e0ca97371cd969f62a907f788656f73f39bae574e764b777fc546d809a29a4f3831001366f9daa10fc73f714c105ef3b19fd062e9650071c557764ead388a52e65c53dc0c23bf56f883d70b507dd72039527f73ff2f85541ad445136228b5858ad14df4dde44d481a8d6537240a566ce10ff21f6797b0b211d5876c84a369d07425a81f06d2a524d1930c564d9b4dedbe2903f7993278df7fe0d1a53a8ddc6fd16aef3863519dacb822db6b50b652d15b80a37d83d67b0b669285a30b7ddb6a81be1c8defacd56fc916e0619e155430c47111932a06fdef6bf60217b5a30211b1bd3824fc7eac58e57c1de4b5cfa372a275f2eac0d4dbc81f0c797dfc59b02d43e56ff6a64209a5de423d86ab7d26a84ef6cae73cdaf605bf2a4ed78017c0bab9663f92ac3dbbdbe52c74eda756d2510dc6e6b309321d901a7a303e544c63549cdc99a8c977ae85a268e855ef7392fcbeb00067bc360aa26d46558171f3dd653399ca8c5a164ea6735dce1609e564e1b70b2042b7decf73801a9c3ec4289d47ad1f54cd131864e4001f4957d515b0f0d2bb9dac9dfc02b284d3f2cb904d19bb12f433eec96a661b2c036d5fb90607ef43929008a4e2c69c8bfc6a1451d0bec4c2eab3e7937bc08fe69a585a4a26ffce823b949ee48c5131434141d1923d4fee324e195b77394281f2a82d144736a9aee1265b74e5dca8f2bed0c84d32f4acac9463ded6857785187162fa7a24ff071e7950a67874a0f71f1b117053f8d55794e5f69810530e6b09f1370a97a776fff0a3eb48b215c434d04e432d7a2583656dd15b7fb3015ea72c743da0bc2d35582b0182cba8d0d1b38ff4a1652fbed589719a0fae072cb9dcfb775985e746e7212cbdf6f59d73cd55d8505960ebbed79b82a31f375338e47e59f16386aca4297ed2864e71664385579241867ccdfad8b6d12c03564ff105b2f69e76d75aa73240811be6f0bf0348e3152e63c402ce70b9f9907f0"}, + {"0000000000000000000000000000000000000000000000000000000000000002", "00207482d20c9371ac8ee33f6f642eddeeb13a74e300ea88538e0372273983b4bdf5541d1143e8705bdb0172a69593d236b3d492712ce2cbc76a1a5f3b677e47177589a915684d0b3ce731c9c135d2a67e3ccf680177fedda7abedef9c20a6473556da9f3e02bae08d1034cab60135c83fbc42b38e8b1e840662179519e01d803c6706a80829734212cdd93b05c6ef5d9a44b11f770ad4a547f2e4554ea2049fd615ad9b44f8b87100b0e226c5d466eedd306047e51443ede9c415a9bd0a8b750dfc7c76adfd95f25fdef595fa26b814ed830d56fc51119cbdf5f1a586d024424b4e13bd151d9716e5fe431e6429473ac06428047c1af6eab4178059012913276775752bc70b73fbd0e6015dada77d90bc0827f2a22487a2bd8baac29f599b7fddc7ecf9ae9f2684cb7f52cba2bbb0073604ac58ee9e11111a76c3334adc491e10999b7bf9c7fe79cddcf6959f3e1a73012c79f67ca827b1a6ac40cd143d1bd86d9c24d9851b79f3fd83cc9e8393f4b22fbd56972c8ea8b26a151203a68ec86101437be57427b6b2cce152809bd4e21a1fef9e6a0f8d3499858a3ce6f1850bc1543f65b4022ef6caead06f0bc8d5b2f70c99f4f50ba25a7af20a68d20edfcf42df43bd92a956f9f89928b8576f4130172db37c56c1c7a7a735f895f2a0f22fa69b4fd635db7c370816bb97b94ef5b75ed8d68669179e0b1d021281f834782053fd6898a4ad69813a2a3134de45309545ef9ecf6580f154d38e807b48263583bda821097f2cc03d62f3b9985bf3aad6e1653a2efe1ef4a81cb9d257eb104c251324762f28d72b422cf0d6320a0615bf644201d54e142148be07cbcbf22fea3711ea20557d8a4149a909f484e2821995f24f256e99bb2409514f15ddd6dd56c74082d509988fc550f53b508009e226fe5bceb005d76d8362c9bf6208db486d4bfa0212559dd04261a9b2b6e8e24178f6665e9f13949002a120dc37e6e76f96841180235a281cd454da36140894db242c0a2cdc76b812abb0c1a0f662699d55690ffc0fa7d053beb0d4ceda0d11691cded3aeb91c5e0c353966468c7c67466c82908d3a1872fcc67d4eea23458f421f53c4896652866e016f3f079b405f74921e44e8faa9a22bf736a5359ac5cc7346cc295ff07e20889d2c26efe4cdda1d82afb117b1ae215bd564b3072d34a05286ee6b9cf711c2d82fe35da15a8d9b4d379756ece560328176eb1671926524ee773159544a1339a7db5f5bf619a9e9e6e599f6e61f2ee09c8b38220b2d06e1c9b89f4e3a4b4730f72faba44c3de68c233d265ca6498a8fd754f379f6ed918abefa373ecf27cc4b0e71645227d92218468d64c6a70c59f8b91b36fbfc74d7f43b2ffd9a564551b648124d013f9bfc3f07024323244e396214f48096c203aa368957e70505e1bca107c5765ceed495d96cbb77f39da1de565f1c177fa3de0f3c2483a6d22da66f1da6ce81fdb0d00e6f25e9395f599d82ed91cae2465d3699d41adf0a16f20ce21aae2275a2992871b0f5cc2ea582558a32108d19b24dcc92e55c1e8405a72c71f99bc4f01dcd194a9980b1e3f015aa4ec3fef94b95c27210d49bab1aab8eff1f59f6fd96db59068cdf464e7d8a3857071f4a25ef889a61dd85d5526bb1d2ce56979255084c1188b51eaf1b8d950330413a76298684589610d02646b1d4c840f8ccbbe4c928b152ca67f677689bcbcb22a547294fe24bd9b006a4c2de28ede976128d878a67e64e7df22de64bb880b8917dfb3b9b7ccc1e664330565db410a0154f5ef82b31c473b0ff784d9bfa305f1c8cddc69f4da752266708acd230f2ef7158e19a3bfcc647edecf4d7c85c08b767db5e23543ffc04da43c2f397fa9c973536b2c5ad78479c097c517698d4"}, + {"000000000000000000000000000000000000000000000000000000000000001f", "006aa79a0aa0efc9da0f9172f8430d93917c9dc6e6176b5af2868871915b0d435878e5183de2791ff451072acb90e4052950aa82034b324823d60deb98e5010b741e46fcdbc6651700911dfaa191cd7a08b377710a1d5584aa67b7cf623dc570d6eb10ff483e9a5cdd1bb11c9fa9b4cf77dda3b349a5dc1125cb2230b23523d3caf9f58aa5a57d964549835bcc736b81bc02cd26e4b27c130e3434d2af0432ea23ea597c633145dc035a5b45325521c0d3df51a4cf67b7064bd9ddd0bc071da705ac20c65907cba62f8be286069a52fce29b0e6811e3568dc9852416e2d1a7b1b309c6759971d529eac7a373df38dbcc67c73767ee07bdcf11f62d35096bf6ec0ea741c9ca3bb875bd5f09423a66fc29314146ef2a5095ee0ee74054d9ce2964962878bb115e0faaf5923c06322f85e7a86df743d0827d481632cb5473b461b6ae2803e0e938e9d1efb596eff4186e94052d2eda984630ec5f6c243862b078ef8ba71d57850ad3561735c507b1bf3ff3b567c213f9631375f98c0de462e35158d775c01ff1844dd0c49e31b713aee155f96d1844b90ea5d1bc569cf263c822e08e3903470a5fcc948a8712c7382815cd3b707d7ddc72b103b01ef9c2d06cfbde11df1ef3c875d04d756ea6d275f7210a2cd8212619cba17f88a0836cdae6c5f876e7e82b37bf0fd30d1b00f24f1431fceb35c2601b9fa995075cda962a0f2dfbfed4d5af8bc2d62a97009bb98b111e898af691c9f09e1f425dcfd85d221dde5460ef395c67cfb815c993f2f184a9f3f8f809cb88f64f19489d0bad2e5b74e95b5885209d4123ca667fb3959d0c99bbe41615c8eb141dc3dd2d646131c0dc523fcb16b42b76081a0d5fa3c59567a859e422ef38fe9a102477ac899f0e04ab02c3a41569b9afb50a885ae81d26586b0399a10dd9534043c59a2d4c629b0336e69f009e9d2d5cdc72f3344ae048f32927f35267de420808822c891c26771fe941d72c4cc5406f81d2dccd4f05af7ef6494db39d150de49708bbece206bddc3a562b3b718f071818cbb9d6a5af23fb035a3bc252e0f006a14d243858eba79d6986ed7a51799389fbbc5f3a35c6223c13e83acdee58fb9434f0902b90775d748c08b149c58606fd148995126675dfaf258369f34f90145391076650fbb16c5933456d23f25172b96e0cec0aadf8705030c2df878c832438de51f8cdf64c91480d1316e7b4db5785d2c5281725cebf4e1386b1da111862f4d8959a157eeb0c04b6ed2958fa1b25ddc5e727d4fb6a629cc8cde6fea47abe6733a3268739aee518b77b08375eae810ff7d4c24c3fc59a50fd58a99569aeaba38ea036d31e417ad6c765019726ec9bd042229d55681b4df6d88c4a532e5fa36955fe07bdd21024aa4b8e9faafda19f32527bfb2753adccd8383c750351a581f0d14edb56d6333082c975d2abcc79f4e020aa271850d8aa94e7fc15a9c1f3b0972474fe7d2304d057c43102bd1aa139a252a4259ca53cc40a34763fe9fca1d866bc077a29189a22c6447b0a529994c2065bf9ad7106c2afd50af6815770c6ce016295cb0116361b63c5cb6314768cd1cb77cfaa35e0049617ca0a667b46ab6ffd979cbbb882fac4cf0ebb5d1d21fe1106d89936992d1587ddc55cde366f1da92b6daa751002f9de3a1c07bd2bf302db4d60dca5f09addcd481583f0b3bd9dc4a1d4e94369004f232688357de1d52282f6054fddfa25a415a24ee7d12fc4c1e0c6c7af4221ab7193577436c784458897e5ca22d3057c5f761c67a35cbfd22ef5e20c427cbeddfbc6bfe93d3c923d50bf5544dddfcbc19e33db672f6c0360d71f721f2126fa903e25217b5d0f12dc58ea3f560b279412b4313cdb72e94cea716b1ee5a954d289fdd9d2b658f1"}, + {"000000000000000000000000000000000000000000000000000000000000000f", "008f85222f0a8177517b716351943994c6f586e0fa0fc66377010f7806ea2807bcb4f5c1764c833c12dc0d688b9a0b3beedde858e6317966e91692e0fcf971377d2414749472136ceea64fb93bcfbb689d5e96a500c146659345f881173581e131adb3a8d4e1945b84032b994b9885d71e642883a3bca6a0a5e47b5fac7408509ecf6a7710fdcd4a24788453df8a2e49f40b46369cbab31c22cb9d8223c53c9a731a9a8cafdb3e5200e86ef703345e5fd3cb52476072573286a8fd282d07fe4929024bcfb58952112558c55f5850092f78161aa6aa834954295904f333010fdf28412c099a84a14a3c3ad97ba16a8d43ceb573177af8e77c007c7e42016d35d757430afd68b0c6bf3cfde3d23f2032d37933cca5c22722f0176d6d79a30bd5e66ab4767d77690c3a87ea2f453fef8059e44c46c47bb2ce12168f9014368d35e057d2dad49dc4512a7b66169ad3bfa84c0266ae5d38cbf7b0af2631a22c1a1d148faf093f580a782e8d63aa5069e2f3131b8729ce967d329b8e2123392567201233b2a78702db646d0e46366c762fa72955fd57e1d3206f0119d5d97545cdc289b2962003028bcaca94c5988a795c932f8265d6222ad9d6f82d16b81789679b875b378822bf2d60f8e18c8df2c9b91a92391b8759ac8b204075fd7eb3de2603b9bf13ec212d850a5c91324fbfe8f2a519a0bf3a77eb7c8e3903d5b1d04942a2368752a2a0b8b54eb726de3fe4f82f92a2e564b05dedf25713bf202eb1213ebed681c8150b5a7a084fa1c4f2fec277d4d1fd3163873fa39e33a7cbb7ac1c5411ad068a18dd5fe612b2ab5ff16a0cd7afc8c00715e1686e80e5d314b57612823bf5242a67fba3e4d7bf53b548332f1747e1eac997fecea729e5076e79d1057897c4b4ed1c778ee352917a9f352d1b8e316f7574b7c3d922d281cc35313e44d1f69d0396dbab9c92eb411f880313b1d85fb59cb7ffb0e536252d76a7dc7de1dc8935c7185eb09b0b48b97ac22e4b2e95ec165474c936b5c189fdab4ae45ff9057b35c2f7077163af47697716c5165d4499dfa998ee46054ef0c5fb175a69e50873b451454a371b54ffa6841001ab4c466b8cb38869f20cf1370e9982c49fb7f6221d65b1f6e42581a3cf7295b418eb40aecf77238031c287f2a20d38b9eacbd4e7cc62b5c5a10fb9e6ca0c072964841c5b8357e2b508802f808e1f76bfccd621b55b62fb4a0ffaa9dc46d4a24dd035f0f0b52b550d4c9a09eb0d1a7c869e05a921d4b6638d76bfdb5d2b707ae2ac0c56abbf8a94ac9ebd091b0ccc7f292114e32f3f8ed45d51a79b89558bd9d3fb45035c3b7f5c1ced97f262e5219499b9e3f7f8436af7df39a4ed1da362249e07a93a451e230dea9e89b57666b35f5d243d9e230a0e730d446112c6b4a1dced3d627e3e8e072047edb0671c7da30f325e69f97b19e7a9bb819622c83d4d0be39c5137a8a387b3b29bca9ab17e8721107628b29eae163f930a42eee1ad655a936618aded1633a5fed853d957a2c2545360f0994b1210b8d5a10c99527eff96dc3d521b97f636478fbb61d8bb69c35aa3e670662f1b9bbe7da6f7b6bcfe7e21509bb5ea1d4ffc3ca0c7a21e4adb68d50dc9a7d715825f545a1ddd34e2752ff791fcd0c6971c5d51d23919b684be08276f13f00ffa873790d249897b021651155f07fc37353383e1e5f3a9b15a953ee6be307aa344fe190e12991f0037a16605abfba57dda676ed2399672b51580458cfa6cad8dfddaeed8dcc2ede672d82e9cc7181ac5361508a1e5b9c872e2dd467fca391e39f6f0a01f1721e99d9e556d896b635d8632d760e2f078392f377b62c4be5f7819d45db501b37bb49d89dfba39d83f824c5b2720b9a71422545492675a19cbdffdb89b"}, + {"0000000000000000000000000000000000000000000000000000000000000000", "00c6b1a88a89208c577f80d3306e8d14e40bbfe0b20e334b2a3018ce556c16d3247d99b22164e719dfcf070895990645c6a5ca60d146b5c7f52c80e02b8cec31eac4967898b52f1076c4f5c3ba5dc189a313c53a02f08ad575864c9e3323b0c6c2b4b8a8b1799d965519887d267fc78c43fe6c17e54fcffcafe1fb5f1305036acf8f85697681890b305afa233b4d90139019b529e91e12810ae6675cab65f400c7367f531f5b25f00528edf2b5d508791f84c2838f6580acb90fa6f63e07579f138749749d51b5f3497d52a771d1017a3d470e303b96260619195d4413fa77a3d0f9413fb916e247435307c227a70db6e9d4cdef47a67ed295bd2f1209b50057b1cebcaecdb2c19eaad27888a5526bf2760d86dd696a053d61fbfc913acc48f754fd091a9f663fc1da98e1e82fada08214e1fda8af7f44a0ff82fd692fd5ae7bf0b061fbba5765074a6e369839989c08028a5a229214f533a3a3a0f4b63031f998ced73ad81456f1109f866caa7fcbf152ab6b5aaebb06de492e041f23c973b5ddf1cc6bd64726e1c9b9e76b395b38306504a3da98b569dbe533ea80bd392950179d2e9d10365a83e18624d907190689675cf07e5079d369621a701609ecdb4305acd3c45eef71f18f09a2d9746721a469343f51a701830706ba1855ec6f45f43bd8de43c9eaa6eed9b239fd7ae546e7d08b8b3ba57ca4ee0341c69b884aad2094b803aa74ee635148e02a97c604fccbdecb1a800754aa4401bf4bb5b65b9ffb97db0c986b4f2be88cb1c7c59116b8dfd6264bd23d61ca2129ab14c09c31d538b4f2cdd1e810daf5e0de4eb305ee7dd8fbd23ae595f549469d6bb96ebebcbffa791d4bee182e8db69fc8a3d37fd75f3eb9f07590828e15a55eae1bccb77d063184342a527d528e119d2d9f328242306554c4ddd150254ea6719efe0376d5ee6503b44a8beecacdf195f936d753d7bc761a26d5e1166b8543d0d03ced97f51ee72541da1707521ffb50040cb7c5aacdcfd392a9a5366c41508f624c7319028917c5c7130290f9cdf3d69357b55737990a1fef91be0b688cd5e068588f90bab0d46f1c6e38364daffc982210d7314e08aa1eb275c28f325fec54a41d0a0134123bb5cc4f978fe2e96302c962a10cf11a04527e0c314417e47a9e94a1a8d1854f503199dafa065a21e4042e5d8d4b880f5bbdf1f33cd4a310cda0c7be87bd0b6826e7690dd9b7c9521237eda6b369120a4ab6810911466f4be3fb7fe0f3b36236cbaf3dd0a22eff6509422a141c16276d83ee25ab6c2d9cbb1e059c83af0719c8570edc11cda5a140a82f2834d30f599bb28b4500bc143d5ff7a3bfaf06ba836138a60a20d8221f0cda4c20776ee32be733d3d52c5edc4fb8d3bfe67b1bb1c3ed95a23261311dc42d62e4cf412844fa78820438c53bc6dc107bd770265b9dfeabee9b13d686b30c1f91933a915e571e3232eaa0c40189dd66bc9c4f048868c3df1964f3cc82f04db641f2f1997ed4a1060f07bc05e5d60a378be1f39dff9fc5a2b57df7769d04c3e329ef555b930630e37c96e8e905c170f154f12c6586c8ef6c0c4fb2086402f867975644a155e88334eb15ab12ff0057f90224eac861f6da3f2dd7bc7648a57f835b9d82d57cf4455a39f835da364a5bc47d091cb6089863248d8b8e60f9c1fcffe9ca85d03e88161e5c6eaee19a5d630f04c742f049fa6224d5def3169ac50ced191c3725c9c35c25677a264fa155755227fc5a2e3fa11e05a8b085a88732ad59e85e967df7123ba163072a0f4d5eae3462dcbfce7deb3b5828ae1b5f231db1c9bf0a803f5998b9ebca32c2f87c9438352753f806764387c289548b11b6b795f3165db49a40d8cccc7c17669f7100b57bd4ff1bfdec3cba4267"}, + {"000000000000000000000000000000000000000000000000000000000000000a", "008666ae56c04ce79db3d3085e185bcda4dc9bc65817af22485ca3647942effa0dd6f3f7ab69501d0aff137a9ca30d716925e2d03410bbf417691d63f5d2c718306d53d3da53eb42ae9c08446613df04b6be66a4094ad52a16628d8dafecf5e8793f89aa1a091bb46254ea16f77da42bd36a4e573d33e3113dd623dca20412984bc34a0e8401b85223a46976e7c5fb911c5d95250c9216425befd5eea0628eb55354dced0014b2b20e6ae74092cf4c1cdb8ef82170cc27ea0c8078c62431013c1846a630a9cc28f45f1eeb972a7d9ddb8df2145d653388a1d2b367814201b4df3db1c003b92efe2b6d1bd1dc9da6f5b49e27a3ab57e43e8df47f46d41086ffc812190c7354fc0db20f7c637bef20ffe91c4323d3a9f1d26851a43d16c554fe0adb5a205c7e4212564a87205512caca2485ac38ce937273c0b70c771453c69b3a8d0710747de3e802d6852278b4f5cce9014a123fe2dee09def03a0e54de67dedce177b102806360cf913591644f1e8863629bb3db5e226dfa9a404604a533f05d4ab0788861652b48a4ea4707697941fcd5de7aa3015a7b83aa2fbfa6d14f23d6759d25a077f3d84ab5331d994e734b2dca89fc650eb35f1a45f250db950eac1c97a2766c6edd6296e56649c76992354d3d98bd9bf8aeaae9296e9f23141ad607d80c9426352a5cd13af6f35b194db2432a97a849b3c67130495f932018d16d98cc1c9c5cc57400a80cd143da90f60dbe3abe0d0f9416462e7e3d44f7578cedeb1931a4a4dce6f1ae167f635c950c95ea68baf8f7dad9d3aa995f9e070d5f9958994debe4d274aa2ecb91d8404d643792a46ad4935a6a3cbe8fe2f4eed8cb9d65d075646d5fbac271388981585d17b97cd8bf359b092207917c02ae89551c46d439aa9aab85601da73074c43df0c3886ef20d99ca6c6385172908a3da7b8784b00d2739a1086125fe3ca32f59a6a44f1dcd61d78db2929652174ecd2ff675fa2c4009c4aad49396dadec02bc08850b41f97e344e90461bdfe3fdbd84da7ea81af437e5d589e7a1506555d58063abaa1087ff7d210799a36b4d084172b606e39e001efcad9bea1b0f8f4b66a7fbe7e7d34168b5f82004c436826b3b3f41d724d7c6079b89bb939c4942fff0dbe16e48831f30512eeae201f9548ac30ea2e6c66c75ee46ea5b3f3b791a9ea1d5c2bb2871ee6782f580d79cf548f88e099927c8038d7dd22c609498f37c0cac074956ad94b11923e871809a5197a90c4c638390bb5b3d7855b39e4e3fbf4d96e9a6632f388cd54cb9f53ffb61e4feb7231f5cf578a6d1601feb8135685dfdfd9233d2bdc62220bc0263941cc6d7b19276123445e5b2e69679707f3d26efbbad6e69b1d78779115a493c26b373def3e467fc86922bbaa167d9c436d6aa7ad2268bdcd921ed0403cc99f9d7fb33a89bd0f076debecc7411930937361fe7c4ee9c90697770e974cadfc5f73ba01e42c20cdcf312baa08cebb40ef1046bc174a9421737f5f141e4525302ba94a5fde2d6f83a628786c8e19a20e5046541bbc7ad2bcf9635327878fd440dc62b3d4deb305f3a5175d99e2f737fe89da4fd39e2b41afe4a781d06010f3c1228439e05f41fed6173c5b7113be8d4221f63c17ba2d0c1e6fb36cf73f3639a1f387b3d8c07d87bb2999d57372389174f7d6c59b6e843dcb9721b4553cc6809f9fb4c5324e8b435e31b0d6afae1c81c5e8190902107c582d0f38e243647e5612c19f44e32a9fb187ad6c12958634362e5573519ceab39115007d9c9a19230d36dfcbd4238c6245fe1fee15fc1001b675106679ab361cb7691fbb81cd4e8b663b2f0a011d735163746d36b9e6e4427a0bd36a10a4e5aaebb24d901ca48e80fb17e01fa77a6fd606bc721ffc215"}, + {"0000000000000000000000000000000000000000000000000000000000000001", "00f48ca73716345f177ba8517fcbbfa282b6b88a3a0969e90515185833cb7cb403bd49c301534e50cf5c01da94d1038cadf570b534b3e1bc588391a95f2f701132ffc6629dbc7d608c1133ee4162c1ba825c572507e6f14eea22905d9bd0d5317a3965f362a4de3e6b09bdd25d1783b4146f3e921d0c6127a9a524cf3eb1112a7de0940f4738cfdee2acaf7ffd1f450e7eddbd3c0f2a6e72ab459b5a91a571f0d23e258d9a4fbea004aac2f501c62178a94dd0b0c5687974ed66a84c2f0a0d558036c55c3c4428115627dabd84c60308986f088d38d6d746cb174c92544a447cf3699931791c340cb3c52c60ddb00b3389614ef8f5bb52bf9f594997082bccb64c1314cd971ef47f67e079896149b88d3d0ba715ec1969f9e3f2454161a410f974dafe750c1f14518a74bfe0219f5ad3d17d05c3f9bc797a39506b1cbcf6d5908a216bc10228e6a1e4b8db04f9fe147d0248cebb4349da05ad55c1216e6952c6a688dec32317a368ed212fd4cfe1b2630587987499a301d947920375acb86acbaaa59ff57510d957efad57b56ba6bb19438a50c7a74edd733d32ed9daeaa4b0a5b387e261631e24912e9a551c25516f098f7336f52abbc864421fc02a1eba05a83b1397b4cd0e205f2dd22788b371e23a48b9b331077ea6684b713c209499dc13ba7d445a142604f2a6689ac1a5547dcb9696d99b1930743062a5b74c0683625b6ab731478ab13d976d91a5bbf14b3339c8e533996d3436287fead52922ec33ddd8a0ec09568d916019be61ec17c044cf9e99eabd4ad5f222776a1ab1cbc07f9a118baecf0be236aedddf8820677bd19e9cee206ceb6b6592069ca49abafeef5e910726af92f6dbed3834dc137989dec61890c0ff11e15f674a4e2d2d019a3d81284749a72320d7c5da47b1d1e5d9b2c4f355b91f2b696fdc5bb9de1f23daf290108ee042ba83a5b7ff852de764a5ea1b497d9478d094cd5d54d540962a832f606e8d3258f99b6de241b03a43b6ca21bf68fca3e50b88a2748509fca66369510a099da7372f547fc9be69ed9c6968b7556dd08fd07d55ddd99a1d9333fb39239d7eb47ba316d94911e2c9b6d56c3e025374380f73a6ef63f4379ef3f24880a2c47a875947e12dc77a77c02dd26ce732c56928a18ca09c0f8cb3be759e664831b26917759b87c1ec303f41868453d3db1ef41d4150e6e031e32729c69424518cda366e5f003301d35c8aa7d3e41b76d3216270462dd7f10c39508b851804b27fccbf062e948cb043231f7ccb291be2339d716033658d66e145fd49481070293b70747e5c84128f073f604f83da06a7d0fc52902979cfbf00895a74549c43ffadb06f259d7f0c6156e4c940dd519e90a3856149d5b88e9b87a379a304da0874e335594f35ef5392de5e43b3f0972b8b35303b7c553360f44a28b85987c9df75382a291d783380c5f4ef9af5cd2cdefdeb61e72c2c6ceb4ab979afc03edc43b496047a97af512cbe6f7f0de0475fce6310831e61bea84be090ea651feafc962599a7d2fc60e068cce31bc3090abbd4eb5cf65ca278a660d36f1342683a959d24a03fedfc8b86948f3d1be216654cbbb06edd174f242ea92b3cda34cbfa083990443cb36045d567607df5fc0fd9ec356d45eebf00b6b8f5ea7410677c7dcad4a2189d3f92256999e9cc6551ed446dd3a52e30d925bc68fd435e4f69f3be39f279ffb54c70a641bd85666a48f591c20c296dce721ed581244e715467ac131ee5c977668798703756b16d07cdba9c00aad64bd55a06fed9b28b0fad7924c352ac2d582f311797d80254aabdce991316028e3158641f7d76d69149f3a1cbad0f24af28aba27daed7027d20b9fc64c2ea0e52b2be2054b146c860302be39b58f227c923c"}, + {"0000000000000000000000000000000000000000000000000000000000000010", "00333f1e90c31543d056c279b4fb5a78c7511484ad30d4643ca2cc58b527a0d376074b2703450c7d64da01ff2f247567a9dd5230e3d352e9a0bdbe453b55270b8518f1928ea1dce3f30105e5653aab145e9f619b08361e4373847d9bf8d3315ce6eac5c0da06dd7e4e12bfea98c7a20fd969e3e14707d0be9a6359ff8a060862cfb60263acb5aa6a5505f2413fa679095f0c331623aa2d4bd72342d8b082d0742cfde563230cf10f17264e9eb95faacf584ff5998c641dbd78011cb01319852fb656552a58b3f674c18a414e5560b2b2d4fc1751eb5613cfe89ad37893758deb75b72d771d177a240cff727129b75d4e69361b46e2d261ff751ee13020c98adea7372543d1616721d7c8b3aeea12f89a364831d31d9fed9881a85e452c094c5e6d73845194df4dc5e6909355a2f7ac6737646ac4fd13f2aebfac89823b261156bdd1ebf05b185abfcc817ac1753fb80f005725ae2f8d077cdf15b0cf50d8921b12d1391b5c36c593c9cd15f6cd27a495a472e3bdf5bf9a3dfb1101ea7f28fa16aea0d8bd5645a45f19ba1048dc3c8e112f41b8a8c55abcedd8c1916e6d5c137869fe9e16097c11f8d86346cfdca584743f38deae0c33bc736f137537bff74fed4548d461dd3592e78cabd1069cd52ec93a649a9f7e49f260553496c165be459bb856133dd1bdb4f22bdccfc534255a9975967afa2e998e1b029c48afa8c25308d19bc1b3bb42435a36fcdbe6031c9f94294c75fb4fc05033332b6df895935e1607b62816bfeb991a7875ec9fe471f06d756190b45a713b2896abb67c6d3df9d9154546436ef10989ddec98162cbb04e72cf897a5d96ba4c0b36bf25e26c737096e36d945f55ff1c0ffe1c2f50d2d31718a89b7b8c8683db0dbd17bde93edad78b503ade82112a2eadeb3fa49cad7a7282691199f7d171e3e39bb29f4b0716367027aa9402ba59037cf6e604be62048c87a112401c70d885b7a5096d98d9a38c25dff48f6e2674d9f2af40a155a631d59bd593ebdf83a9efa2c229ac976a3ec25f6227968cc076f3377c606c45ffe42c206fb85ac0370c5791190ed98a68051ca1d1fec994313dfe3b2221fabfbfe5d2a1f44201b59fd7a909b84fb1ddceb0c0361fad596d9a39aaab6eb89f1a809ed725861580f1ed410d4c7233d4137d185207edab17ffab92859050850921383a7ddabedf1b897fd03ce9f6d17b3d5255047f89626db49b0dfe9e4757f0d66fea69c564c0b00d440fb179c29a7f867ed29e80262c9c4bb0fb22ae2a7fb3e5c437fe943935cdc33b9c9011069d9ea0a4553d44cc438e1a1f363c4f2df30623af41ecebf1779f99bfcd79fabfb64d46706bdce5e1c5f96aa30114bec90575ab1dde53252c4346f82ca3d497b88b715504766ba0ec36db9a934bdae69cbce57cad55ece052c9d3301c4a8643b9f3067bccba300bc59c686bd15048426e1d173b0ef7bf5da65670139ce12391aac05fd22d39a1f255b122af0a64bbbd5ebc23afe755d06cabc7fbb1a09cb590342c85af404926dc119ed451089bd44b8dfad2fd992b15206a2bbced7bd7cf5571862371cb8e663b9f10b431419c189f279fafdddae25b855304a8cb3ce7a3625b16ece469a1cc539188338c8925ac48e9658ff864915dbf70d4ee8a578f2a615fca6fb9f07885162720457e65ab97d16f5362ca448ad970e80b7f7edfeacc79b06c7bd6650adfdaf1f1ff49b6c484eea2be071343cebc8ce027e79fa9c2b3581e4f5b657c77cf494792fd1fa8fee6fecbdc99b2f225d8e4f0c32b526482485686531259d3093a42337d0afe9dc9786f18ff703a413a8a70359313cb27e3323147a6e0d6dbd3a561867e0c93ae2468eb48409517257f17218ef8d4439f9731d58f7866a63b7a688"}, + {"0000000000000000000000000000000000000000000000000000000000000015", "010570a8b3c77a7f88fd653f90aec919f098343fd55cd48f0f56fc814be970db12d768d507c0d39ffe6e021e483e248543f6ba9d434e61b9bd2164e24e8aa308b7d88235429dadcb2c518769d92e31be2a58bde201a51dfd34842222661a25630f5e1a0990a0b40c6901d3ba8b6f112c2e984904254adc91c9c7727f87d005cdff01b5cd68c1f76a8292caae8164eccf31fe4a1c6414dcae730e01a416d92b69ec98d26462948e980279a7352990f8bfcdaf1776926cea8acdfa58a2331b2c43258037151dd6a392b912a9416b69667ebc093610856b74175c1581d58928665e908a950114ef7c5cfb6cca92a2ba957a68e5eecfdfe2e33a3cdf240815c70ac4506eafbfe5ac325f89380127afa65ed4dd2b7f4612aba61e5b508767ff43ff9b9349b95aca521d6d57df59755973fd2033ad8fd6f5b5bf7a548e1669139e50f223248de4eb08492fca6eb6b9be9b19360108d5d0624da616b189e530567d99b1704095701e3da7aa036b15ba1350598511323408316bb5784c19031e2d81e572aeabc3d580cf9aee56a8f87607e8e2056e9ef2739ae98be514b4c82bcdd5a65093b3de7402c4f23b1f2245d9d07b05db5d3fa8f9cb6e8f263025b6d179e0d6140fdcc564389836e65e060dd85fc109b9450730d65dcebe5c446dc77c3f11e437bbb382246d629741d7de03cf5865bae16fa801ce7ff796a60d645edd72882c00ac349a7f9ae4bf9b6f6b5c26dd492673690754ca37256ff49bab3b42423f87fe3dfb1021bfc433b7b535f03136f91057a01616c77aad073bedea0b11646dd389c08a933d76072762d1ff641d0e69c55f8a4a68f692c013cecdae063b84269e58ca309de9da6acd538950f7d32647f4b0757247f06c7d1b58b9b0d1ce868194631568fbdb7006449bfa511b2198b6269f32b69bb38a463c3e446f0724b01c7c380186e1ab33d195bbe6b861442bc580f228971d03d124cdb24fc8302275a3b0f2632eeb28c5dc98b6fe7d01d51e3944e94ebdd8c36bbe2bde0313813ffc5a6b318915d169d1a5549f39b327535852690dbcf5cd2c0e4bb9068686ae89d814112620b327e0bd3f8e4b0a0f2c7249951ece69be201613586a726745acdf219e22463d7992984710c7d618924bcf9e5ab894dd00ad28067406c9cb91df33e91374b0ab5121f9a01789790e667ce09c0439f3377c64f6a26ec425e37356a6bd24f64db91a2a76b580448576b571b09b2a26bc0d14165111972315c7d152a083f7737286891e38b9aa7b220fe7a65112501a9f3ee29e4622c48bbcc3bf5064101838c9df5cabc8f8da918547f384e58cf7d2288e1415d2e2949377b9f37fa546f3d2045b1e0e3ff4f9129f66be5989860e6cc1220690e5aa62a94f58fdec370ca4ef60d0ec211a3e25abacba54523ec19fe6d301a971b5171491dd0254d7ec2ec138e644aefbf46d133b79ab0426924d9cfc79b56d5e77f7cc28ff47c71533040805ca643a5ab08424cd2d501141b577139b2a8b2c615c559ea6fa847a9ac8778582bba81e30ef0381a3977ca671d7a28920a6d3b821ac5b290a54420c7c334f9752104b33a5835315754689e2a851ba2b067b1bae1de9588ffdfa034da646ed8636e69678020a71b710ceb4f3c5ee86d189d8388674cd3f0b08560f7fca8a505ccf41e5c6d444dccbd515bb2b5d5c5b16a2eee3c9c6acfd7e66f2ad1f51d650ef60d311cc2013050ed892ff11f543b6596070b2d1a0fcd2d491342807355754d15128e8456f0cc5ccc96da0ef7f130fdc623aa393ca4fe4b086925f463856cfcb1e91d2138d5e945309c85686b4a477a77e52226287faf7311f5f4971e2081ade6eca7337092882e13acfaabab55b383ae335662005ee6ab5e95165fe5265fdd89322"}, + {"000000000000000000000000000000000000000000000000000000000000000e", "007087bcb52115f3833f40ddc74d5eb8692f4e3eb84bb5a7c4cb99b98efcbc8643bbf7035f461ebe42fa0b48dae3c59507ef0ca8f457402b74c65dd554b3e11b2bc0f44f8d7f70cddf490e706b422266c99a099808da81c3154f8216888f52a3a972424277f5bfd36d28c5898c6558fdd0f5e2f652ea7e7135f47b5a8b851889b1139ee31371661f86e5ca471da1e5d950c24a502af4bb2960ba251715489d44cfe9ce5d8176733001c06f3cd44fe544e6a64618e5fff79a3a983d317a1f6aba8b41d40bb50597c2acb4c197a651cd984110240381f09425817b5a3bb250864da83635d7bdee21409d4cc1c123b4314c50a62f98719687a01ebe0c6e020a1575e4ca0baf1f8845f5e2ef71ee08d759112b38c21b357852efd93e4cf3bdf66fbb352bea30940a197c5b7ca3a75ccbc58f4414eb35a33d9441d972432d347b33512564a78534e77c3fd5b8d5f33c9296d602cfd3d88153ccf6e67ca17175f4a6c9eb3e55640f09280df50146830af0b4a5fcfc66ce8dc1969b74b10b434301b495b884bbe11387f16326d23a1872a8cb122565271f0add5e90e0ead151e07da2fe2afa3ec20f0c8236b01d0da7aa7ab1e8c0ef025a5b50fc7ce136086f1b061204a6d543f76eade7c81256a79c821a29ed3c84e2e5aa9b6a3a382aabf31767d1703f8867325ae576445ea8f5c5ac65ec66de2dc279751ae6f702e05abe3d57dae9022af220772ca846e3a43a435939d08dd2d10f9ea7a9a319326fec2b3f3b085d84b3065245d7ddd7695f1edfc43d98b2c2dd390bb6427b10efd6c22dd21abb683f45b93cdf3061da7016980109269a6a294d6f25e7d7a5a183b93a53d64d1f774b23741f7e956b9de1eeb7e31926a50c911ef670c4f60ef71a061d29901b8fa9a10212d429390486cfce1227cb7b4b33ecba91bcafb301a36d92751729beae4b0303bbb4e1837c272729283b0ddca1be914f9aed780405bb44fd88808ade6bd4736664ec69f1f76fd517036562fc820894ee56d7037676571faa0d8f5e36f92280618e709c4bbf4e7814b1b1387bf1afe01e9a6e08a07fb0103631b5db4b8203f5c2967746df3af6bf1f42d236ffd467bd315f771b5fce0575fa00fb90200e29ecc77d51d82e9684a2521f96d818a4276a19e611e2e670d191ac057db7d23e1fbb552d9ed01d63a9053031b88f5171b9304ed0f5810a53367cc8d66a032bccc2ea54a1f9b391b623197ecd01060ccef20afd0adfc2e2c50517aeb393f8c9ce632176adee7731ec13ca43b1b45808e6e19ee7e7d2f613d38db69c8b130823041d8c4d2901f4960300e9c4725e1dc297037230f029f7e9ece985b0f543963c6d819e522814fec42c31b4895363f0dbb8b40a683a5e9c0b03d85b16fe353f2d710e98ee28e2e5e7f1d346455372a89ca775032df7a2f54c713e9ce3221091671110a28be6f64e09c38e3f03878bba758a429a8b5d15b2b119f5deea0d2d698157955a70c936a4dab0b25b89a32d7ea9b9103f1e67f9b1ef71a3644221f021336d675f9627eb147fec996f5c1c13753026e61a6c4d0aa65e9daf6e32fc7e2660cf2307ddbc645c17dffecd2c49b1e4ee160285a4d150e4eab5e2e5dddafb89563ce0562662226abd0d72d071b7f877f4e3c1780c1a67281fb0460bfa93e51dddfda0fd1053c599ce679a07c1728c3b4807b24d16dcc16d6c85889641fe8f2336cabe34142c590220f82a8715caf73600f3f3f452739fbfc57b4766456c801c31f79a6dd75042dee3a730133eb92616ea89f0a64734479d8bb2801d557638b7db7915d92ce18b484f8bca4dcdac14e59a4f79ffbc3cbfc5311c46128a395d1ab1739862618b76d585b8f8cf670623b1bcac63b15b8dc317841476bce7a5270e89f5c1"}, + {"000000000000000000000000000000000000000000000000000000000000000b", "01c5c04fc4cf1132a804d2afabe6d5f9d90a1590061b93fa8dcb4e45c148d0768ba646a181c737fb7fc11a493d3ba2a07be3bddae1f0e94017823ede38fb1025b27a5c3cea448db26093c34ccbaaa18a21b830db073a80ffe05530dcde8a2369c3e236dd37ba7c8598339a5cd2f830c41bcf59440354ee4599a7a4b2fa790b39d662dec5089ad403948e204890fdd38fd4f7f61281b3205616b72b2a86aa6ea174a0271f715a4cac0ca64d80f998c5a52bbbf23c07cee85566b0f4548146ec94e4a623aeb1d67e548e80cb279ea2347b906213083794f6ae914d80208196bbb23156d58dde461231640584d6261f418f1cb5b65c429369e0940f2d920f25d9af9f29dc63b123325df5615d70b06d6b006b16b479742f17c389e102825905612cb66e92d646b3185deb6629988751d56a778e50db3e1a3a731ebf9630b75477298de2e11656a3e3a5fed2c1961857003d0441d51ff056718ad13d559ace383f521c61f1e0e10c500432aa963ceb83c4f4feb3db669f5bdbdfed450e616d52f0a99bbb8fb192dc17e154d1f71ddd7667442a7b5ad6d584e5b2f4773bc2c3ddde2e3ff6f8141600fe08844a99706da396aeb263580afad23c0460393595dda40ea1cda479b3fd354062dde3f47cfb881c405a8d2564673b96ae9774896cbffdf3f6323f6f5786841fbd248961a0bca5ca5560396270ae177a4905b7bf50a59ff8f129890106ba6855ad4d5a6e5db8073ddd3ce50e2665cda4710788c8e3995750f93ffe4449d358db9fc94bb4b336fe937269e256dc3d9dde59b1d4c863e47001c62a45a8b162a87e1f81df2b280fb2fb6ef8cb249df9ae8b2c23696eeaefbddcca521b30db42884b71d8e8e8940ffbddf5425eb45fb7e1123b07718be33515401c02fd0bcf000d1553b901b1219c6adac8d3600dc580526658ad65a4a7f8ddbc740352bbc7fbc423ef2d7bf1621d5df428c7871461b930f019ebc92c3c17751d64a2df6e957d9608d20a0924cc51f495d586ffaa9155d538dcc8c24af0956f8e3fdd47fc97535276fbf239f2756826d31909bdb2820da815381e4780231de3f0ebef217fb90b9b33bd061ec8bf2b5a8c9b5ced7544e5b0cfe376aa0d15f4a12045cd476b55acab88f602e2c552d271a306f33ead265e3eb3fd563c4ac85062f3e79acb5cf681f1a03208d21cf77286de6ab996a24dc1cebf91278cbcade92a65c9b11f1c43ab12d9e3c587299ed34b69bc05630d28eda7a550b938b712e1e587f093d4c716a89c455105c7de06dacf9f6dc8453ca4f4a1f9bad43db358184266bfd54d96a7e82762e8286325821b285ecf9c2e2386bdf15ccdd361a7762bba7285035ebc5f5e712311bfa664162a19170c16fca75e415dc1adee2570241fa448f81aedd72b78c36caef855ea0034b18acb05bd2875064acc68b639937ecb35431f2cbefc3b592f34a4de81637221f46295ab8cd7626d9ef77f528423829c67b7915d21fde6f610526450c63f04163eb5513e2b51b72bf4c18bf728bf7b5ff6daf4e1d86b890f8ffe5948d0b490dcbf4a2e8360ad56f9e5d94f6b82af0ee24d7475ebe989593fd9dbed7b81f0bc6d721493a7a33a564a68f90514ceabee2835c3e770386c1b04be023c06d833b75ab2a10ac77d924b6eb7a8f506e04d79d1f44335ff52f1ce06d2dc033519fc3a5d297d2eb2a1156d70f326a8447bc740de7080199df60b4611cb4e511749b7f530f1b84370b64e72d916f341eb9acefd94a510a9d2e9c7bad7b896b4119805a112aa644a5c0af8e663af9153cc44b5b6f15b9d76e45eae0da95f398223ec82678ffc655172827f94eec038c66752db5f61e56008a43e572fa91de4799e62075ced9fe37d2039bf8c89a84378fac37f363cffa2e8"}, + {"0000000000000000000000000000000000000000000000000000000000000001", "0014f0ece6e362455de0a39d79f74a891df9af877b16188b2d296065b16fded57006d76112807a5609ce0398b2bcc301e3730b0d162abdccbc3a9be8fed6be0d73e97cfd060757ab6cf3a51d6ef97e47c4f8c670016e4a000ec76810b667e23c73c7e151b57cff351b02ae4a0b461b64b18aeab389f53a549710b73dd96b036662330ee4b567bedd3783d8ec823a6b3e9bd824229fed332b1f888565ce028505e73a8a324e93fcb007e6cdcfe78f3ce692771a2799f148e3139dbd42c73deb8c37929d15470c05960d87d9d492b0d2b99ec70c1b4b2180dabed5c150b47527b25e261a3639c2a45c265c355ca5045bf310d6c856368d5e5e963a5c5e0c4d0cbc2a08216bcdc24166c3ae4728cfc4bcc01c59344c1d8aea513b741d55aab8b1be82190b354ee80d1700b3ca919733f82124e16b60f3ae36b03bb1ba1a67bbffc8983ab35df2433f28f36c494dbd53bb670094ae65f9743d4fc4996102835da41a39d0de1f124af0caf0c5303f29bcb939168bc938d6a656fdb64d0a4394c4921ba46f492b11d0d9f4c91e142ef516601808cf7f6c2547256a34424f181d33b6cb10fc3754075e3f1df4d4711f7d66c1cb0e1dd27d795251886b219a0ac683a193c7b58233e8cf2c4fcef5733bda2b29890bbc52580262eff5867c2ed4261dcd8af90e2f3bbf1c49ddd57c09bdc125da89e1db423cc9370d4b02fc0222efa74e7b4f2d23e117ef2425a9041e43543a8eb46b4f907fd19d145667f9c2aefe20bcf96f950558a3ecd760011bf844647640fa13099fc033853610f5c9c709f1b8b1ec62552f37e9bce179e7fe0af3138b92caea1f5957c41952e2f77f44b3dd821f88f817984b7c6dd0af81c747c3009f6ad8ecd19e874b08165dccbec0c90545103d337b35553e01dba90fffe81f4e1123ad4c792767cda348f6e26ebe77729fd2d500768734b59642e1de22c186b598be97bc7f3de9513036437b494db41b3bdce8cb38de749a64d61b1ecc064bc89b54c77e7672c744e2e4b5fb25e0e89dbcdb518f233140f9245dd021a5df09b784f5c8697644f70b92e5066d30180b88afa537aec17429ab192e76c14c58ec93c769ea97b6d868728cdd44668d2c5b2e6c1af4ceddd62ec3d9e329447a9a3919834ffcfd2a30353e2ebc414fc9ccfabe2445bd5647d236055ee0a4014167d17600aa2243c0f060e3ebba6cdb425857f40600f6a74183fd25e8e701ac9255eae4a164196b9909e2ec94b250baa309c7e30be4201464f6925c74070f05f5615b44880ee7daa1ad8a6a3ded93c89aef5a09fb5da27426a327e0e420abbea18969c6f58f01720e01d07b510949ea7974817432455710e9e66d6f2b1777027a7f6082e9276a467383cd755e57dbbdb17d249787210876f447bc10057a6bdd2051b40d4f3cf101efa91dc6dd943993ceb19e3553feb12b9a95ed7615021eca63ca9cc0f1f213e9dac85fd6e1967ffc0b056f7bcfb485cbdb0688354d913eeff98c56925af0250f655e67495742ee24c2778a583ad1a1be18a208026962239ea8e287d72ac1d8486bd6dcf51c7f77a80706734e572923e9c183b3e512f76e41dc3ef7675f06eb077619d9900bd24270e08ae2c1e3d9085ee6131a55c42d3f916bfbd24d368c68d5002b4b4a9d454307957a5745a541dbd09cf5aebe437072ae6177a34a195a06874c0f170f004a33dfd6fb19857046bad37f0ab3a588c95db2934f0fc0e59c7273a10ccccc093523120189d7f76c2df13ec2a52deaa4b26ca6bf877b09e5679eba89bbe5051b178625d42f569d629bb0aa342a3369eb5922b4dc3fc54ab3bdd81b6fd95cb6441416e60c88547b177eaff29ec42a3f5b26b53bcdd125d2f20e4faa602b8c4dea4da072b88f30d77b5bc8"}, + {"0000000000000000000000000000000000000000000000000000000000000005", "0012ff803deee80dfcaa92f0b5345608fd6fac5d0f067cd5a691057d46a5a47170c08ca571fec0b64335045a1c92780f2088cfd2113df6b8466ef48679a0df0ddef88fc0882b71d429216c210ff9e4776f967e1f07038f232c070b8eb541389f8df83a1faa3efeb78a2f3f628cd2a47fe1bfedc38977d741951d1ff3423107d5a8dbe50f96d10968d23e50b6a51246067aac9a20d3dadaaee16e4bd9efe38859df1bd11d3bd357bc072397d6a2dabfc3a3d040e4ac769082b2953a21b918a3c956b50970ca77e7c3ee1df0f049d1f53d74cc10b424f0df1514859fbff3f76b2f8bcdac037fff9a156d3ff0cf659a716fc7f33175fd4bf51fd30bf8c50c9f2fdcd9c78b4f0998f42226b77755f06e1e69d81cad7c7c9b9ca3ab6f0b67ebe173008391b3decf4817815e0926665c33e77ed17996978239601c3bda4f2ccce4a6b4580e458f9794262059c636726ed3fc700317cd6d921892c73ea30847bec7e41e53a4bc5bde53aa65181addb207ca1437a3f6731cb6ee55fd72470bb082db0e0386e30b29734e715b4fe35bdc5e42581a19e1a842cd875befd11262163e2509b615b0641a045808b4c2cc673ca47903c65038ca0d5db4332e8f31d8e654abaa0bf1cbcf1a95e76bd34790d3fdcb88185f81beb6580a87468db2d133daefb57c17f42ae22d2c43eb3a260e055a3e34819c45cd057d6cde27fc09e0da0b06e0ae79c39c23832ed3fde2ef753ceb982920a50c1da48735f9da0598157e2706315af4c0ec0da2387c78dd32e3022ad125c67e27193e511c5773370b974cfc9e00ed2b24c375e1ac4842d022983b2f1489ead8bd7a9ddbe305231f1def0a4a64d916e93741a29c5d4e232adbada96771b1766cd271725affa116486914be5807c7d1b603a6ce68e4d5249d1cd38633e95661c18d70217fe2c3562f52021f37873d8353009c7387559e96636e91b4a07bedae75cbb05c89133a7294b7320ef6275d934472c9ef6cb66a7d954d242bfe9da6df7b3bf5e5f654160f49c1ef1a9c1b2c3042ff522ad6e58ce37455e58920e2efe596c6fc7d140793ba97d53a88c7f8a53672a1d16c43a2c59ff6431c8e88f1a0dd22530af5c20a66779014d69a59d62230e1e2d3079af6d3c7cc59a63ad7ae9366121bcd3e5993d78b22176fb57f0bb8eabe546abfbc119fb54e01a5a708e50464c5d3a9f0d20bc29f815cb57ef8273f83da54d09cdda316654429462f9a2214a11f19db16d4a4052305eb98c779f7bdfc695c56a5e33c09062382158f408b2a46f9fdb7dd84ca024e5ecbf6bb7a08925b569e8f03611911245cf26d9309c9ec1183432f6e0c2f0f9850515bd5e9c4e74fc0e2734799f8a80f66b302a330a273da71e103619064cdd9b07e627d13c93ad77cface39da3a22039e12aeca3886b8c3960122cd9b84cdd3df390c55b2f8cfa95a39f4f8937a2987d9b889a06cc1115642bed17fcf25b79ad92434104f6751d3f69171e183c5bf71e97ae5840451d93510521eedca53457b23457143ab458edb5763de41db1678d106bdfd9987f7e683376058667506550d301c1bc811db3ccb5fc1fcb1e22703e3db5eb9ff7ab943515c43b766ae3bf7c01c984f4cee2a3255705b694954134db59ca537b3a98217d15275dc6203b83269fd02aa3ba9d7984f2d25368422955a1cb5d1793e23f12002cb09a75137eebb4346ea3de0f0e1e1819489f20552e2602418090ce73a80fe77990d81244b50b03e100065bd3d99b603d8e384f21673fb4540796a6e2e062c5f1e148ca1dfeeed75c9f261224a029db20c7e19a1772dccc8a116918f2243e71378717300fc1e160fe2a08ab14c2a5e6f84c3bbc124d7c0f3673dda9c341fa427335179bcff0dd45148a8ff591832906447"}, + {"000000000000000000000000000000000000000000000000000000000000019c", "0044a6c2c7e036d77992e156fac954cf173818c6a7231e3de5cf893397c5f1944b7db3b8d62c6e9ebb4a173dd7e335b0eba3c5bb32708cd0d6d1a7729a1aa41b2624d24c1b543d00e19467abe4ae451fa4fed03701aa6d9aa4920b9b4ff320d82573fbbfd67ddfd10145ac57c86fd1b1131d2829f6f67eece783265d676d037f1ca3224e62c55f18e14df4ea250d1c0a78d8b329a39c3325582755d38f557df253dd6a825776bb35042f15da17e070af615115a58335f76789a65e5d8139afef952195d3ead846a725a66cd2ae2b8afb91eb0917a555f42e739ba74de1d009a4897c78dbdfdb110d8427635f89f122c11c858218cecd91ad951918b4078d492826e1eda33482911c21d67e51923a8ef32312cf4a514af8e54be258f2a4f7bdc90e100c380ffb0ac36c91ff2429a94500f577614189ae7f0436aa8339c9dac09657b60341bbd886de496a96c7205aefd100983a8d1a04c90edcaa38ae2b7d31c29f7a59f0754df62d215155e225fe429548453c1845ee3dd95df7130805ce4b169eeb2c6e268656cc9e4f54a37cd4751b3c29652e9ae00eec50476296cc4659e6431a9b4d078f01b0cc88b705f84e824bccaa54aa15b99425510fa91fbed00d9d64b91421a31ce5666884ab5dbcce17058b46cbaf486bb5cf11e8bde5395a95f436217b24fd5d8e428aac71d70457796a4d5929e765f54aa400a8ae709de75dd1a04da83dd15ddad2e2765ec29243549e4777d317fcbee975a358cd447de07259075b1bb32ac0cb485f6f30e4d428d747a53a3afd1cf76a30c27f85d9ae0e2f8924152caf75e26aa77b588775050d94bce6c545c303c370f83609ea51b72eb502280eb0c5a18bccf3c7553c514fc71dbf1edea29a15b3059dc1434f51a167e21c90b59f500aec870e3e50920664f44bd91ec1c5e9d39234cd28604dae1c2fc829033fc5c53407f8018f46332406f433f5325d69f967075bfe83ff9a6e3d8bfca3fa10aa52fb3d947d7fca0601e8c119fd531bf991227141f0f76e29d7fe36d61946f112a314cce6f6d5f5116b2d953394643fab610cd4faab3a8706a08a01f18008ddeb5db90e5d8adf49f7ef69a81a8cf5e729f53542b1bd2a1657f358910dcc7b73f02c2951b500ab05556e8c7ac8c75c73792327c1f0b8ef82b57fc372e94a3e5e5907ed75a86c039593dcdf119ead2315a20f92268f19f233ba9b26169f7171e6513906af76c206c099dc3232337a2ba21a4e2e8eab4d72f8a0ccc26d632765ce9f22565e7f2dbfabfd08dd8a7efa2de4a4a1b7c35f04145f80b90d8211143f4767bbb5f44764243f365604321790bd44f522f4d2f18599d2c3071f11d3283a73afda82a0189d277a0d4a38fab1be535f26f85480ff388d3b5837b38ad98353c72103c306eca0478951fa9f7363f7035ae7fc0d5e01fb1f8b274bd4dd2f2306165d28c32ec5ed3986db2c2fc9de53ba4a7de5c33b1f9c3db80b0472ffc9d4058cfe3ad23b0da9b28a97a71fe57b103893dd050722d4d0c9f1a4d7440335d690795fe1049765770ca024cfd78bc27dae60c5621a40b891410bf55a04a9cc383ec4cec1096bb829ed458cd2d56d1058d4396848c091723d8175d5e5024cc9a7d4d08012e0776a7e46776722fe84eb37d659822d7b12374503b7c7e11a110959d57462e501a3668d7cba59be26344e73240af87f97d4dff47f1b4dab89be77baa4290c3b114afbc31a4ac79f41d012a7cd2564f72e7b5624f292e5c49b7bd54e6689c2087292de9ea797c84004984f29deed27496e0a431a31dec199b16917a7906497cc35709d6c5bcb329a1724d4f896bca9593c0a0d258e2e5b8e6469d627b23a71c007b12118ecc9bf16a5e404f1618df963d8252e85b564797ed58d42f2"}, + {"0000000000000000000000000000000000000000000000000000000000000006", "0005c144030ab585ab2a30eab225663dc7ced30fcc62184f9a78e7dc0d45d416e5396b251235de32785203189426cb289dd3ef1440623b8bd69b7deddbf8ec0da47fb7e5c4c501c24bc5d47e3c57d97b3db5cac302f3fc93f6c8529fad480a83865f7a0ab7a43893920af3b5e6a7d002a3cdefb21e0f477100a084fc6a0d594c93818d69af5b5cfbf5f9244fc5fe4ec2f8e28d62d2652689255bc12b4f68cf3571152e57e89de0fe08c4c948f855480720e7221e37e35d1add6c9cbb1f264c75b3eed17946ccb57282e6aa6081344e78324612a0c1aea3a1b5ff3bc1337eae35f04b5f719f4170138a1a1fd1d76dabcbe72268da79d8d52efc6a7f920a8b00bd71865e644d5f5717dfe02f9340b59fbece26325c4f45d3deb319d7058d777372417dadaeb3071da6b45e30d68438ed2c04ef7ef50e91bebf5550372615857d2eaf7ef39a60264de575e1063b4452cd46052062b7a3a346fb607822194d5b3f41366d0b1311172b3ace03d684d37534a85b905ebbda697cfb47a0181cbbb519995d2dd0f29209cfd8f4e2e54ebc6cb12f750cf7549bcded308b27eb626d80ee089b7bae352ba3dda65b1ea4dffaeb99900a6b8b167443192b45338a83a1948d61519c34e48b58cbd5e5e00d3278a82c57127c44ce3db531f92497a1d209560aeaddccc1466537e05de898e3af70e4c4c66b6565d14c1c2ff307a3369bd59cc1cf98dc05f85ff0c516cb07fdfa23241022aea13c2c09fbac36dfcdf74739e3b97e165f0c802c5017663e5d6bc411d804ad6025b21f72ded44bd0a58da4943a27dcd007f858c091f3111efd437b140a0c8d131b5b24eb07752f9aaf09f9c2f57f282615e03b5f5096db69420e43a7856ef021f3df725c981512e15e7fc817e7a75c518bbea553ea76bf58c78b18474dc6c9573d82e528832a764d785d4ab717c1a5004a53aeb8d998e0eb2b13e9d0389b8da16758bb4a0327146e48c8a92d757a19ab5fef4973bb775dee3b07d93d4470c3032e4d32f44492d4cb69cddf51bb0c49b92545cc579160bf2316c96cf18645e46b3fcf7305a54a24e3447c573333532e3fba4f499a90f3d7872da9a75af75105895f9cf375ab62d60986b8ec3baa1eca190fa3cdb826944ba6f09dda27fdbf497c0fad26a81c6a75b1e8c5c2a862d3844722f5033e7c5d5001a8a1403e6d5bbd9a31f315f69e4d813c7b8ce004057741d4db90f7bb697d42fc6020516359787df443063ce1dc3e567b85c13c91d07798396d9e11b508ff28640d3e639068d7a7c945e4c5fbc12e700edd9af304f88b2dd967ad45afe550fe5423865961207505af13d536347ae5eee3b08831dbadc0e2bd629af93af90799cade484e2e79fa66c147adb4e48ee1fcfca9c012660d1ef98802fdc3c3f3ae65ce4362be8e36313302f5bc7e360bff86798a303bd7a540ed224c5197a67b597df4bf6722857338c92809cb95b6d02c1706a40ade0d139c0b9d1bf985d27345b1b79678cb54967b32f19e094a8eec4d8719e3fba37af2fd81add298460464c5513d81b6cb46849092a98f5ad0cc57ffeaff04c386e516193554e2f80142841270c8fd784e45d80693a5224d980abaea4905ce4b425905dd50fef12018dfca457109fbe36313925a8d15dde64686d8c12406902f83814f81b10ee4d0b3e97ad0d8dfa5ebf09226d213b177db69f5613cb4ccfcafc8ad4c664ab5b8127f94364851dc031177924ba3d6a3659538d74c151dcd7103680a1e8b460b15656c7d82e601639cc8eb0a512b995e84275aded8121409ddcf362c2d13f7eb0c83a459d662893148d5a81f6572803663e0349d9d1884d2e5c5b67d35ff8cd697e0ea993f4dd49eefcb31f0b482228f04a14f125328ce2de5d5dfccdcee76"}, + {"0000000000000000000000000000000000000000000000000000000000000006", "003ed39a7e92e5c4a21132e5d32301a1d8376fba6b1b011feabb95cf19a91e532449dc35bdde6b54a8a9210d3a3e908dd2bfdf49737bde6880ae349f54f77d4468c339a4d3ea0bf826c8bf51ef9b7e4f529ace2f1342742b3c29a0c7eff632e2aaaab799cd975faf7928b945eed88d64b897e6d4423064c13f2734fceb31223eb679cf25d601784093a7df70223a0f4abf1ecb2fbc0b67c81c933f6a98537d98780de1293d5d342200a0a816f7052a853329f4be39baabdde2ce78bb6e15903a4bc4320107ba665186af678d0a25a118c69d18672bee3c063b5ca84154ac19b5de2e067699d6213afae214b651167de318179639e90912282f11cb7d01269728c7263121514e29a82b5a8c1bc3035efbb71c950118b2ed530393bcab338f6194ff3a219f306a0efcc74305b3029bd08085b34ccd51da11a057c78a5232050700d89fb13acf455c854e448a04a6db4f82011e91551e0de0507b57451d44f5e079990378bf2c1734ce15df9536bedaab35152031d15accf9d6e07d1365e321d153c78f7b51e843e6cc194eaf473d92074498832402e79a0d6e3427ce73dd44168bbdb7a8d80167dbc7e21a2d45c38a80c16638230a612816cf60045d07592355d1e712bba058e2062e24627f14a77003c57398c3462880961a83c6286bd3953f43f265f34874ab1c53e8983d6b8ee9e286f37bbeb224bca435081962a95384bb907a07f459c737e492d0463b8ac62e554b8a04ea4f0f750314d9126795a60f91bbfa671e2b44e467a762195e9bf5cce7e41989b35ef6683449cdc3bc6e1b9827a3dfa68152d32207062bbf7a590978019a45545b5366f0c135629b9e61c76c1e6646136d86f73921d437d3e60981016a3e97a8847e49ab0bd575eff4d090c57b6c112442c2ac12c0463c00211c356185b5700be1c3a2d35231c2b828f994d0e61801cde136bd80c65459213124bc40d6ce33969f9d0a1fb491f2bb53e543f866e2c0d33fcc1a4ca6d5ea050ba5ef29bdc437aaabe964e9f754be99a76bb4f5e00e5b14ca0ed5ed39b8c1b74080fef37eb522b831260a39bdcb6f1c6a39f78404a591eb8b113087ee8cea3851f4afe15e4b6b08a8f9c90757cdda8a0e34b953113657baf55529656dd0e7b4db7dd7d3061c5d31901d1d35adae11c915e7a137b7b957db868475ff916f0b41ad69861698f778dbb0b61297cb26a27dbbceb21bc90e161f8f79e5eb70354c9a68afd15882b4909c1d9e70f231ab66b3a2d3b7178bf2011232fb9325b71f06c79b015c224ef3bd73a623d6f122b7a8df28710dcc9ed902e749cf4a62111b6bad791daba84ea8753c02ec8edddda8faffef24bf624a9de94efd3525f413cfe6fd6d26a91da6fc1b3ed564031b89b75f43c6512aebe2fb9fa79537f7b6a1f46b986b08c49fa907083cf859f2831692bc06d1f8ef6be56108324c59bf1bfb16c6f609185374f6e29d5bf63bc8c9f8b0b14b12b3a8de7f655447440ae51f9b45efad7700fd86a01a9c874b59e51e71518bf1ef1ac15528b0c9bebf1619c29cb3ad4fead6b496c5cf75dd1fba5d3719f650224414f92f8fad496109347b96651cc5cd2e5f827326c2ee6143194e2d750f54947e68466e288a5b205c344854cf035d6c82fa0cc6d04bf36ccfb1ba7f55f40b81e31e585db1e126d1ab232c663cbacdc87e9a892d3bbc4d4e9352b4d65663ee1854cec0fd7c8803931b34cbca8862b30fad1f151aecdae2525b7f7b32942221c42cff1799a2fb8a23a2933c1d0775f97c1857133e50bd860aa25a63a7b504d0acd46ea16b1cb0934182bf497a9ee3e9f1b5647809d8e6c3440e5fc23614d745a10572ce5bddf0d4a05db220a5911850b1a11c745ffd85b7de21c1d043bdf0f954c55e2add53fa"}, + {"0000000000000000000000000000000000000000000000000000000000000010", "01f460cd7acc8a0b205c813580297a189abbbbec6f02882b11ce42c03b32a8e1f53494bf0979a5d75d0f243a1c8148556666b54d931f3ddbae8573b5f7f8a230792b71b42aa519f2b256e5433fa0330cd8dd449f1d51abfa6aedcf97b73f83dc6ba62dfddff4b4a16a201b128fdfa5be599b20245c5fc32e7288f33ea0ad37a1c4ea0a169091459e5877895d844ad1ba396baf4b96fab70ae0215fbfc4e65a07dad30613f23bc44e027ea8a5bd07a71ab7f6f0b110b918f1db889605a323938aa2f4ca7bca60e7d7d629ea3dda8dff7909670d5862c82258872aedd7258b9cd031b1eb1eb4443729375faf14e654e7373dc5c870b8969eb9755f540c048f0a5af6d02aa78b18b5af4e6623328548f5a1891b37b913be6e5a03b504b2003c3083095e413eb23321d6c16c61174a2d3ea752687de16877a5ee1e20b265791b4b361f4bdfe09196ee443c5166a039b7f73e071447c264c93a65c277a4d167cff245af335a10030c719a76506755bb871bb50eea2dba59f8203e727c0fb1bb1d2a11d227bfcb47397ee588332a511e2cfb36b909c80d7a350bea3b338d36cc29a917b0bc9a7f0b0b6db40c43705cc59004203e6db18950b8f1dff425fdd20e50d3b746c7f8e2636f42cb3d4c7f904e212456afaca33839cfc83c236153a6425782b63ec95a3db1f6cc6993b3bfbe1bc62fb237c3768828f960380b971587b4e34cf3a39ee11f8ad155fa149bb7583a10ac6f49140feb257f0567616c770d13d8bcdfb9511481622e0b1b7b17c1ffb4a514f0e32e21b8b3ab201d8492ee8d07af618212f4ed0c674895ef32d208f20f995eb6a03a365dd62b61d3b3283ae2b285dc40316267f5c4c9a305498491a7f12ac832628a703743051c2bdfea3c563c38c4a885891733242f571f7b27b42597c15e47ca00cbaf8666ba6c4a24ddfba135be6b0622c7576b44658ee1919066c88503193fa44cec890fae38a4e1f03a03e5719413983d957d635ddd46100fb9c4eefeb6d12db755b8b4adef17b234477949b022ade6f83129ca9fee144350d3d87bd9d7681d426b0818a0dd7a02ec51f511f20697ba1805c025d379071d7cc57a1863f1d727dae3a7a243463596fcbd4cc12ac3d2e498d56b2b9472e5ef68cbb4edf26d5c5dd04344d68e1b97eb0acae9c523994ca3a5f73698fc1d0edd6f1219cca2707acbc34ceec10f9269f9db54fd111f1f4bef2773e54b81f25745485ded35e0d7beac2faba6879f201f8f50b603ef55bdbfe1a1d3b8ed484fdeaca8ccd9dc954b8bc5c4c5b709a5f18cd50e4e18ecf7cff8d09badbe1cf364b24b0f865e513cb5c120a824e6a79bfb498b3a658deb4af919fa5afd70c6263f07929f904da3c243d7054c72111b5d93fd01c42b1ffbd59791919d544b34c8346dc74733d37a508d071155e5969427f52f32d699256ef01b07f078b4c30f0b0e50cb65d0fbe336915e51327fc46e4e1ae8dd1973e3e93a09c83d2456788416fcef1242031a84164d990c7ce5a039bd8519a584d3bebbe1f74c3c498d0b403a9b7a8e2a748333e57263bbc615c9be7a130a1f12e161db8c67509fd1a658d54e157671c3bc8b011119df87fc9c05dd506445e437414741a96a51238012658177c5eeef5995bca3107556f78a3bd1b7530d07a1fbbb8f108f8b5ead10d6e173cc086755502c6c3703b2f0a94deec5c9ff655450daeb79cd51fe4d16094a9381f40b747ef5fda524f175679dcfd7f5cceb24b84c84e4377a2dcffb23ced2fe2765345dd25dff214b8a3eff167d13b9c852a42fb02ad7163bfa3dcb2435a4a048ec1a37e9a1598edf66463bc70e7f6ebd2cc05b3af6d705295b190989757d9b832e2b9e02be50a62e6472e04709264d8613c7f0cb86152bd1e664"}, + {"0000000000000000000000000000000000000000000000000000000000000004", "000f0222044557a1a3f1e59f77c1d05eb6ca77aa3b011d436e92d453d2fc1270b7458c8c56851fbb55dc031692e27609e19aeeef8101bbf568184f709729b828ccb31de159a270f8e6d4671be090c75b5cdbe16810635a9ad2fbbdbfe479550772b8a8de02dd74497929c872fd55cad6809ef93799e56019d2990196176027a2fd58aaa05a5d32cf82f9d9df9f65338dded4224fb50502d8d477a346460780773f38eeb5ad166900023e1455065ef0176fe0c27f6ef561ab5a1c7d804f30abe3f3f4a1f8ff19e5176c74d39d425f9b3317e20268e3b22385ecf08943d1f3a157f936a784b9dc754216efbd3eb70cbbc967045751f3c9facdedb6ad7502c1eabd788952399cd851f54af0d73938206ba4b00d692288f464739b46e341208a9f788ebe08baa4e2094421c80d0f4884b2d8830a41357585097fed6c38126916fff54720d397c7114dfcec0efd85446d985200117357d78df645f41575c10c5eb452dc9d98b0aa4afe3651a82d184dc7b5460f4ffbe00d86487e7c44049591448151f0cae11982c10d74be720d2f51b6110e0015953444e58d493f830f15329981aede986563087bd9cf4268fd574deb5664cde606eeb910f7a5261b6cccb5314c16746f2c21dbbf2ef63ceecf2b1c0911fd341aca65aea993aee23a95210edcab23cc503c19b309c7c12a3741572bc35afca20261c1a8ffa2f90abab9b6ac85e587a198043cb3acff3535e9fc450435bd9d87edf33135b48f443124ebdd51cddc106f5033961412b6e10cc30e4cc597d1d0afe25ff4ba2d6c35edea841f29c285a36c2524514cfb4afa363ecb330ad468df81aa64c5d599d29c5b3c716b0e4bfc243063427363efee2cfbaa354927bf6512beea4559aa651b96ccbb6ad49f2f0204f1dfe831ccb917c5f091e9405254e9325515c59daee6fa753e9962ca02feb13900a903ddff290cd582a314180ff84bae4ae6f98ad208f71047f488afa506e8a11e1633b6a91f63abcd0e33fabe25baefc7e1dc9c589557693d027699bf96b3498f5b2cd69e57290e5bd79eaad5fe82dbda3753f00bdc9092d251c8611963345bc2f744020c839e027c0df789cef00b02aed51178c555ee77eab0c699fb260cc72b22619681ed38b408527561e122f6767f7f832493fd9293970bf78c41d7647bef7ef2fca8f8f3420857f6dc5b4f2ac70283a6e912c7ac4a0a4a1260192e2475c718f1d587ec09b566614358c9c92374c3e41a9f96605d4f4bd740495273ade22ff25f8ddcb4491de9fecf7f9efc85ce0a383be2684a0a272f9f99491e4b7aa3623a0f6df6e645fc95780fef3a0ade48a121064ec1714a5d06a551a313595dd755f9957841f427d92c33e5e8ff235dc1b7f03662df4a99a457a2562d4663d8f2ea1347851604eb5aebd1b5bd7d9e933c049fdca62e62a14b703ce720c23c32da401b369ca82207871ea5ca82eafeb0f5ea82713fa6125e3b48f80c000ae32a742259d522a0cc2c2015d600c49dc7991f60bd210f9c9dada0ae6386b24cb67d8e5db92733129bb15cbba0ec1f78df486de97cb2f2eb65d772d830f39d2f8b586244fb43e9fdff752bff65c1fde49f164a5bdd63dc13dd2b6967153ce2d1c28254d68e445470cb36433c429df67cc6f9fbd732820b4557daf607a4f17133cfe9556c55936f61bcbf6eebbfdaa1d7162c4d597908760bcc03a3eb086da2ca160cb0b2711a11e3b6a6e8caa5c72521b61f3c961182d36c8bae23b34a83be9610013bec8266add7cbab17db5c05d7098af7b85af4f9cbcdfe3c1fe1725ac31a0f3afefd1ef2ca0de648733dbcf382963537b9222c5598e91f1964f654201bdab93bd9922323ca3bbd9e283930544967ecfb419fed3f6a569b1b615b3e5f4d43fccc6c"}, + {"0000000000000000000000000000000000000000000000000000000000000027", "005b86c33be0c0b9bbb13648ebcc428e9584dc3b1215f609aeeb6cb103902079bef67829e6eba839b18a0454d23f63c8abd5a60ba3a9622775053b65bce948074be9e449eb2fa5adcb00abefbd2aa87c37797898015bf562c6df6768fc2f324e0ae9bfbcdded49fd0d19b4a99422ec804bb698b7672e3d1e0f1aefbc2deb0383270ea4a1efc9eb9f846883ca151224baf2ba1226b9bbaee70dd3e1d1322b6cccf4cf3339e039e0fb0af14da450d491daca2602e21753413e0ff9bd284d57277529c8964155aaf987abe97c80b296df9a0b830ebc25ea6228fbedd5a9c1177b32b92905ae0e02aa1c740e90cadd6a5bba3703e2e9c284bea9a03bd97f123fa497110a5e3a89fa324c20315aad62469cd61813ee51d1cd788feff6f133bbb4f77cae23aa1346321b67aa9206bc3de9f11256c7165b1b12fb95fcd80a1cc3dc637ddb2cc36e3ba464d0395bf983e29d032905a4f431732ea6e7bd05e41e5046ab0ecf463edd4b0bdd34df6dc4dc2a8d1804ab2ff26a6db43cd5dc1507967deb30de73efeede308d8af684987420587e670850feb9851e5e25bb9fb089687aa9a52edf5455e6113a31a6e4b0032d9c644411ccb4930681fbfe914342e67fa643566df7a56e974445f7cb6effa4385f7b2153444e628d76c73c6468eb4bd2801288feb5cba8310266b5856022631a5c64dbb1541aa5cefd7885550b016fe5271a4a69fe0ad602a947e8d229f8d8b1a11454d306960c36e2ebc3e32efa38648eb90d3b66982b65fb40b96e51ddb129b2f40b25749d6e0cabf6a437b73fe5d020c9730a60a55de76e953678385b6bb116a342c343ca8ba2773f724112bd9d2247d632e19e58d262f5ff31329ba37aa5a27f4e932e324f1c18ac261b249700251233554303986fa5426d1a88090fd62d891ae844e4b69ff1bf93f64e7787d114f033db9a0278179b640f0a7fe49303549745339ded54f82d7f86b34ff6b8a521358fa309e1eefc278f31873ad5c20adb8118cf5543b929b884ca85cee8fadae15b63045ca6fc27555f5ba35c6e55cd4b3856fa0fe21d6b0a07dfce73e9837ed34176607f16b997c85b61c9a28323cef1ed40abfd05b6e5a7533fce75d76fa27fc9b9146da498c6097e015fedb2cad2e5d401a0b1566b4a4ce8cbd75d54e0a38378f861725318025931584f860300cb85a792c614ed42829d29a908e524ae4aee29040973ba4bca0db3d912f28d377a5da0f451d3812b067659b0e85d1aa163cd21cbae92098353cb9ee68a2a5b6a47e255885f648df501adde230e46f7b3ba09062a6e5b76e1c1efebd1c40128c39e854b689dc47815d03b9c56a64bfd450f07658ac30a12215efac19e15cad4027d4993b1082b83a535eec39114ebacf6241b5e0d7733da8ef6ea94637b61cf08b747083b1701097c9f6c9ee6b6438ed372ac891a1bb0cec31ce807120bcc734e157a994f9ca13eb73aff8954d3b1cb6c14e1dce7b2971547173b75e388c69439aed67bdbf818200a08c232da51fa96c1af22e705e2c78cdc7e090f480c3e9a29fb5b8321f315c6c10dfcfeab4d25622d48a2689cced2447950d7d02fe63357a3399ddf5c11b796afa0081f9eaec8b1dab096c2374736ff212a348446626e91c09d247a73a7a87821e8edf4ce516f0e833e4bd293b7e3c69d4b2f2c751057c80d1f46da516d93cd0fecc4bdc51095e75b414a259a4fbe44e810293ecfc6696f5f5832324b6e76e87d537a38cb6c21f2ae1841da27d744c8d489f5e1dae57976d552a80eeb68f91a2cacd3ed63214d18b8fa68fe792db4674bfb2647badcec654084eabab0fd39e3582a3e2efa10e372ee6655bfe139466336ad56f91310241f15761113d1501b53094fab3522785326d14cf9564b3290"}, + {"0000000000000000000000000000000000000000000000000000000000000400", "003d8c676b8be132abb260199b5e36a02f1db1666c3050d1928377ea75de7a4a8271fc29c33d619cd41e02aede70c18dfd2077b229b062620ac6e0bd5c5fdc0e808b5133962da7aa9bf4e608643cede0dd1bebeb0cdd73b15ca6d7cbb805e1f7545fc5953e860a87c24daba46415944de74f2ee8dca4e27e6643411f86f643a40333cc7a1cdfe5e424a720b582455cc20e6280640ecbeb63e9654587101670c7cefe51cfd94fc056012235962c417145a4b328bc4047c20a7e22dd2fb3145230b15f105331bc8da1fa522495c2450af9a4120535ddfa26060fab00b8530773de90ed4b48f88c8d05bd2d2f2f544413d3c3253c09cfaf93d2cabfbd38034a292600df56d7b40151096fc83024cfb1510e201b936caa48c9a6b0cd6b664c2efd412df3bddee7850c151e161fe6682d96e8a1fbc163560e2905381ee81fd608ffe39bc5b961185216689357a20c675abe350183f33b90830cdccc7d71291b49802b5df67d2aee649f3333d1708b23c0897658e3d11b4208cf9c510e28a3ac2007537adea74fb491c15e82cae8b19e70f45c339c1fc4578630c682997daa600f92b6d77ff0880dfb72d6dc15716f9b5a26361bb691fa09ba727ae912afe9d2d30b39a18948b40d8bae20897838bacd3f13876e19b0093e63f4d372457e476a50e329701d3a1f0e9fac56e379a530c8a22b192ce9389c24e76d7d05ed38c79c468a75a35de0a96c1ca37b1ef99beb3d1641c44d89d50e85848162877a613f20a913716c930f559b0c634fa8639cfb558ad2becebe1318d4cf4a1bff5f925c6acabd78a484b5b53a926933d79c56750c3181cdef562857c1e1e10950b87130ad67b2b04f1ebf03c56fd660e1d75a979f2fdf9bbeab87bfef081a6576f9d114b5f4ffc6123c2ca185e8a1769935f71b094be549d5da42b4f6a1cf06ad0f809a6fc7f9b1014091005f050da648c3575ad0f6eb5b7de65dbbba773573f277af77058906286ead65aed696f1b60bcf0262095fa2d98eed1ce0034be5f2d89e786c94fcb6105a523aec17bb618169d6bb0357d749dfdc79a8420dd42acce40da69d48b8f5abf4b11ef692e67c602238080344286a988ff4d8656c36597c32b02bb6f5eb4a369c15205fa20bc1a42937496cb8f29811ddf80466522f6960a479a1922dc793c46cad0edc0f792204014a8e7c30aef1ab8830e697533dfba9fa1f1efe3f3bea6471b42b25d39899382a0ac55cc25c5f1682fc01a12336d049e436dbc7045614fa4c9921163539a32bff070402b07541ef61e3953f6d6925463cdc3b570d853461054806953254b31e7ef6bb819bcc17b0d70e4ed268b0970d7105f04569bf42fe755fa0bed9151ee43b200e2f390decd202a1e5a8d48dca14b22fca3c9dedc150e4a33b677179cfbbd8b7769fdafcf87b0838ca64f7703499f9b4617c753ff63890a5f5b5e20c4d41cf36d9d157eecbd255ee39b7a4aed348a40b0d574acf9ce5d093df4724d06777a3c6d4fbbe6dfb173a75acbf6d45ab791dc5f96ae3e3727c21fc31cc09a93eae980a9375dd34e4a617600d66c12b3e5022467514f39b2334b9ad02772a1b628512c7487bd7500cd002cd2ee4cb8595e20234b63ee640bd10d9327d13bd116e3c0e49b38f4d941b2c5e88f6a74bdd4e4c0bb95502d0430e746ade08f495d471c30d653a63aa1a00376442abfc876f7965e91f7f4171c627193d081244b8ddd9995fb9bc33e42522ba2cba2c5cb9fc701fb331628b90d9ddf5ddd6e428f9a4ea37699473190c3c2a991e8fd20dba1214ec976174460362bfe5cf1fc56cb3234e1d8bbb52a25a343571ed7abd3116660ed3519cbe29d29f9b3e66c74dbddeb2cee97980ba1f4a5c8952884bad4eace33884e38e71ac71b8fe2e"}, + {"0000000000000000000000000000000000000000000000000000000000000004", "02c7a8e145dcbc037ba5031cb2d7d5159f344d3c155661bd830f2be755ac66a63f886c8ed9da84707975143bf25ef752693ef6d46171d9c2a7115c4f7174671a4234182152832f6358947c17f4635788035ed5c61cbad5919262ccf96226f3533855083abb141857c1387b1fbc4399a01b813995de8d4455b9896f978acf2113294163df9675fc5233c4fd7e42b1bd925e1f34400a57dbd696742b8a98a668534b0eaab085f6f853034eaaed58649f91e1c0c0c0c4d9d0a036572dd0172b177af8ed96a24ec177046917f914a2a4bcb695e505e0db803fd3a68926a900996b5c3dcc7f608d7d0b3fd7c5f771efa073b7fc645a5952c58ab416d6f08c0580a0f5e844e7e77f40240499ec25263578fbc6ff11102fe6668ccb50871281ce4ca43afc907b6c0c641359518b9c883aed826f92db962a4eda0732357257240661e1dbe62df3c20387d82d605d92fc2f5d44c1048c0ab932d1cfdee2956151983a8e4212969cd0bf2d45ef4c0e4d9b8b9aecc7574e6346c26f881f231818c1297be15509412a0a53ca61bab2dda5091ac21b29f266cd6e523f20d6f084ae4dfa1a59ce947c50c4079bbd175b0deda888b94404ab4ef79d87ebbbc43b26913a5dce4dad91220a66edf7f7538ddc4d79ab991121429e86affe55bedba4737d2c9725d157f1b18e35394bb95f94a79b717423ff75f483160e71da6aeb0dcfcae5b18ee5f8f7fc50e8b34681f15722d243cd1115b663f2564b83e450b370685606c931935392951d6e2b93ed47a02a4e0201d84c268238c6d0d9aa483660f7484e3865d5fcd043c59048897704467b38ab1c882ce2404c881dd043a7a6c3f20f561eba5bbd032aa1a791e814ab66b80283ab3d314695359e6ff4202bfc2a941f6f3715bc0344ea1ac8e76a9d587caad4325f85bcf42317db7d42d58401bd8395894f8e6ffb03a129536c472bd1b673f3b6349e478ac04fdfb49d117919a6e639d243ff4d91423716ee32bbba5b2e3d0be97cd6215c38eb8ea14b52c7ff7c777b059fc8cf13a4324d748881549d99d17297b527367708161eb0046c156c004439350b2070952957e69853d315e7b02707652cdcef3ff7cb9be8d6117e27a2932ab9e1aa2475fe3d87f7a815bf39c35702b2c6c1a4e59c0e602ec09fc6f42985c37d1647a23be51f9244f8d3cee505a61f81a1e74773bce972027d2d8a99e60e341ab115060242c38d23b2be25626464dc3b719ec77e5c6d0bf70adcce43541ee289417d21337202aaea3ec52b1512ffc1c3aedd3fb6e2e425a35807f9fa3450f9c413416cef9508c592e195a3c8b3b7b98dcff57794443afb433be1a91fcbc588d6cd5a40c1e6105939328c1bc6c6e7ad47e553838243b509fd8425a4573bef721c7b5bff844ace9ddba7879f5df0bdf5f4fa11e8a4046bc1223614355bd28de1ef7b9e32e5c2fdb8c64c43a9aeb368f09fd5fe6775d7e735e69a0bebdc8f950fa96295ecb3e163dde88298db15400930d62db165255554cfe994836d9f2726e19de8d8c2a6ac9e9373048c31797636d7a5ecafd81d10e6265a9a4458d6640f6956c741e8b8c3864859dd41d92e269106f9e1f30b290ff9a689954de793d2955b9dcc94da210eed5f2b7099cee30ca705041344f069c345975829bcb4dd04f8f475534ad6b4822c611ad3c79d485f213707080f8378d26f44211d2c29130c7dae6449453c1e349a07db2d5bbe02f619cf08a1778c6488e9b2203a2eed1f53093e789186b5305179cc2669e71a92af9d62540789c8d671ca7480e9f370c65629254440025a07bd3929757b215b887ff2201469f6e10cf1bb4d7fc6f016265d5754660e8373217553a04f3baf18069b97953f15a460dd231fd773220752c852e24deb17789ea3"}, + {"0000000000000000000000000000000000000000000000000000000000000000", "00ff597115286b1d48fcf26e094c5f0179084e36590811fdf3c2c8d6fbca0604154cc45f4b7389bf877f02e1e15da306595c72a8c0bbdcbaafd4841765ea5b0414d9b2d58d222e919dd7e80578a9cdffbb5e5fec03f3f942970a48c51cf1fa3377ed4f4e99d31af5e205f4954d711d9e4518fa03ded777b4abfd307ff1b2078f66bac850a2ad00788539d5676323e53fbf96781c10cd212413a922b9c7620959dc577d93e51a1c2d0ebafaa45068c8e9bde940f4d22565f2b2bf1aba461b3631efcb513a4bda6f844b922735c5296d3a5ff2174cb5d0924a4be38ab963f7312aaef9acb01e2d4d34a326e086e6ca9bfeea83994521296f835c9e258310f142f9268727b4f5d3942ac274631a34c0175aa71a56bd4e36603f3b179f732171beaf99ff5f105ca9169d2e277acce7ab57a4d8bf96effd2a90f5dc0cce1c1396aae890eb489d96c34a8cedb1918b04ed417d01b0b1d556d796fbc99340d3a1fd28aee83218113b02b7d114ed956a1fdccdd11362d5a78067a62489fa3d8b1d82ed558a58c8d084d4eb6180422af7ba9ae046d14faaf7e39ccffe43b51d3a5e6cc22561337c25081df1aab24bd075c8d400f3dec2b224a87f1c75c80ad51f52678edf17605401be2940f034f171ba032d265ae18552c99f8f5cb86292b052716e0dd3fb9588379d6ae4400e55db9bb53539eeed8b75eccd30b5ce03aec61b2513fd75d41856cfe5c64ea213919464f2127b75557a6cb5d7fb104949a07e8e6b8bb93c997c12bcf4d4ce5302ecafed32900dfc2040dc63c6f8a62854a2415ed01e088d4b25cf9ce32bca7cd57d047f102621eb17ca840f945d664ea2725b26cc593ab75d1631c68249528e1d55a436bc6847a1f6ede87baa0a21a426f3ed5bb224f2d2b2307ad37b9550c83c66502cf6fdf739261f97ba3ce385e4eb13a6bee4dce6bb0350257e03e5ecdfa9e221c34e1c2e05bd887f2b2915015d17d6200ba94a6d824708ada25e60c5bf55851e230160b852d4479b6be815f0de92e2a413fd59272ecef4673932eb67bb6fe353ac2a67159f495fca5b064ff60bafa75b35f5b0f0dc3166ad176c665dbc780e25be8884119b63dc2d5343e171eef5bd789596861be80ee96adde4efffd92325c4d2fff92fde79baf14a633d40cbd49ab9682ae9a33b53bd0e8693158ffe0464677ec4e0fadfcedc633508be32c1a3c23e5a53163e3434bdf9e38bd69f53fed876032609eb38d5652a85b4e0b0db85d3e7f5c5a243dac7ba0ea539af362b18aff205a6620ff8013681fc3838b9be8b5782e009b512df6a311c3deb06b0ae03c51cfa66379fd84936d48b57576a010bec1673eea1a08e59aa86541c6d1b7377be7c224169318f550af7f9c2e2a236b7bb4c3335975319141c018165f88ab953b54b6be0ff5e8e041b118c35949809c423d207384e6f597f50cff7d82671751cf3b54e3be0796278923c6d8d1eba4e4b950e3c7106a91359097e13d13466b24b2cac26e82829135ead0f70983c7cf63ae382f0a94971eee996d9d308147debbf57b36f558542e84d4d27badc70fed9810a7095bff446a1a4e400710a13e565be4285389e600f7807104585c190ee5d359568c3ac3efde2b9cea316130d7fd2a34e25a674e40c99f103052af7566843129a10c788d35a6bee5dc2bf37a31e916b3833854c501adb7e32299cd98c1d38e883dfa72b2f6c3c0b391848135358defb635fd4a7d76bd086160cd41b1db22aa773aadbda72774bdc22e5cf613dea734798773a208f51686db70b61be5625d53ad7f1c66b1dbbe7c9240b12536ff2ab91bc3515a4a33caa21e5199bcab32d795c5e9b93985bd99f1daa2c78ccbb6bc41d6a866f569bb541b8d135cd5dbaa2fc6e783b391c9a6e29"}, + {"000000000000000000000000000000000000000000000000000000000000000b", "000f72279dcb3abb7879e4072acde4a253c658f93912d41c7c01a4ad95d9bde241c14b335c9ff8bbccac05fbe515c44e2485eae2823e2eac8695a672d15dc111f6e0c1344df74ae281c3521f768bb5b2577fbcf20acccfa3e60d7cd162a6426136ef375a9f273c408e13b98f1724d3f7e7829da3d30bc6a38968e44ef4330b40b214fa06f629264526667d78c341b5f8f61c331cd35430c8e147a730fb21e2536f60f0cd5a5dbbe501e6c16b9d42bf01d5e800ecb3c09075e5ddb957180da3ce20e8977f3bec4592cc4ff65c9def5433e41f088c1568cc899eec79caf09b6af2d6118496d48cdd2c32a1db0e29b901adc92343224a18b53a5ced6d94102d9c1268e4c327d33ac41db63a5b06194a17044e30673df9965605ad2508b7e8a76ae3aef8cf7fce591255f58e294f69df994282cd86d3e2119b785e121c7a59369c54aaa477adc8697651d6c813ac841dff600c8207926c4981f1d03405fcc1c44da67e66744b4813c569f8b81504b1f40ca223ac313e8da1659f05830cc58d2b0b97617d94a5d3d6b846b3fe64d9ba4e8f3b29959c9b56d5e4e61d494079789762be21b788c8112d9a406dddabe794389194af5004b9698f7278001169933968522e2d568e07c5706101ce7558b74b781b9b5d24fdde87f7a5b458befef5b58f6a197bad9b27317e23189fb5d9fb7d2307ca32ab81f2d85e812f0fa89e711d49e866bd4682882335dc0e6a98f978ab7dd0dbf86bee4bd7bfbe89692c4dc90efe437cedf434855d085b9b0f4dd826d54f456cb0aa349873e7d234d8631cc10faa7abc6cf35a8cbc371756dbfcec0b18cadf98c5923e119cbca4bc2a3b7e6b7d955fb01668eb1b73b0aced87f59249596968e96edcaa3e95a71f944e61bb49779b99a97607b4c21905f4ad76f29a31bda5ea2457be7542557568d9d6f9995a6f0c116400897c496db996bfd015d2bfed9b51a67559373d8d33371a9e5b601fcf4571f3965fd155529aeede7c8a07f436d9c58be0307eb722b3891b845a70c174dcd23dd8ca0a5f34f1b9e0ded52c32daa005752336ba4f290c67dad7370723fe9c454471dcc36a7ba1ddc7f168cbd7aabff09c0bcefc7994f8702d36afae79df06480a8c1f491e9097d8650570f65239657934da7d5687e0d6022ee5a289ec8eaac5fbed13d2c39217fc8f034be25bae7066d5b31a614756a839ddc4cef8ae5b26c3e2842d20416dc2e5e3f9d7fc43e5e7d4f61a2c0bb0f66a07524e513f380811a6ece9de9d7a1f2532126edef15c6ed469e0158389e6cca63f0c601d6889169c3d466e585a99a826e29c84a2e599ab32b174564dc57af4c8335a3bbfc1f7f190e3fdf24441f3f04d1a6a5ee9efa0b657f0baca1a8b79a1caed4efb81cd2ca89e2246f23933a8cbd89dcb7292be303b185a7c059d7a56c0e0d9ad4367e0db240fa7f074959ca80c06f07f4723ceeb3acb69035d3ed780798906974d7d23674e3dcb1bfb7cf77c34398272fc155d863cd7a0378253db7fb5e0fbd2efb3af935d4ab951938e5960060b6ddaf80e46cf38980a3aa0ddabaaf2f1bd8b45129135418aef00fbe90c4244a75852431ae43d77a809dd92ab72c58da7b1abd5c62bc4e1199fecd351652e2ee47c71cd961d9fabf5d901cc484b309d1db8be08577c418ed4dfab334cc6b080e0910a13c7524d811d8f1cbdbe87d79fd6fa6515b1501bde57285cace81095da64c7696ee15b2b21857aeacf456dc154cd044d4dabd3e6b564fbece8c55bbbbcd1d6ba16d8b3381f661ad17e9910818ec48473b2e73b39bfb6719f905218dcb9f7968e8997c5e54bbf59831d652390d195263dff937f0a294a9f96545413d8b75916152ca996380a9301ec97c8c3608843ed12baf555df4bfe4d01"}, + {"000000000000000000000000000000000000000000000000000000000000001c", "008c21b118c4cbb1d0528338165cdfd9d3bab17cdf14bf14b8414d93710508426ec1b6e645c7cf32de5303342ee0e2cfb227ca6e68f37c5fc79a80c11e1d5c15e323053a703995a5e01257d1e948491a9af052c6038a7e7c07877b2704e7b0774e434f8a6d6e3ec012428f97e3e6b393cbbf20664681b687029833362d1804c9ab42fa0b37ffd133707f7a9939cf30a81feff31b3ea35b8a13a261d55857296af59931d812b23639033702142a9e58b9bb5e277dfcc893330a351e59dc199a9e9501189039e51b6a1e5c5d624aa2d7df1cc819832e7cc3a091ab51b744af75e6c202ebdd9ca5b871d985e6716006856fb23737f87e88ab222bbaf346052082bfc754622f101595f172b70d4f2a30dc5e0f057e07875899bcef4c1782c4dfab59d9083e7163b50ec4c9f9a692ab47d18bc314524270616c3d76cf2610ba9ff837dae6933c034153946c521bd275ff01650243df22e552a53bbed742f1585d1c08dc2e6b89df213762e62e194a3533315256c1dfa0ea9cab9b20f7196abe015b9f28ff7deefbf1d9ed40b760d51b0864431bdd889ea828bbac3128758c53af2ece1e1ea12f167e66634edbbfd9b80e41c78e3a94bf39051d859329c6ba3c4551eb8fa26a8afee2fc43cf80b75eaab02169224209093838cc17a26b177f29c59be0540b267e9a7ec662e25193d9cf991a1c6912eae4009e3efe03986d281cc63e9930d384f12cf608c2e5071e84021aef875f0892cf66b0d6b838bdda0ca6225fb712562f7d99af2e6e3145eb98b42f04753e999244919109371c967632a1b281789bba917a6b705efaa0d80cb50b1e39a8440f7cc590f842e9be411b86553d7786641e7829bd3ea1ba89f1223359547b469254e47436de273365e33f93933fb14f92f9f0b0870515ae6cefac57512693169b0b9ce72778caf5da5b17a2abde709f01d2b8654482e62c958a436c80fb5174f783887eab2572e2e96bd922475d391286141e7be5bf1bb33fb81119ed1a922d184bcb89f381c1f4f9c9bba4b2f5822e2f6d7e78ce5141e9b839ea4267695297d0ba6e6010a405e7db0c13b2cf03f3dbaa5b4f4aad143fc5813b2e376d899e1b63192ceaaf75d8b3cb1168bec95f135696c322e62a07c9e2b139be13d24f0ac49cc4b24ee21c3e70ae2039b36396335eea1e6a03125fa0540337410c1b492700d5fd053810fdda71c88ede9d1207af7e47451f2854fefb1092462bc750b99a73e79e1b1c756af3157175e15ef4f15a7b177d60bc9a24248a835d3d7526dced758549cb02d25602e8965ef1a70979a31e8589353b37f873a9a5266259c10f6f7daf1f64e1318f4bab128914b1fa553890f5cfaaf173d00d16adf00dcb0347458952b74636f9c17fe2754d6430dbbb32bd53000d067f257a594c06d2c717967d7e02db4451821e060b29204285b5272a8744b07a891e3aef04d1974f1995f6c2ba4b4fd994f69ca29e67f1062a7def51c70edcbcf53615e974ba3645559b6ca03a21ff158753df395384d598c74a4c9a89309af5b506c8b5a0db8229caf3d624957ba67bade9241765b315edbb6fe457ed33529521e4b1c1e31dc2491e05dd170c7d7d565178e7e39c51d7f14b0dfc79dd940d9e1a2724ceb6d7947f094972fc412cac5615e5d3b35206af049bd115fca9916e15c210af78fa609494e3f80dcd2ffe4a5514e5d18250fdb0d43cc77d671e0a9315f2b3ec5c943a2abb61635978d5f026eed7ddfee44c92acc4d660e589510f989538ea96fec2d2b970800d46c7651a4ad0d6b4e562c4eed566226d971ca70627e047f82b935f831382d3d97440974a66f4df52f51bf47dd53e25f0b53d524265827766d19a5e9a9eb91eeb039fb988e23a7ead242055d7dcb1706eeed6bc"}, + {"0000000000000000000000000000000000000000000000000000000000000005", "0008b49b3508f49d7672d280c575bda9c1f7ba3e9510af18dbf7477d17919b92a06f9a56d97c7d0da97e20571fe3cd59ecfbfbd8a7d96bc306aa60b1fdf34537fa15a2a91d9f511e89849df9694d36860e1aff54056d229fb91be979f6d5561d7e656a9fcc5abe94e4072f457af864f7554371f281ab5d5382a60f372b840a8c960ca1d508e3ff72568d04ddba55a88436e7372220fe996fd8c880d95fd5d5467ccd65d7d6b8fa62026a08e7f706a59fb37fa759476dae5e80427495720cfa241b130baf37c6587357b05b42cea0075554ea0cb41bca4ece396ab90de1337226aaa112fb7d1d420da1762f110aa4a0b22a51ef336304ee49bc5b32470ac00365d1320fb1a1b081da123fc45107700897a90b31c6e141191e1555c9a494cd77e8d202113a8e900de40cb2591f012974ef65eeed6383c6c9227e64e419f79a27200d5b1ec2f958faa3d6e81a5aecfe5b3c01e1786077f4c483ddec93ac272c5eb1a77298f19943fcfc2c462628d7469faa03a9deb992df493a829203495c5755b65c53be69a3c7d92763559d36da8bbb24d11f850397acefa8f852d67a1a0be92dac1d12550974d2fc315bead1c8a832baf8d6ddced13bbcb6ee0fc52b84c8505f45008d447517ab99e9d79c92e2e70af0f178f360646f2a349837cc6aca331959b8d1b51233639fcd185777b05e81c319e1c8a4d7ae6d147715482e4c5e1a04a77e7994195baec8fd95f3d4e38b205f0fb1175440479ab9863947f2d952345ff9a67a1ee1ae769dd364c99b3c94c5e5bccae759213d88c148cb6c1460a24a0530e916755158214aa2ceb606ca20b817582e4cd578e86c2530cceac1ea8bffb564ca78d097fb4fb23b1fe4e4a9cb6859c5a36d93bea0d624ba1e1bcc506fe58ab3797afb63621ad5c7bd02252548141012cec1d89be8e3283bdb5828ee96ff5cf80076a0b658b64bb5fcd9f2aee7e1382e4f14b86df900ed31c71d616823f9320116157c067c9a548dc047211f893f64195853d7a355d6e86f271dc9e5da54b43488a1d2ae1370c09f4bd55263cfca6d82db1032bb0164f27b20c336b05cdf83afccdeb7cd6fbc7d69700c20bb45b9c947c0c10e633428b67bda522e37bf2316f322fce0913fe6ad0d04d073adf18e24ee9c1dd02520e563738c0aebea04f26b732bec509d4dbabc8d0259dfbf2eabca8b5e97b11e1b0b35e6f4c499ee1d2be45542d856ce39ff454436e53fffd169bd516f5a1f20494a19c7dae8fe81b279c42b14826a3d1984432086a6fcb28b4b99f34d47f59bcc4ece5999f7d2e6029f71f8574d33b93f3613b0ded36795c5263817423771ec802d8fdd4b1c7e23ef63781f8ed3d75e781f0971e7a783caedeae0d2b556a0f321a993abfca7571a375751964e37ef4eecb3f4fa6c81ca3a051927a10343e755f10e6c6acb8db078cb9ffe6d7a8273a878146670cf5530ed33f6c623d305d5debb82959eef970559a70bbfd50ba5313600b847f64ee1887512d7d711c5b1ed916ab06d729aa3d82768a8a4fc577869f919c5faddaa5a059dae02f21330d996fa4fb8fa63ea28d755839113207bbaea85c9cceca9657fd59389f1213ea4c1248a7f5f1b5f52e5c558053a2c657d194f270806ee84d47283ef1d72a0436d6b9d503f4d41b107455c62ca9b3cb2f493540e2ef0a149a3a357474512d48a052c452b48de1fe1ccc4219cb51f30940b0f2296d9595060c07139298239bbe878208e8586bd7935e094a2082ab135ac7cdd83a7f28b37a9061f8c4e0c3be63ab3cb6a0b8956c471c6757879320a1f81cb0e41867a33ccb53477d922170f6b1e19d8b3ffdbb1133b8d0de13996d3d1f3819bc9bed78938a593d3e8228b9b9f7a49947d80e9c4f10c59593a6c543984e3"}, + {"0000000000000000000000000000000000000000000000000000000000000436", "0005f1979ef84397e453e2042a228ad0ddcabae0880f51e27d84d79209d6f3d36d77f284d57e2e1741d4019b6edc05c6ddf4ff1fe3d2883ee09ef0ffb8efc656bf3d4016e2c407ab7d05b89b3d2e6a387a78b2ab0e436efae23741d3f661570e2f6f77e28fb43d1d7113c1ba11b9262e3d997a12e0ca609f4dbfa3f8941e179c3c25a41336538a709860aa5aeee38a36fc9aaa4443168d5ed1b0bfc06da4f55e72ee632a7e3af7590617511c220cd648ade47201b53c687a1fa551031735a086fc0375a3cbdf2fd3f5c8eb6bb2cb1ade55ca072773c2e3aa78b96aa8f1bea011f70953ba1a9ce70aa69404863810d3dd86c12157ab83cd384a508ee00953f476971b98abe0ff2643ca4395a9c7f9f2d14c0f76167ee49397654986e754ef7b365e4b861c20290cd7f38f6b55430acfd8712709fd221f12da1a8df1130b9e7d0c55f37f6cc2b13abf7585e7b43ddfe93c0219c7715fdc3ebf5e97464c80cf789e1311daebae15932e24e9d6eaa7926e960ea1d6aed705d35c6c011a45f46a0390db750682b4106aadf811b3ce38b9f15d3172fec11b6ee12bc48ab8166f355b0c53197cd60c49d0742fe48f7be106238f017507fde1bcd944770f956d7cf7d5deab4896551216c12cdb51823f8fc2195fb17b51a33f151d4fe39bb7e358e67f363b1b162391e1a9438a016d2ecb33b2c5bce5a5b6659e31b508444e4b87077ebd4d0f11f8b2fe3d2dde28b02a5a27139c50654a5b67e1528350a0b9ec797d279a4ecb0f890c05c8a253a7f9cf8441f2ef5b39548b12745e3914240c28e677b5d894b8880968bbff9f69bdac700bcc4cde1204d7c6ccef422215f2a8f231099e936d242d1e9b21d05d43e72d0649c6d7b8aa0a7877703221daea4d02a0568b461942ee43da05711505be9de7285a32166ffd7bfbfd5177b0c3e0205a0974be58c7001d4a8015d04697df6356c317593422228ff1c5e40b1e67a2506b6fb5a9fb5109fa3eb9dcc3ba9c0ea30f8969c597ee7b6d8d5dc8b999df286f81175fab9f1476c7d20e0ce2e38205315560b2e39066169b57b30f92046829e0aba3bb05f1ab300e8bb892acb6fbbb24bdccc80fcc111d02759b305a6886fb233cdefb2228c04c2e97550dcd2e3172c7a7eaddf1c0435661f442904f7cb5997133ef6dea7f1f78ddff55debb8857050c8d740a5b28877290f35100cd096143292c9bea39c86bc2f5fba8f9f6d8846892402ea1649bd70b8b0f51fd5a1e07d0cf6f3eb5994f6464de8892159be31bb37254214a393b7693f5a0c65f34c6ad11f63f651117e3d0bf0f711c7e36747be6d64ed1496559082a6c050442d4ab901772ceb7e24cc2a4a6395e923b30163ececa2c959308e695d4260defabb9998f36d4431ccd8d1ea70bdcf1db9b23a0ceefc103c8a01e5d470219513cdb30b7fda48e02611be3f755877def8bfe0b3cb57b1e338395ca6620b3fbdfe3c5049b2f381f0bc8a21c2fc85de44c0bb198c01acbfd8dfa3dd63e1c9a0194984d28535232f693737e4df704045d53490eb4613af7a8d55d5284e36cef492b6a50cd7bb3b61a021cd72fccf6f331dd7319b63a8125b9fe16c68311e65fc2e48d78b08f26f69d8c5a6612a092963c263b990a3d28743b6bdb0e4b6e2d5f8297a5f2bea59e096d93023f4c322af2de73287a4f28dea6def5626c122a99ea8a53183d763d51c926ca8b74b1bb388c921ec31f62b19900878e81baaca5e3f9c3815dbfdb5a2ab18649da1b5a891d277398165d51df5cd6dcdc820ef847d5e1e0df5f8509d249505b67e0bc37f3e3a7345ece854c926fa59eb7c5493ce9146ba25ddf201811480a96ad94c28d1a69b5799577c3b16a531b73e718af3969b06dabd7c93e82f62f280741cddf7df1b5"}, + {"0000000000000000000000000000000000000000000000000000000000000012", "0079da69eca3a8e3a644948e61303a5762b03d127c373ed4630ccef73ce9d338a3effafd963538f5d91100ab56511165c673f558b1aad60e0b60872ef6435b0eb88a7073b702cdbb7e86cc85ec9172aa967b28fd00d59f7f52c86e8672a07135760e4df5284250b1841c1dfbabb61bd95b3d2192e35a57eba12bf5316e3507e362e1a52ac47b67e3b55ad5d120f630b6b59df912bc9e28cf8f6ad2ee6367e77944deea50669d642501d58ce5c487e7297a8970880514dd1028e013643c0631e10eea62ad33f892f5546dc10d8584fa59f8a6093eccc122c5e777138744695162b159fce473ff4c139d4e584f251005721e34d068e900f1a9e40fa92312206ddd34c9db14fd5967eb00d82367c56c1ee1063712c343edd99c89e830e67419bc4499aec64fc18119738d5abcad02a599ce51e6d6bf3d05938cb39be96edd0f937c39606ddbd2aa32c2dbacaf5f46feb51203f1b9b66b444383902040547094d9ed53503bb7e919b9e7521e20fa71d188b46b3047984327b6fdd7fb19598968c18677e5541bb1f3e24fcd0d4638f00ad24311231fe867922dbea084d34a4101b6e750f9127a0bf2352386cc665af9302111c55e147d6bafbc49ee3958b48d0b6dd28bba9407f85f531a5e0bf1bd05bc0dbe80b703a413639cd142a69d321b55b5d1919fbd138cef7a728acc7776915a043b55940e97939b0f840852ecf52944f792ba84d0b276873e8f11e21a4618389326350c3e3183f795b723b7d7e8ce97637e1413147c70b47888874a6649233f7cd5b361c1151867023bca7a7e87570c3bfa234539e3b7a5d650d01a4bae08f49ecdd89ce7a5a243255c6bad1a06181f5811322007357171e8cc15d8b072326ec644c6d1531cd69f0fd36e723e5e45bd240431dd05c8b384a74678e9141f4e4bd957a64c59d7cb352bf974f601f62a7b32bf007ff4bc85d8f59bd2a1610e7cbcce3162d63d36c845b3a6f0f6658cf1f5b816d466bedda1b8d056a015093a4777fb5ea0ab03cad632d1698bc65d96fd397014c48d909511fc7bf5d8a70c857b320b4f9fda86bf03accdb104147b515c1b525086abb2f19e1394669d4de72cf8be5f52ff1873551d82d0007235233c3375084fb88a53e8b607b4e56149f3903828f540b006f01fc95205118c3ca396b58507856bf6a18ec8ae7d6f00a948773751e539d19a5438f5c342025df7dbbc9212c67b182be6009ba211353b7550d15b74659c768b118a15b4d7d1da67f21872d50471b54d558cf9f3142249c79e38288db3df25b9ed42fa5acf85945da4eb0147f00a588d1c6aa717013974d51aa05bc868df3605673188034c075edc9ae426f6c38679cc24bd5e6301fedc52c5d33f238463b74fd7c1054a322c72f11302e0f0de8d7520afe484c65d40f8ab4a84d677fa5200c01ba44e8117bdf30ce4aff2336f4a199e5f6cf3306ea73233aa6a0198c5a75c766e8d76d04439c7300d2b49014f193e32e1ae6753a0e7895a253ed88ce7135f3d403894ec399e4101716be9de54a12a55d29a01dffea96101b38b7de783c0f0654f3e539afb14603fdd0d6f2a8ff9a5f220e4fa2965c4ea8a1d1f49640b239e614cb0f055cac81176bcb3adb55b2bcdbd68244ae50af0aa7f5b79429344a928cf71641c6d62e40825ac33401c8749adf850e5a5b6b17c3b2762281e218f951980d1c883e40e4712c4e5b0ba98727c655d1aed46d693087587f754dcb0c478e79b40d4dfeb1420f9f4242b960c79b707650cc6ec74ba62ea5b0e8f160a5798fbea18d7c7ca04fb8bbe78271dac5997fc320fc6335f65874ff35b9331a2def7f99744af87d343001b1d5b54e8ab538458966cc96bbb1329ff869c51dcce9781de4cb144768523c1ce94bd8203502510"}, + {"0000000000000000000000000000000000000000000000000000000000000016", "000011581d5e0a197314b23ed76975590c56d1bd6a074a30eaead093bbbfb9c552e8c7706ae11b797f1704b88b1c108e18209293b13939d46999c98cbb75a70fb43afab64af32dba76b1f1e4a2f1fd8ebc939d8204c177541aa7effbf023130758fcffcd42ec6cb00410146cfc0bd5f7b177f5874efe55285348ee7f2106381a0e566054c193510cc4219622c1913a94194abb496e2da8b694155b2b78a6719fd70581d75f73534c02d10985c6aad453b66fc2ec322e47e703fc5f1179294ba3c7b3adc1b584db32b02771e2390c9d9ebc320ea376e49c125fea9d90515959db898702c7fc463b1c8a8b44125dc867add343e7465068ad6ef82ba547078b216fbb084a6ed545a1f5cd905394b3d75f396535f1c5673530aba1db8f65fc41b4c225ef9ed77cc215f20d5dffdb429515a9d3ffdf2f2b79a8531229702e1b540d128e1861b210c42c7e58651e8ac77d4a47023fd932ff49efd67b0305318f3e526ab02a1fb5c145fce61914272983910a455b74d1fb65974e1f32860fe4b122e252a4a3674266e3ffc336c75d0e1dd3ec2c0e7e3607508b95a48e05c616d55e69f69d7a81120b20afa4994658a633e8c26da021fbb4efc2d96afb176c354fef0ea6774ff113d0c8676f55471259aa960fc26dcaaae0876b88cd342988bf49651e85bed78b171c1595ce50573fb4939c65867c5b2333a81a915b027c6aae1eaa136bcb0b93139930ea0e77019a3e56134a40e7f50a8b30e1cda8bf2ff79d6e345451fe990f02ca185296f537980064f4cdc4afb7109399466e16c795ca8c4c6743c9c2b4a644e4f025c8b21ffbae1869621af4508e1aea73023adb3abbc0aed99250f034ae3ec6d12ad617c6f678f9e2dd98d7a45dbd646718eefc8969d90dd5228b58bad9d778a2ac9c7a9f4520987e46c5a2fe5375e0f32f3d2810137223df73dd0295811c8748cc67a1a97295ef67b07d88a591754809d66f10db8afcbc79aac0eafcaa98bc5fbcdd0d7c03075f7c90367fb1db88f9d95de0f9431fe67cde1a1a5f78ea02c8a6d769e84550be4a3945c068bc4deb065790edf794fca38d88f2bc66176d2e2415baf7fe2568db4460755e17e801933e137c433726a8de632d0f07aee36f94085ad5aa53c8372cbff1fde279359e3267e5069c5c2eb53234a3b2e82992e15a452e2c7e0757f28d5b1d27535e3cf254b736a2809d4a3099060983d54a890f67969c69734aa0d637b2b44e16645815686e530686e886fea4217291a9643e31cb7c289d5d572e9fa5ae5bf7aaa2ca61a35ef6b6e9015861df09b9f96b20603c6907d145351852bd9de502577b1d24b8d2d16fd41631af65b77e1f75d14e8a823d160e23881543c46b8543868c126c22eee1da6eb9d67acc2c16352ba4ddbda3039699df9dee1b96b69afbd6b50305461ccfd7c0ebc7ffe35e169afd9f50ee1b4832122bc77456a738b3518db269d430c4da2be29d2f660d0b9202805c4c7ee53024580ff79c1d1daf0ac562145813f1a60b76d983a4e2ce6a7fa962a0e4ffa2e40385387365c52d9058028058d4411964a361f4808e0bb8c94ac3613a457a5bc0ebe32f9d20e9fbd9507313be852e989099589ccbd3956cc7909a6bd6dabec928451333d992a795efc6d8e25c59621e94b4d8af460319dd37d42b267598d620a379965076c3d35ac62433773ca08cdef207be59c7c688ce1bcacc1a18558810fa215b04509eb5dac761db8a4c3ad10beba9e39011795309ac0fc3dd417e447279e889e9eb8f5ed4400384b98b09e7c7699489747933a78de5351ffd71531422b35d92db078ff44fa7108353cbcdfa539d62b703faa4d8cc87a323164954067724ef9732bc3fa583175f9b5ab0b50119af9bd7a61847bafb03989f5529"}, + {"0000000000000000000000000000000000000000000000000000000000000004", "0051032be70cfed8bea63361ba582eff3d513f9bea66145bb17f376b15d525d86b757f04331f00bd701801e1687d2f47989b9194e04a5c571f144591e5dbe109bc4b31dbd859aad2cc59aa80ef26b3016f3e41b700ac7b49ccc485bb86d5127934e8d6e0d58b98db6e12b90b1a91e486d1c2488b740fe448ef3a3cfaa1230621a2102b4d8065cb3a128275e6c7f54b67bd600576aa2ccf7bf2f1a7b028c9fa82e7cb570ff538b019008df5759ca0d985c9a425a9315e455760e91eb9c5207ca6f5d0aa87f1dece4377e2d03948e522f9a45901aeacb71fe1f22334cc0455507270921f8cd543aa06dacae06b66210fa767b56942faf637c1083f372b0e78cb2c6ea335838c86736038a5d9d703e87b1ca61979e6d09f8ca948fa15731b879d94c5ebcb99d8df1420f92d075c36419edd530905b486550b65b572ac1a514b2568e1fa59a6b80234452cb2aa8aebdeb44e025a990e88d3dcc2a8e3603831bcd6887997709a0f3e5ced3eb7562b64fa78853c3ff8266e54a83fb4aa10509ab0a430d9a1dbe7f86aacecc39ea45d1fb4e1175026886063446dbf34352e8842343bbc83fdf4230614c1dcba86150ec9c698b0cc6af8c2ce47dc4d371aebad5bf91018b3429073c1d24727de1388b0e3ff14d36e5a741018cf9ebf015078ead152c76bf8439b4ab26607e9a5809f4c16450ae543b695a93f9af85c02efaadc59066421c682a290fd3665526acdbb0f1008a361c3d7a7fba5f94a43cde2bb5565fccaf166b91bd602ea4bda0bc8f09838334aecd38a53f7f4511a479747e30253522f59c917198a62a3feebd61f6b93050be733b20fc7bd26f2c2dab03b14d14b93907aae65184e999f99c9add99e5a4b41fe2072bed95663be2cac3f761f9a891be509aaa27f7ce36b0d81bce14243f7e5b0945ec9313160e55fcde6851f8cd49d86fb03d7de5e49949b51fc81b0719672437c39fbb2720a526fff75d2352b63d715b52bab3d7171a07b1ccd9f08dd60d33f4da5f8da6f119acb21ec8a4335bae3ae30ef9785384dc2f3024308434145475a47e7f7a3f5056e3178ceb51d33c974a439e8eb4a4b2666fcc5bb217ab511c0893d6eee0cc58e1e40ca01f49ffa726c057c71a1d0056b7a3ea380723e9c93184d7f1d1dd61f3b9de786967ce9e544a44a8ad996255b28eb99fe062f286564dd6523de0280efe38d1460f1391c1b844b49adc723263d95660c35f381613b4a051d9349f216653f29738fc1fdd1e5e3e18fa2e26e2292d908bc3caf7db2b8a348171d62e69395393c3a9263ff02de0b0ec8b619ca0bcb29c9f0f160ceb811b0288d87760da70111584b9a2e70ec73385f45a8ea1f6778a8661a6434594929240bc7cda88f1362d4de48745e325c338c1ac3bfb0a4d9dbe6b95e77e7068aca119872f803de8426fa0e5a01ccf8a1d5f6634fe9ab154e0df709f1d34d05d9f4571bb481203a34ef6db2c193fa862a05fca3afb1cfa9beda34be6abc44e32ab5db1ce133f7cf1e507134f3cc40267b7bd7d3f27529be597306a1f5772cc312e55ebd01c38810dc7c738c916e8d0b40fe6501dd8175e2cbd2709242cc80a7b934614e0e7d8c51e589ebccdf4e431b2ba57960d1206c9a311b6a4e29f71ffa133a7ee2ee2aab3da92b7d56a7c30843ae75ed5b3653bda1715b7cf648b227b1b59747320883b9e0a4f68f9b4937da73f1972ee0d7d8ac3b0cbbdcde1c45500fdee380fc9d45a042747c1988a42e8cf7646499c181af3da3a3b6ec1151912cf6cf550fab20c0fb266c09490a5506f2f80491c7c1ef63a43257e9aef0de7555ab4955f3b43046edef39dd756819a99c21df922433b11c8282de4629954f096bf4a120e3cb42556dbbc3d99ce478e95cd64ee92cf8f439"}, + {"0000000000000000000000000000000000000000000000000000000000000002", "007f06c9fd40e6ea745d12f8504d4269f7ce39aff91a88de03be12f0055c4584d3ccc8c74f0bb319f4f201adffdcb113acdf198910f360dba5c9213d37c4c119ee79a22e677737e4dfc1b5b7f3367e4c3d73502614ae659fb8c8b79ba756d839a0e847965a6d14f6362bbf64be651b29e9b71f95bfbed0f8aeb95e7f861a2e4bbbb394d9618521d9c5193b46e7ee7d0776428848253bedec148c5caec43a8924dba3ef4930db5e1f0295c46cf30b08cf999d8045654d7d8eee2818c74d0f1804338d841457fa45d1915a770005c0647b6dd316720d539cdfd771276b835d1fb9bd5329e99bb7bf4ba905ab0d6036418688e7627ace3c8b79ed5ceb611154ea1a1e890c4d3111b5b5efbd2dcd7c554fdb39405fa7c8a5d55115ce377597aade97fb564d3fe36941b18e893850c65120e1b5511cc5389dc804959206499407dcc5a46da54d82b5b268e1b33655227692cb00ef1defb633ed2fb564953a4dfeda2dd4d22eb706512c92ef851ae043eed65610c23734de828b3807f0127a04fd927d6247ef17e6cc6165edcdbb0495f1eb1e0c15b16fe86de38627a4e9dd61a811e628bb5c9b01d3cbfbe15cf90de2543171cc8e6210d2642de184137f6495d94af0796eb7485f8dc9bcb37c547d5ded0c108177d60fb06597535728565fb5ba1f6d390edd0cdaf8d231902b01427363f698d6f85a5c319857ab0c0a6d4c0a990745e52ff40b0073d6d110aaa899a30fcd4c9ecae6a6238bdca1ac11e62a50e824b5b1a32e1092fc78380103d3f4147397a4864b2657dc60b430b57458da0d7376f99cf4f5c17e686a3520f24f460d9f32a8ece4b471be1651f4ba6b2b7cb7132f3833136a16ced924e6f3e7114594c0bf3ce170539f3225175dc8e6f450856edb57f2d1ae48917e3477fc52911777069ad2e2981f9843a2ec32a05e965c797d521e02100f223a12413da5e0320fd81401808f64cb039616e2e3ed8964adf9aef2d353b76d60f1760c96df5f17479534f330cb83b74d42651b9dc54d000bb8aabe1c7b47ddcd8a80afb29737900f7aedf3990e5dfd700385683e1d8193028b8a914c6df325b2b892b74cdb107a22d01ecee813d8a4331328d29746582538618e146d51d7ffd54739cae6f351c1b75b0e748c174b203aa507eda31e720595b0f4fb27e6b697414f3f06ce061804429a99747b3e99268d51d9dc1e27897e482b21228c9fd8e72ee7f97ec73a2b7258daf31e3fefe8140b7cda1f1012df022071526e2f6c30cd06bc700e2e902bbf1e5274a72a1e738c0964acd0fd1f9aeb8507c0410f794d792d551721632bb8d38e4afc137f1d0b8bf24922dc2abba459e3cfb11ee2b5c2e50e51181621438ce2ddb619eed8c312bda500e19fa54d0999189192dea44fe48fe6121927b773f3368e5b7589f4025c4f46f8e7c015bb517505cae93305f4edf6b9ff1f298a6f7464efb94603d31ff7ea6ee6a87cfff9a40e0eaf2bf58e72d77b9f61c937e00d9109737e2b7b218cae3511576ccf8aab027d652c983d080f388795085c577dcae058c9df2060dc274b3985cab75bcd692976f4d0f0300fe7ce12ea3d2a56d1cb0887dd0d602a334f48d35849a78a12246088c02ed55749ba99a240800af023f0edb5d86a8b08f86bd7cec7521878f107ad338c0ee0025ba260111cfbcea6454b497e54f41de5d3e7992338c7ae181523d2367ee700f7fed6411e23afc40ba59f63365f628c0a712dd8dfced01c8f2ec3eb4ae795c94fcff784e8ddf439c235f07f2fc00ac866c2525ab165902957bcc56d6dce1fce950ee0380f6c86ab12e13d4dd105ef423406ea742878dbd61d46466fd8918949015343a4a71d27c179be6c706c2716c46bfe2dd6eb99a3a423c53eedf537e793c542"}, + {"0000000000000000000000000000000000000000000000000000000000000012", "001210e9cfca13c38157c0211b3ef81db65038d98016c8e3a83061c5f7cc9d7537c02eebe675bc79e4c22a0534d4a09018b79d2c63c4304b5dc7300edb7dd343c31f835ca83753ed5506a4674de55aca437aee7b01895a28c1556eb5ee94169a4f504e120cf736eb6b299e3f7f710bb31d8809f3d7b5d15e1b0119f9a6c323417ffc2d4de2fd3e9412a886f0015ab7a3fd9a7a34cc5b4886aec3a1bb6306a76cbaea4dd748729240010df3609556b26f38e75435926ba19f47969d59e72183b51801c98ecda2b803ed012af582544899fd72036503b4304dbc45092c70c5710b74df552c5d0edc40684b3be2a5daa5d1ade641efbb4a322275f1324a0bc5d4982e4ea951677365e511596a1da09fbaa4d735a76caa5ecddba19ceb04962efe9362e702f797b90bcb24fc510a8e1bd3461507e566497e1d18d6a4e9337547527f9183fbcadcd85dcec7873b50bddf14ef05d678f76051b2c37c04f095c5eb4a9036a559d620368b9a2e8415e62f479e84f54dd091e1b1399b165d1812458f5a87f003816782a551515f3cec46c8e1b139ffadf944619b3955d703e6f6b872771d7a18fa4108946b166411485aacab520b7550fc91537f92114d18ea7c18b419f4074d184687cffab87b58b91dd5110bb52540e990abe1ea2294e777d299515d911025981f64c56108abe5c1e00e32940a9c64c0f35a39f9a507e7ce16c684c4fdd344f1e13919da556596d5f9352d9445beefd70cb1b87624cc37ae359d424fef570f29554353bdb83781db17e5872ae02e5aa51ade84c1340ae3c983e311b36406170226488bf2c284ba0e6923abcb1ab9e40bf72446341d2925b5bd5717dc4c9e43645a7a789f301d25c2956c03d6a5baebc73966c53d8dcf891233d3b9efeab4674fcf106eb3bc586ba66bf2e36ed3a935354db6ca478762610ecbb797ad62022f78a172059f6b2defd1abd1b4d0c2a6229e635c023afac4c49b497b822a913ae7be04a48d3d0885e61bc8f7d7a18b071be5af9258b71a37f1a1bcce82d34195ccf15d75de63b09d073e944ec8d21b205ec90617b72197041098af0a36b49cbedfd631a03bf70dc329c9174e0d397b29d6a8268b3c5029469ed77e9d4e2205da3ff856ab2af11ee83a9d738bf6421dbc63fe691f4edeedee3bf1fe79881bc2e5fb3eda3b1cfee8065fa4fb3b6d5565ccb6b0a592ffed920ef93973a606bf2f77b8462d01379020eb8a41c0654fda1b6ab00b46d5ed54a539fb597f92eb916fffbbbf6dfe84a223275fa1fa8a8f4ca4b7d5865156c5ab68bc9fa6b00c2d1c38dc962ce4c7e062d0167836111f1449e20715344526f1d70d86ddc13772cbe4d49f34ce3d32c630154487ac65c4ebe5cb1307fd63dfd548b0971fa34f824b4065fb95e9ebf5a91efaf02a0a827bfb19b104ed76c5e107a66d42c5547ae57623e93b6ec9e47911c36e4361d8de1396a8d4aaae6e602aaf773c85470af8d43d055f0adb9e88d1a7b37e1710fd4974eca078bf9d55109ff579f77b779d453de56332fbba360f06959e4ac2e6e8abcbb81b4f12fd710b08065e1fa70d2d18f97593930ca188c16bc7f63406593a13d1a6368a44d19f9bed8ba0ecf62fa2ce6026a2475fd5413e79a798fed7a40743d59410527b062e0f83718d920aa938c2d6ca3115a6fa52de57a66825c9bd8e5dc4194b48e2f50b1069da4493ca4a3f18af5f271e82931cbb38f730113580963d06c8924552e27862d71ec432f89b17bcedf39f99f58397ae78328a7cb43893140b30c218708a21379881d400dda67181e2599bd3b8197dc7826409a93e9cf116ee5fc3609e43ce98d1b20f0ebbc10b8c7f39c58513f08dbb206b2d145a45771232a1ec86973170d16031bd0cdf9464dab3923142"}, + {"0000000000000000000000000000000000000000000000000000000000000358", "01c238139398c8a6f3e0c793c34f437a675e186ca22d0b03c6b720100fd5a2355d44b2260ec3313704a40df0b1f5f5f90c61d0c043a6027b8f664878fce82b176226af6c980ba714f5d20663492d423e7b520c99096a2def500adf1ea1321177ffff16d1acec0e63761d314d7cbb5bf934f9a011fbd9336b5d64f87269880dfa196930e419c793f4e14d641ce5e47aa3b3363c7474453d5ba292c97e12bd01446bd96bb3f5df16ac04b5a97057d346dbba00364db2bb82a6cc365d962309b53d530f0e40c1a86da26883e710eda6565aea382cfbdf84634ed9e70e38291dfd6acc2b2fb71a31054340fbdedfa2c971b74e947eb94f6e393a863556c90b3dd7024126c41140e0344bed35e2f2c49a1fc259177cebfd7966ae439deec608a037a1b5c94612946b19bcfab6f78b42451d02b63727417105e528faf6861a57434346391863f6c55242df7711f2cac2b7575b03742f93d3df08ab809311675956dbb9cedbb2fe2d069e22afcc492edb9042b14fd897a26c5c28322dc116ca454722d11279f44437c9d9585dca7a677725b32510ce39e353e88bb8f698dca46958e36ccb5c6063067fa69e0c08a04c474bf721bf690a92bd681d3ecf0dbcb1cd2d4803d4fb12d0def66f392b634d7c4498159fa7cea611c7e33871449d53e1fecb001db91e5c2fca345d7423287b928936c40058370e5073ddc2f00ee4066507f9aabdf17ab84941e369e223db91ffe36204aba7095c50f70269ca6b377384f3d3321e9d862d5839b29fa693a5d01cd2f949d7b900e7ed539e253c9d86af82f2b145f86c8550192c61f197badd3d7f0f9104288a59d7a1bdfb42bf9958579723aaf9d5ff1c2fcea21089841eb14bd52cece703c22aee7d74f60fd47dba0e9182772ebff2a39b4bc00ddeae9c0ca745ab7e8accdc32736d71859df15dec1365eb3d120603ae8e94e548b6eb9edf54496bbf5b8962e9f0497942b29fffc15afc10fe242bc5d2fd19a30d911efef606f51c31901d7b3fa3d5945630ae64c292c19676b2111a4b2280462b5d6444d299a99f105a08fb35fd900dce03cf07888b40bfcc12c31e7a9a3d24c7b9590b3408a9df714e6d63ff40235fe79ee77571f09ccd5d16557be7530a23967ae0b1e1815b0bb95c433fa9ba3368a65081e6780b6dffe95f00efa76efc4efad79e04179a11a8685097867f50794e4de82ae0d1b86cbd10e68d92e77739bdc4cb2345eb462d20dbef8d23cf26f92ac64bd1d728e3ec43cf7bdba962e4b2178062298b8fab4cd9c0c7835d774f5e59c6fb19f85f2f040a71466ff8acc403be6680ba1038cd1fe0011fbf2720c07faf4aaf06ffdf84a600003a79b668649af5a34736dd6d03592ba9aafb84bfccb51ea1cdef7a33cd550a3766c19877b140a7a66e484fb9ee72b0ddc59f055298e1adb2bfb9ed5ad2fa021a8a462e82b4bdf036b1f4211e77bb3fce70055ca3cbfb4e082e14844d4beec4b8739b66b5f4da991ae3ce754e9b4057fdcb67ab853736a4fa77b374a6ceb1504efec92236cd490b5234a3b51d813cf37f35316139a92e49961a71b63dab1a1454ddcde1f614357006e9e1cd87333c2f8c16861940c6ac36836c4ae445a3c280c60d4872d70e17bd3a9f9d996227c8bfa47c3edd136ad8475947e005bc9476f45b6ce5fb2a00bf2897c09ea9b05fcb8b12c62ab0a295e1b9b3d4a604cf42e3d58769dd7861120355bb09de7b713ab1d5fa52e0bdb77f223d96df62dc3533f0a1c5c5ae5319451ade29beb46fdce3cc0b0269690cebf00172bcc78fe8eb9856cca516c453348ebcbfce1eab279e61d54dc0ebb6968f8bfaafdd1033ec1483df6dd972a8e4c706af455144939f28072b000a400e56c1bd08fa46573ff5924dcac674d071"}, + {"0000000000000000000000000000000000000000000000000000000000000001", "006e1e15bcb15dbdc47c815d44b3bd471a90de82fc4547977b349d9537622316515c6f3b85cfe5b66ff2018178a7b3264a3959da30a953a576207a2b9392585e406edd179acc035dbd865673b74f0a0ab1b1cf5b0357854e3056ce98d48a2127a89167985b0ab3b35d461d1ae6aa276b7bb8327675f17e13d1e863b7de3c072d2ee2cf9fbb596346056359dc4c1bc74f7eb5b53fe552ec7b1001db40b7e4e27da967ce6e74db51fe06d369e5920fe77f0741c57c84f1a556b2f1da6b1e2e5ad2cacff0f059c9771591247294664c1679e90407302990e03828c7de0cf3fc89eb3cc562f4b8cfe82d8263cafdd2ba27d6f9539dfb24d9be0e543598ed0af92c6acf9a61fdc2770616003fba6b3a645d45c944dbb6c0f0612c352fee653857fd5955e67b9d4dee1055379a8e74a643f965c81278cef68e6cb19cde9b15f3369c621733e7c7f8a62951d2ecb2bd8bfa200601111f20c2cc6d5896345585ad74663d89d87a3bc4099868519a9163b4ff08b405106805337b15fc7d4e06d57f0d32cb356ffbade3d2b6b527ff6b5d3d3006392884a7f8e7b1fd6294e713ae5f3f4ab51178543506fbb74e8ca76f678f693236bd56d98a17d7ba243609e0cd82564410a2710a82d1ce4e26714270cb87c3164c4c3164699fd777a2561bda754026873c9f12144011163401ab130f63aa1465e6580c56915b9b66030191a8d78858cb152aabf091a3cadb8e41a6d43b1205ca93825010d28a9da91223564af03a8a0ed5a0ee1c428ea66bd80302e82b55b5cbb157e98c97178f5c34c8268c85d046536f6f25e68fe0d1ad9fbb78e2ce118645179113e392dc8b12bd1f181009fabf78ba471d47d15f97dd667b3d70f3cf2150f0a118e93d7425133ae222aaa0cf352219336cd460d3a4e23f98e81d1604e6c3178f4297638842acb9dfc2299b878fac3c00c307b488cb117ff24f542459ec7781948efcac4b0f083be43084f80a5855984f976a362a1babf2d7fd383f0fcdd266d247cc5917b5a565d8ba1e5a3e3afa5e236b95af5cb63f949617ce237b45ea1479fc92d2074281e58e997748fc3081166a39bba8cbcb469c57238bb4852e933c60fdd492ce9bcd525ad2a757fe9c0d45427dcb195174db8a22d41a3475c0e6770fed5f66b4541be1dd5c45cecae74f18dc54a21faa9f0a8f121a6f71ffa0a5d942ab84e1c17c89a62378d2f7002c3084ef160f1e238179840bccefee9d367e914fa81df1cfacf64ad03d946cb2b87658778192d5dae75f29a2dcf66465bf1791a9a2f6babb17d98bccbdc002133294bff267e7cf9d4198608359821f111cb9e7a9351eabe789571cf4f37b058e32bbf21db38ffe32b514756160f1d07117f13c41aa57c7af9c9a0dba072f780aade5372f0ec9bde947a68b49dc224ff19fef9b00d2b759bfc8c1dd6af283417844b46cd3043f632108330883d5b15a339aa28443f7e8f33165dcf7a5e315c7128ce530dfa9da66b1682b951e2d9ae2ad2b913de657668a5388e6fd067a80f5f35bfad2cbba27491a380227f52a77f7b78265ef8ffa2d32184251287a1de22e5282dd6967bdd5f29cff64ce15a49b5d31fc29d3dace32da8135fc35e4fe593c54d5f614fa40bc37ee9280961adb9d7032d554e1c431f337fefd1999015db3b0080eebbf6f09c68de3feb91347e4df90c927688c1cf8d411dd9664f6f21a6095160211b0fe7418456e66dff18411b02773013c6de70e9d49ba2b0d50e9b2d4a498ffff530ae64562710e869439d692bf01c55e32bbd1b930cbccc1ef38f2482d1040945a5c02609799808099ba2ae8d0e3deecc8306d1add12bb049342b4b2e720dd80a3a175d6dfbc6a6fde3ccbf6058adcc98aa165933b3d50a478709d787b1aa41a86"}, + {"0000000000000000000000000000000000000000000000000000000000000000", "001fc828b48aaf46eefee2b03a2221f8c36088737e012602db650d10db2bfe6353836642f64a42f9c08a09bfe726abed9845aa3ec160068c5c0c81dc888fe3257fe2a03ab2e949e749640a876b2e491d0930e9100e9b3ee0145e1aef3b70d25358dd20d18cdf3973973430d394336008137ce1654d76e63bc6b916fa746a1cbcd32455f6aadde935a533c2d2586f038bdfc27036275c261ae11cd17036758a3d6ebe0b54201af5da02764b28cc1b68b99fc6c248b9b0d9a1fc6357ac7c19631b8b37db0887c89e92040efb1894dac68a22a203bc97d2e7d963457b70d75ff9592e26bc503b44ce10b3c9936db61c2dc7a7f344d5de32022d6a741bda0f870918254e16b72c3f92f6fadc67599b309aedb635e8d2ad685f87ab2efe58e07d48ad47781d7bda57106166594bd9720cdab5110782eb361e2852f9c51324e4b92c6613dc3776f01412f364871d49582d352f010170275100bce051ebe323ad34feb154826ceea30b8703fe7f12f92938a0b1886598919d03ba3510b7011ea5227b66fd775ed19528cd643d5d53d91cefc0245f775af6160512c8f8843c49c83db65302fb0bb50eb88fe15453a6d4b05e21d6e33630c1ca7134ffd12ed7218b94641385d11fb541f67e04ad6aedd65ec9109515890e4dea69f6cb626d7b6017760dbb1332542355475cf1c9bb07551cbbd7e07ca357792a3fc51a0276847b23567deaf4767822c5533962da3e9889e027ab2ac93bd4e8af2172b368d7685a8aaaf0fefc340cfc09f82159dd53073c6139f5696a20afbd07686a2d9966d61dab6805d920f30492df6df386395e249d15a293c7e808e3d91034b3878e47796d2ee651f2cb1d543bd38593dc2edd4572e2f35bb1e98734f9965a2fd04b0a7896113f5ebfc3e8266abba94993752f5945e2dc2ecda79869d97934e3092a0d966f2e5de2b70049f08975480ce09358744a0a7079d1335d312b1313f0aff0599550bef2a602a37974eb2cffdc3f22b80497245da7dd4155b92cc4889b71bc8af991bf25f4109bdf28c58aec7297fb9324052f60a2049b39410b013b27e3d5c4d96c824b51c2a7c1c97276c0bc2bc622011a266756f986fe5434f75fd8b5bd85b43514800d0d7cf693d46545d29744a8fb70912da24e31928a0ea5b46d34c489ca505aa1d068cc876557acf0182400a95f542b6a0e2fd7cd913640c627f5c0931d3eab47a2bd5f18634e256867267e0adc092f0a45bf2eb506af007adc725a43df3af52039a9388b5ecc5b020a1289f7ec0c225b913d6293f47bdcfba176e476d6cf05486add3dac5a2d681261519c35cfecdd713b11be0ae60a9426e7ea059c93a23ace24da4318951cfe87065755feab3610cbc9f841812ca431aad1a87fbf971171c794bb156bad191a834b4e41476a3845d8b98802258bd0270c3aef1ac0b03fd3cb681dc64db5e14a1d643d94f0e0c00d3b9333797459e60137effa22b609c782917b2a3053865437b79c40b095f932703ce82e75b69ff094f352f0fbd34545a1839f1ca77c58a802fdcc3ffd6963fb68e7b5b524d0d80dbfbff16a070d6ba2abdc10e9095595413f92583141097c0b747d1645a54808c81fa918b9e502eed7e70d6b3dbd5627286d2e7eabcaebf57065b4c9757ec2cdf571bd19ae03255570a6d01f24d772423217a446cde30a8f4f0d04809d746aaf6b05f286e4791c6d780e482894e44e2106b28e51aad553ffc392e8eefe308e116cb700de430abceeb82a12856bea25e6d13fc51a5d81dcaf8308003105fc4ab660cebfd6e0faf749e5f213953b0b2fb9fb6f32d7adbbf97fa398c7bc7922d7843be94c09bec7c96e252147ab0bf7d9174bef339f303d0a22160bf1baf387e36f6e02c64b90d10373370bdf2870"}, + {"0000000000000000000000000000000000000000000000000000000000000003", "006d4fc54a0adf96ce1fc11c64e3de217fdf1ea7391764f4e9113675f7f5921347cdc9bcad7c08f23ac408c51171dd6e8a818c1861e4ddad260132eb1ebf872db71693311b8b2b179b44c9e5fc5abab0657cb8081330b55fc28e08e8e40cc37902d841a0e2d20987b77d9dcd50e2619ef1fd7a48b383d2ba4b5a7fdfc84b147d82b50d452ab2a2101635605561bd91649de60d154b8c9faa6341edf082019eb84a33b5f32c1fd3d5102e18ec78cad22680bb3161cbb64505b4bd355f03232f86292056f15b30c66490e9d65b823eef55ce081100fddc02364eb3fafb8351c96faf6a43903e792f187dd5c43f8db35fc5e6054dfabd8bb70adefd9c2a1305541af1d789eaff7f024d4b790c59908a32669531c8dc865b8c7876ba26349288364282de6adb4de4137e6fe3fe901b47c823c5417a6f8a96b6639b3b4a1b4a1494b6efeb79a7e773364c51832d1b90eb71a000f038439e1146d89b3740937b6a43a2af79fed63b5df0a70982ac7067d425b9c5d2d90f06eebad8e6360b0ccd9cfd1d7401e608d5a63e5fa33b08b2fca4cf3bd8dc9f56691999f43585b7a258309f2b1d7a7aab0fb186b7c0512b2eceeff7137c7c33e70a561f0dc01554de456d0647e5f7e4f5c7c450ace214101241841353fae09bc8a8f6bf6706ffc7cda431ff07b2f5d032a89b7d3f0f757d1ef779546b4e4c47821dbcd16903697889838bf8d9018f41e922286fede2ddd734aa5f7f94468bf0791dfa5656d138ebc75e5fda3bb952048255a288e67d3df49450fab20fd102f8db5a0136068e0f2b74550a72fabe6920b95b6cb30fb21b032f05ff7edf7aa1bed7919f714adce29f64e6cc7c82913d9a8785a7a25389df0ed714233ece561eec76950319ccea3f37e557df5e14854a8936c11738be9cae622e05799af097ef654c5ed72fd2d310daa94157e65a02ef45d1a248d4dbcadff4a9a23c0da166104cde9b462a656101630a714d49f4ebfa64240ad5b9dfc73240656bd34413a6a186e854f55eba59661a5cba6249699df5b4a6a0feb1acca9a3dde70804a9b129fd147098b47d871cd468f7d60d3068ab639a0ca0d54c6344d1363cf9cd3ccdd06aea77dba7e67fdf91bb777c60a940796b5d784a113ce83f74b450572306899353d1dfc037fbf606c438c84b203a2a885e9c8149d1f1705c766aa7757b6ad9d9ec455635ea929d65f507ea816fa89abb1c6809276db631de82c3c59457c5098b821ff4631cb8dc5eed7b1a32173ed1690d9925aaf51655b773db96e972d942efa7830fe8ae2e23d17d764077fedc57d591144fdc22562f8caddbab84a16b4c8126cbce87ccff940dc8c8456035468567a6a1829da14162e02724c578ccf9c66423f73756a8802fac4f13f4e820dc6771863f36324485d60cf5d7902b627a604aab5a8ddea272d97b560e43e8a24c10e339d164d0bb37d9f42903266e0cdbacc1d5d01e71eb65fd41d0eba7b7a065093b2eb7e7462bd6316c550271db1b012e9ef24905f1645f68c519325a8cb1e0e2b99fee909c847209298864aeee2a6d9c23b90e61b6b96732c6ae09b93f45e8d019e7bc749776a3cabd635dfc13d0a0d1d508a9e5725df9a92ce4a2c1f24c5eb685e2b2383c605dbeeef6dd668986fb2601bd6722d5fb9a309ff28ae86a1e969cb0a0457e73ee3b68932b71f730d1979ca6f052244b4100631db70a8ae4f3f75d7220cd3f77d9286fd83147345a9ad64e5ae4b1afe123327dcab55e3e3ef5bdcbcb291ff3c2cb2047af79697135050c2a195d8ed43c2f1c4fc51ec8cc6c390ce8f29b4b7055dd0a203ebae858f01ba71a7aed67f9e8e3b81baec9c5b1e85785968d06272443f6460bf9e5940687b90f05985dd827684fbdad90dc6e54719b678"}, + {"0000000000000000000000000000000000000000000000000000000000000001", "012230ffdf84d68f1b31a025c04f744049728b8ba401516fde3f82dcbce044a856cdfda10a6ae9b52f9801ba5562bd14a2ffda98a1fa32bc46190ec27f2b231d8487910c2a3a5f55ecb2a98a3065aa8d957e31650cca1bcbe7e29c7fe8a2838b113e8031111ced3e12261646b2844f1fef373426420377f1a70c6e1e1b8b12ddf169836134bb417c29dd71db00b6c3e3fd3cb71659f576a3e40b215c63761ae7e01545e5e112ece7031e48e9616304297c2b312884b8eae494adfe0fc41146b5b86612a4d3471104dd0afcc96643823ba6e4277932869a9e3111d95554c4d95822397f7bbef0b92c6329cbb117d0b2d17b13d08944fe6dbfef98fdb3051c286c89472e012d1d45377f7cce7a0aa0bd60c90cc95dadd38e0e2e9111c65e0973450ad8835f987507d2ee209a179f6be63de689274029c9c6d07d72390ec06489cc4d0c8375c84635c4b5062f98b5df34f501a79fad370e58c70427903e202bf1babe589df25f10ba38c7614d6867572791cff3b77a41dc553e6c7b0dc124ed151915c9ece614314f70a0ede2d678476214fad467dfd99005b3cf83fa636608bd2ee3ad80460c07cd4026a53e07b85e11a473edd81224193eb19e0f39d76aa08d21f14248b27a5971732924866b79e50e05b08f6b46a0f879a950f9a8c46681f3e6fff2fd333a3ead1ad84b89faf9845a8a583e834b315d13eb0589cb21604507b7d36f858426b1f015d01b727f9c0da77b76caf11fe3c93f675852e72a8f522a3fb3463c9b72d3179dd4113af7f73edf79d1e5fc07fc102f6c69dfda4a26713771ec66e55f6181e65572f5cae505c8630ad35908d7704ce7352dba0aa3730d1d46572220cf4a84a2ce8164e9d4bee0e2b77e2870bbe632069a17f94d8efa710246c66db7e401a7a7b0fe0dd5208645ad8b8a4431c2d403efaa6aec59dfcdff6c7f023764f5e992ae8d5ea2a19fa8a44779acbefca0de102dadbece101f81228c18c98b5189b748535d104c034b699556d0665abfcac19c8f3cfcd88d1d903e8709b9f14e8453852ae4a9c657fab42e0a690afcca8115486f664f221533326d44afba5c86a640a8d2dcb82190fb09234ffac08ba0a59064eef9517e39b27b652c3341edf4d1a09eed97f2f2ed4162fd56a2d07ee943a3e79188d90efb2928d5f3c23b954982373152e4094f142844ce5cb0b9e084109861c45eb7b8bc703d11d3be71d9ca3dbd643037cf756cdf262ecb76994c209fb9c3f72ad54f6b7463981c43fcd9177e6ff15827b5fc132d8a4885a862f2b8996f7ff0ce7a358b702112020bfd714185cff7a53171e61d4db63fdb2edb222843b07aadff81d5c0c44270eea2591e2c1e8ee02c0cf4f9936dbb3bab15d2cb62d9bd1dbbc1af819249b9d5b333db8a491bfa5662343ab2c21dd371382004bd111ea991a8958719742e49d72c913866d8372b20746c06dc1a8b03f5bea64aa9700d55d1535fe3eb0862631046a37b95b7221185e9428481060e1a35d51c2f95553f1c4ef5e8c64828fd6bb32675151cb8d506c2bda5f85512cb3c17c509f22b3f0d7b7454b1405ac6fed39f19d109c3ed3905b1de4b070fc61cda3011d2bf4ac85564b75836741ba4d453cb368ddfee0413311d47dd0ab204c9ccf1c84fae633cce7571954a0d1742d65d0706758cb5215023bd815535a63416f61044876adccee5a68b8b817348dd85016326be09ca114a739b7f5da90f1da2d121dcae5d205d7ccb268713ec5d456d125c97df0802f3f746278530e7cdd489126b825e8f8b72b13211f37ed2a48145047c8d00d621a2bcebaf61b0397d49c49c742f8976c98cffe5101d7fa3da662eef01f47a25fd4d495946e71857f9a32e3247019450f99d9f9074662472ddcbf10e5fd98a"}, + {"0000000000000000000000000000000000000000000000000000000000000003", "002a1775ce594566fc7c63c3862029fa4406954e2e07976c812720045f0822e22da9ddcb3d9ff6b8bee90962eec23418527f1386417302fd5fd22841fb69804e9203c047269397b828a5a85447b4adcac114019c06094cd24798fdfd2cb0d1a5c4454ac798d97e64542b1cc1956c1286eb6c30e5db54dcae997c2e31eda0089c1432fc0a650aa78b5130ed4c56fe685c38dc105c1634e97be38319841a18b60ee8c36b2487dd2d960e057c14d3d285c1fdff40e592f00078a1b20dfe13537215221f9e94c5fec3fb9be6f99ce325817bff432876ea860e8c72c90779d3d681694e157a4830b83e2bfc84babf9d2d4541a655206c2ad7c5b183de818e10280a63394b0805fc7f92305051e03179ad1d8c085a4686fc335ae455eb526c41ad739233af6f3f05531c65a1c5676cdff3b492c3d5efae19bdd10b5b772d1fc00a9230486235be4233bfa44cfedef6b97b8c8900648c29f48792dbd8c5f2bb66f980d191879eed15186ec275998ec66b8ebda3460352105926e6d5c8fd0efeeeefdc151335b7881835b9d706de21fe599a7a29ca7ec61faf2f81b314a7234ed3d335e9f2d534b40272be855ac34aba6d2d2a9c2861643f8c885e0f912573e4c45153156b948575bf4eff497970554f3ae23005039003bd89ddfda584dacf2e0d824c1c542a42318762c29d0dc982b8c425e952f73fa9837353bf5e081542a0571e082524ccd2f65550b9e5ca063dd5d039daaa2e86b7e035d501247210eb4ce1835e3c06461a95b40c8198ca22c8539c0d736fd76b6ad17d8ac21f1bd29d14d49f0ce07e42d7cd1a7b61239013a3c309e8a7e6aced2341be6c9b38e95a094b509e7ac2902630f299742c06b3d0a21598c0f009168ef6da5fe13ca40f58b75b4db95330b7ae0e7c149705acf925ef3ce1bd7840ad3241f8cd171d2bd1f7065b4d9af52801d8cbc1535f8c6b8f57516d30e4466136d0b9b94126012638668afd22d303a5bdc6d269b6a5771928a602552d27f0c3aff0c68c51e5b4d29f9b40ab7a81db12125f1459d7c1cfffaad46eb0a3fb99dac9fd85dc16f69df8a3ccd04fe0c9340a15ae98b12cb432281e1dfdca29871275acddd9727690a24a1ce81fb29c821c0ab2dd37335949c462053355b6a496f19ffd423439023f3a37129e053b52f5543bae88a25ba19707e504c27ff17c9d512f560b9202dcfc7f3c85475c74e80507589adb7a05abd428f15981c7c1c724a55c0d2121ae0c75aa4c03e0b27818bf4c479052e5609f19743de0675816d6d167cdbb65df7c628f5a1aceff41a2051b3cd2a91674854730a1667e5127d9718dda64354c961e887fd32fe36c6ca7efc0e6c412120b73478c1c832ea00b2db109b22da4b18928a307177a3eaec16201c398a6374583d98d09a0846ff472b333db5bb10274ff77d3b4b275ef5861e9a31c8d74ca4e2ab2b7027568a95d9679233ee6d4fc53536636f449daead206f286a103475d9178b3f34bcdca3b4dccec1726a71c721ad4138f872ab9020356b4ba413df93f9978021189c0d8adcbbc40fd7a75a849532fe1d3457337bc37040e1e6416825b7567c40ab24d7e919f9e78da8f1b89434c299db6fb32ca827f081c8708b5e23ed337217b1a270588bc0f3f71924c29ccb75cbc3fc8c80303161ffc84c4bbf8b58080831030211c6c74375a262b8062b53ad225cfc071d58d94b6bce71021dbe52d13f87d95609a6993b03c028a73a4f41a5348770997165f84e3bca930cd9f132406dd66fb66c1255855fe0c62dbd62e5804fd7ad6b3ee474e5c198cb370b482745acccddba1d9a3bfed4828bbfe2b8f672ebf78db0efcac51e813dcedbdd1e1de854f514df8c25f5dc71d15021a74e6b9537c09b3f9b561ef19a7d37df9e3"}, + {"0000000000000000000000000000000000000000000000000000000000000403", "0037d3d925920a7bb424b0c80b94bda2acb6fa61811ab235f33ad0e2738a9b635a1fc8f51dba091de56009f231c1c7c47fb0a285973f06ef78d282dafb71281f065fb1756c9129a3da73aa224c062936fc96a46105228b6e56e3b785f7b0a8996e5f435a45a17bf24d31c394cededd00fb2254969f39cb80a9ad291148aa136d0969506c4febeb5ed446a161b87949a32b37981df661592366d6a7f99792ba8656dfd1ccd10fa94000aaf4af0a5713b9cafeb6a66175afe271d3f88200146921658717418ef5cfc80f7ffb9003833adedaa80595f99c9008765a55e0831db26538413491d1f0d6081a3bd74ad5cf59421280b883b24acde924d40fec0736692e4c841513b3553b029569100753e5ff55f82a8aae42a38e177ec14d42eab14a0050d99f1ed1ca195da9b8909bdd47d40d12923540144e86d59f423c1fbb33244cdef909720cd5b872753a2b1e4f1c60ff0307a187e9879098e5b2573938c57a97cad27f8378083f8b112df08101c184bcb619f1e5d739899d50b51964efeaf26174e9c9edd5e0e9e9da91f651d0032331bd9e3ceea89d4f5733c5d8754224299ccf35a0781633a2467e876f468bba69083fe95276e210de6fb15f6e73c515b278a5c0d9469ee1c820b5d2711e8ba31a9b27e5241a283d468af873f0564d32d3d59bb4194349728fbaf12b4fd1f67781d74f05eaeda4ffd4d60943f4060b02d6faecf8b4ec41d62c9b2a19bcd80d0daaa21e5c5d586bfd9c35115cc4960698af774d550abea1f5ea4bcbbf0e8cc27a7227d5e18694b7bd95155965551f1ef25fb393d4becdd6313a7dcfb686980bdd1c4d8dda32338f6ad47ea2448322193eb25f6611a09d6f9868f9cd8c85a4f87d3fd98b49753fda4d138a4c81c6d90d731b0fa17ab049a3b70745bcf7b4287a83c592daa2bfe714059ba3c6a4bf0d6378f3b7012a85bbdc8df0f535fcb498a76c9c594a599935d82f665b7a8635de9df314d48f0e68be267ff995b22211bbf107db3614cbd8eed1e6ac99f0e900fcfc1c4b325b12e43ab7edb3e361b397f52298f24b1c361a9e03e9cfc99681d9e03dcb408067bb35f87935d4201f186836d9044d977d10dc7863297b95d273487f286209090569819825f8d099a392ce75cc2261809a838b11a1fde4ef958a89c586113b3bb78fd2c3ea1e581701ee335d045745fba4bab5d0594d3ce72ddcbeb48404a495c0e1497bbfd3dd38f716cc7602cdc79861bd167305f9db8c552c9fcd6571b435add986ef1b034939006c69f2e51ec96d68159019ac90ba84fcd8b5e9060afc88a948cacdd26b8a416ae21d03b6bb1feaaf15975532514c53ac7ee99193b89dd0f1082813fa5c0eaddac6fc49e492cef823b67eccad7dd78911380725ce8690f159cb1f205d781c1579409721959a297a0263a5ab647231d3beef42e5947b4fccda97da82f92d839d27dfda132d42b44342c535fdaa59f13ef8130b17cdf6c1333e17ba5c949ad1f6fba777c27d237a47dabce40f6a4a2b9f1d45d3b3e3ba43a8bf5dbb360bcbf7d013541a6ae713818fee49b665cb0432448917fb6ea2f0500c7a80d6622d76bddbda3129d3d4080ce0def2290b90e480c621f816def77184f8bd016022749d9ed512bc015a6c429f8d3a39ab618bdc1ac2053ad996ea098fd6d24fe2d3ff256a7181cada84cf14fe5ec8dce6f27bfcd0f739bb77700311515d26c40daffacd4338bfffff55e51641397b49831e90ef772c0fdd49c14e3894cd5b566fc6cab2aea3adbaecd3078dac3ba883069edcc401b461e0e7f60816fd34a22a1e8752b1cafce7dba3b37fbde24b7da1bd51633a0d66a903005cea113985f48181d3958e4855d4834b4f5125b33857822b73cfc908c356e05e61151aafd2"}, + {"0000000000000000000000000000000000000000000000000000000000000003", "0066f07022cd4b851d91a1b28726eccb69ea7eee710331ccabe9e134851a95c512d0bc98c6bab45e4ac90ffe5c8f2408f463de3b24398f27755e51a5b8bdb63801dbf777dc24a19be33777c8fba7da22239f991f0448c867bb5bc6e943f2813c832577d6cfdfb7402b097b3b2b21d62ef9cf94f25aa2a0dfad983f722daf09c412ec301f9785e716d335c4edd79a5672d66c2855d574b11b5ae5bd5b4e368a06c79d4636175b096903a509dedc0f28cf6c779a5597ee87eaff5f5a17990a05b310109bdf6fcc0ac220d5654f2cb3344842890908c34c090a56bcad0860936e22423c2a085585a31cf0154dca18af4344733a3b3eedd8cad5ce58de5506b9a99a698cbb8b212b70eefc23945ca01647d5d0277d599a95aa7e4b77354640e238dcfe1a19dd25552ab531f7c10d2ddd317485258f70e54e13c3b91c5a301fbf3b574f5151808f1478016d61c5a2522de0e1023f145e00c6cabe472c7398dbf952d32f7e9e2fd00520ee95852840d1c82255cdc64cd01ab2bf1fc2850ff2cb1d53b1a313a5d554b1d7725ccd2ce91daff438112bebb41f25319aee94c0d8412f4dcb2239776c063f65bb5544d694aec9c0cc39195a3d67e0de786a10f6690602a15c611a008509a3b58e91674ddd23df0d5023033f5a353be7f5635e40c236fe818195c8e63544ca845f1f708d083205365539fccec1431c349802d8255fcdec0c2d7a9b106a4f7b23e228aa5b04c509a6a676dd0b3a549ce65635bcc89d7f66ac9d3fd81137ba333673350dc2ba984fb649b8e3a26b3d18f241e4a7f4e0a8ac8bb6500a28ddfb51e2cc453a283e085d1cd57f4dee72c1a9b2335b747d6135137505f60d0aece7a6debbdb3b4632471528cf591036161a741cd403a7614c2178d140f7e9ec49ef86b09c36ce52511f26b3e898a6caf4e6561c91ee2e86e933bfdb6001433d2d7411358fa466e464a63c4baee734795f535694eadd5de944b59651272d5ac044ab2eb03c18971d452fa10fd318ef2f9e2519b8bbc5fd977a762bb32ad1b5b5f1729f1bf7d96488184b4025a26833d7630484a34886c857d8866e608a4b07d47d29c4f82e251aef12f5638982554c3a87b04974e972be687e0de810abffcd190a1d855a04b11225f3db9c64bcca081b369253bd7ba388eb8abd7736f73faca69f4ad65a57054ca733a845981b30ff4176bd363d92d6e7fda7d617b4f77f72656283745e1b5025690633128bfa6456079d65bb1291e2f1c2d4246a11523b223b2198ec401abe7cb6f00e42d13bd6221b6312d455672015239c0b6c1d91e0e34795ba30a2a69bb3f58a267ed69d7f1222f62f7bd8e02d6eced1e6e7f89faa295eb83ca81028194563999e58cdfe39342e70895b8e47dc9f9312edd0a8f8988d33bc2e11345c9f46d507e73dc6bb04b9e33ad012403752b0149ec4ffdf02ca7f365ca238bc8ccfa0a14ac96d2dd7713c3e17d600665ab6b9165758f86baee113b43b15598aaf4fc1ea0897360233b82d804091bb0fafa6c8ea0a5c0deec9757beb321e29cca7911006a33d2f462420db5b968b14d6aba9281a56052ccd7a606c2c4975fa639deb136f59bde51f0e4dcf4510e5c6f03238bfc4fb082700537ed68a28645cccc828e79d7f1b835d8324bc92dab9fda587059e55fcb6888bf2c7fc34e215d98922a7e3bb301a10a568b4f60c322196a6847a212cf275716afe3fce196f616b7a896374d0f11271014dddad9bd95ac59537dba2f4e93e7c3ff553068ca4d0eb61c394cfaf790d4690dadf8eb6d737e95390e34f83e8e989779adf35d66d9654b70131bf03c7587b573cbe4cab79dce62563467161d406730b7d7308cfe88d298575fdbe4044dd936aca1d11496fb2150db476093146ae4a4a6f"}, + {"0000000000000000000000000000000000000000000000000000000000000016", "0012abbb486c2095622f0530c5419392f1a07d1a3c037ab4440cd0214104d002d69da5fb6b27e49dd3a5084cfc25520423f4bb057791ca63619e24dabf439038c44f4d26f194b3f26816a0d7ff519e18ddd78cab23e574a967dbf07bbd29129a21698af930d11a84f62c7fca5755924e69509b134e9347ecddaf5698179f3033cdc73dd7d819fee3940cb2d2716951225f7a763b198c89b855a8d8b8c3b66515c5e5b2225c5e1e7701298f70550fbc448f6035efc772e1eb34353b0dd308e87968d7b146519c6332dc6cb7b8268d8c7956ed0526ab53e6919637d0c7c2445ffdf1be41ebd52bdb0aab4422131d20139a55a2d857f547ae931fdfd5bd0ff2393a400afab482f0f5d2a4720df9be24793e382194deab364a008db6e7e2be6af02dacd59a0a8b4d1464faeee212ad26f4de44b329d8ee0e3edd764552304b061d5ee6fee1727c265f1b4801bba39a5e571e023f098d344642d90bdeb18172e7ccede4b090d377317857126455ac2909eeb68940b50411bf5292f5031cdd86213ad48815cb1fd9ab78ea7b6f1579fe12a12bfc65de8fad90539b942539d0499a0152e56aba35039fde89b1a266652cbab6e2fccd87ead3f7194acb0946433716d3a2c4aa4cb15893b44898696487caab06eaf09db1a7329368c4f2a2854c7a24efb3ac9e6f173a839846928cece2c0a86ab8c45332adf897a838156ca77c7ad288356489e3a1975311e9508b1cbb9a187cc6db48547d99c84cb450e5ba645e9e85fd77ff3b72fb47416053e1a0d7ca0e45e79c929cc43fc3ee435b04492f69e4cd87c4864deeba76a1d5b0b7a666249b5342d74ac0767a94a8109af3674e39641accaa461cb5443be63d45552e36c5843e909dc7bc138e64387d7f1d80519175534b6547d7d212b2c2daf802b548c57384c9f1f3f7c607c6c632dde02b384fff9fae0112877b451ad43bab1438cdb2f7b3ce77bf3a26dc13a804a4495dc113b88f3155402397a0a03937c02e0e299dca552f6551df76817d0aecf95ce702d06f191dedfeec198990f85b25c646d648b48d95f30fbf80012e3974dac413b17556525ec919af6d1f9430c7c42a820b50f3cd909b242efa2e6e5a944ad76b1e5433171525885a53f164b6a3e380ca2bceb374f01fa1933ada6346dd74ae53fc5c764ff7781a567547d9a6600ed6d7801d94da713226230d47df06c5752a57cfc0221e0c4b3009514f5d2c4252adf3e2399bbbd822b92b467c7a6ca2e8a1986d33bceb7c1fed1203316948502487b4bcd96d090b0ea7711ee14eb64ae37a18cc14177aad4bda9ecbc5bd823b5a145ebd3cde9065f32dbb4414e3b24275d20e4529c8ac061e73d1d3feee18a612e2f8c6772c56af51e125b8935cdf72b6fd87281ecaccc42dce5bbe989905de557e039b333d69ea0180e6a6e3482bec7074511c11291610bd0ff8435a1e8b47a0858b79133776b3b333b255bb34ca5aaad20b5bdcc3878329af57ba581265c70bbe30297879ae36ec965e76504c18b94e665eaec443c209d0319d96099423f284a3c5fdc74ee1169fead76b2ecf5b6f9210900a888859236598eb54aae75165fddf411985610b420ddd9ac51be3455dd460f8cd56bde7ba4fb6c02683c703ea21b451794b747be67b266a0faf5fb7b702efc30d9304e1e5bb9a01582349d54916e24e1efe0b048f98f3cb6b08f676d0b668abba38413ff5db6b272435680a95d567241454dae7bde15ad40f7c92d235605c5a2c5b56b16b25c7b6a2599e3685ac94c8b5036718b4875361f32a7a504ffd87ad32f9189e1eb82975baa8d0d2daf92458182748574f2770cd9d1c9505b3095225824c06d1054817724e50ce400d5457a343285eced8782b21d85716affdbc326224ecff3150"}, + {"0000000000000000000000000000000000000000000000000000000000000003", "00027229c452938ea70bf42bfb67ac95cd6d1d00fd2e206e5d4698d08be38733fa6d5fcec27716f4a77b049b93154f9b2e11ae08a069cccdf6b453437fb7d010f1a1f32b5b7b0daaceb194615622f5692eacc377082eaf3706c3ea6b2f79e2d812c1ffdd28b490afbc149b52f0006185c3624535ca4e6778e2781997993e32e38bf1e87401c3e142560218554d1e658038f09254239b3e012e9f538380b6c05fe868d34a2d1fb0eb0c4b399d823a9c9de897e7c0cf6b1a7ead90bc50dd1c02474ef3cc166303e1924df7d29c7e2089d6b6723a75745b61a63a9f821c87567970c76a3c1edf320b469097e8945b92377d74d5b99b7587bd858b6eea321082e6787255ecedbb9bb18f31e92e4928dabf60291c2758e8fbe57f19b08103c3156672a5701b0f3e5c4b07fb33bd2571a376d4cc32b7fcb0cba09dffce726cc6f42d3922018f38fe47f0e44f41870f879dd4fc013980d1fe97b9e3a3437337fae41b20eafd5cc4a6116499cb104461eff772a70f1f79077a4810d55a06044200e8f2e233a357ab90d4e76892111130910c3b29745ae6081ae10727a634826ff6897f0055bd7a71050a6d26a141a3f27659b389d3b714a5dda61b76e0066a9b30be5deb1f1e3e16b656d4b83ebcc0bb165807e113bfd3ab9e21b0f772e52321109d49ac92a33410d835807a879630ec1d61769ac04a620de8bf42ad043d6bac5004214a90a181ac77c838f6a318d69ecc18fbc63961d40502d2bdb33370e98fa58557ed8e8d086a1771931eacd7e71672078ac4ada9870b9246e05826b30e7057a749398468e1166d5c8f3efa5c2bc608143a790f035d5984d6a25045eb1c4a07cd3daff44760c6c74418777b4038148d143fb1a5c4b011919513a14ea9aca46213e58be28eb3e8ee756babdb3cbc15432fe28aa678c1e68773667643cfd11268dc7eb10078842afadeeb5f72dce239b85d7bdd51fbb805211c6bb66b902763d353aab353989ca19a268c34436e031018da9469d669c87d845c51d40d6965111018382e00ddacd21cf0a56a21233fd0a033a9998d74b2760def9ea4f64a6f11d4831474ba62d5e1b03e75fe3523517a09e6b339cdeaa513a040f6a6f302a4d8c94d12d703d39e8e1201295884d4d7e8a78e0c6b33f08d1dc386f07a0e5351c40a431efea3c37518b038ab1801b5d121ecd1967e9df732dc27d02a78bc7b1fa51d2d759b2261d15868998244b02f3a449252b6d51f5a133b10b33651f46bb405ca1c25f8a1e7a5a45fe13517b8fe759e18505b926e55b7f5626122ae16beed8e0801d8df9b9f0d09853d60cbdee2b549bb221a7b251f66bd80f2ea84c175bda85b9867737acc171f4b3b0c47be34cc636da5a50e63965ca63145ef4b332a95463752beba55f98f1bef570ee1e0fc7e9eb0b8866e00989904bb0c20ed1614006948ade62d302aadc9e40830519cb3176cc1fc0080cce1fdbca9d655323cc41f7c47d3ec0e35cbf77998debfc7c6be776955b28e2c29d4f1352387e13cb5e84347ecb8beebdf982b7a07adbcbe630805174414db766065034f1571dc78ca1f19bfeb7e1d2cff7cf022300e95ab31f200d642b20d2e12d7d7fde863f878f19b5f7182e0e6d73e14740e9f1151e7c4600486602595f9fc4689e76532695b017e707149e4ed0b6a7cc665db42644dac1a7d28ed0a26bc2dee4af88ea5fcc37aedb3872ec5a8bab9dd0f0e851ca185e39eadc977d0444e27b2f0aafae44f5d56f42b17bafe21ead48a80d5628263985fbd679606263ddcab8721c98114172dc4edbf1e80383c72a810ffad98a91dc183f1ece3aeb3b5fc01a38fd0bd3213fad3e2ed075d52eb2ee8fa774e91027d605a055c1f4831659a92f54716c5e292b5e5831672c8b8afc3"}, + {"0000000000000000000000000000000000000000000000000000000000000007", "003b58a789a43e9b6b98f2155f4659953c81555d9e1b93f33dd8487c55fbe9f93f3c6f6732cf0758066715473740121bcbb31d2673de9adb3e25884f2e9f071b1d2556ebd5cdcd3a0b1770fd43ae56aef457dfce041e7a36e8d11121f2c800b359c0de6577908e5aad330399edc6a8642f64f3c554b2ab0a3d83c3daebe10a842feafbc5a18f36f250de47d60f1f866dbf92e21b568d90c6c9efec7009aa84835a4616b4c43fb77d0108b19cb3c3c5e776645334c9c3100d91cc9aa6280c862c09b316f38f2486e70ac9f4f341cf5f31bfed0777a1d4f2205c9d848c68282e5b0d0f3752fd1cbc136d8d7357081d7b093d659291f9ca89986a920cab01f928bcfa86eb7f28f65450aafc77052a225964af0e964f018eaadb93d477b59d3dd685919979b4be860cece9754fd961e9689a92f0dad3ee760bc99aaa6d284792c57e54c88151da3615704002b73298de031e00b9ee4659512cdea39821bf28b71f9e618db3365310e81091835ad19d5e6c95289d4ed9ce4bbc39a03925e1c957ad21b2d9357c05059feea319b365ae9068502f5b9885d7e1476aa41884dc521eda99793e034a0d608459c9a6e665ac7bc53d39e006c5c2a7d0a5ee24bd616c815f3941b8a0256a6ec9d72676fbdf140219480aa6dd866b51397493d1e6a2d60d3d5b789e671ac394f985620c0168b824364278033a1e829b7ad7065eb8f10b033150a437f48b22634ae2900ab4a45d190938e615d95e6fd733b5c1ed44d2afdb2a3f6f0a198cae5ca6a600fb418ee30e92f1139d0cae3e1d5f31338c84ad1bd72b09dd63c3661f023d757cccfb81073b6a129f079d17dad8211f552387fe5f1bfa47160a2d83c310697c795be047254944727a338f96c6a01163fd7b5ce45f53261114abca4547958776d8eeed39401ccfd55171aa93f2d4832b6389a70c939eafa40125367d8052e671857e82656a5716de77d39cb9703bdcc31eca5d43fba1835749e2f95843312a1bd07a02808d25b24ecfedf6d88070f68638da4432178170587975cb122138d3b42be9a154530cd37ed89f65fe109fb8f44f8fb9e32bfe820a8c267378cd593b2517224c16b7a1c9b24c880043e3d75debfedef47e3d9c15161cceb54d7eb0767db29b276a393798b77d970b7275877989a0a1d90f43675e017fb4171e94fc59a408845cedb8156eff8bd7a27b85e3230531eeebf7242a045df482253105d95183d4ee67636142423ab85e15f085ff115a10cd9df82231c123ceecd49977e3c12911cd1cc5a2700380e5556729f0d0f2dc2efb8078120ab48dd91c9204f0da71a9622bf0f9c968ce8a7473725bfee73a4a61dad649740077cb46afedf7cc021244e165a40fd370eaef121b9c1800acdf26fbd11133415ff15e52d50cee1d55bc6dd84cd5888b5cae770359f3c8dd5214b2ae42737eb4d6f925010ccc6b1d12e8dac86b691fb5d3afb516f6cbdaa1efff12aef0189e7a4f1b5fa0bd8e73d281d01aaa9d6abb2ef8ec93468d121b653d9996403a7c04f43b5f7950fbebde0dfee5de50cfbbf5fc6064bf1ffeba8de2fef7a3d734b21277bed7bc91f0f625c740d058d6a59cbaee4019e67b69351f332bd2c0f5a88577b5c589594efbe1211b6e0b5dd3225ac87d42f9c73542a20a66bad5800414f86a4408c73b9d24a209dac245d971483f9f242ae6fbf7ba75db83f95ae363192f91fa0f9dd9ef420dbd7b9d01e3040f86272279a9f1e7c70b1f7cc1592cfe9ca8dcb5a7edea3d6618e4384c99c64f3c66d807354e42a778e777cffd30e26abd99e0e7e1b3ea410bbc5c604bd7aad31ee94275c7cba742d7cbdea8b213177350965602ef06d30153b7d9de2924d93086a72a0eee4c26e7bb4d9a1b72e47af0d694dd000b4e38"}, + {"000000000000000000000000000000000000000000000000000000000000000d", "001d3a5e7d663d53a3234107da4892c638e5d5310d03647e6b65b127b1c818b2ee605aa1369a9dbc57130c7e464079ddde53f199c52ef3edf3b15233f65cef12ac3b49fddaaffdc70a5222175f5e6d814b9d04ed0194747430122a137e0a91048e5a2e69480b91a8c20b181dc853868b3c8240233121cf11a9a4151343f10bb4d3e7890d9a6f5b5cc2c66bad89fb0fa6fc865e22ab04ebc80d96efbd4b124ea97539ddf2b5d5572501833238f2e06f6d960ff0d6c4f3aa3a0dccbf94100e13c48797954883d651453b835701eaada9d848cb0bbfcd7fa8103eb5a174913bc06b36958db9f64dec1d2a77cb89dbbb49724d9578df34e306e069bd2926022bb3386f255b45f0c1d4640a785225445b188af30806023c19cd06ab225811993829b668979747180c07b3611db48e4679a36011592ea328b4c720dedcf12f669f5cd95170f2b01673f8b6599fb51921d05bfa01aba1270fdc426d87e955034ecb77ca9bbc358bcf11fd26d317aa8787cf98067ba9f9430616bedea8df0832a654839827632378116722b6d578fd2f4c661c13727da103519fe5903b4414ddfa61adbfc3d63df107fa2dbbf094a382fee5f428976ca735a275ddc6373496b3b4345772b0d345e40af1ddb22e78f2fab84e0f7a230d5d5de452f60e21fe5ded0c6a61d37ad9861603ae291a177c1f02a184a2cb29cf3734325c0ab606d01ec2e83a7945f9d0d72daf7c1dc31105fc12d17abb347c10a939b3df7539ae6d55853e88723d4c7607b1c8f82fca9336f6dda8ad60f7c43f87ff9c86f53b0ec326459de63feb95ba3e41611fa31b20db56ef0bdda6163f39125bfb11b3baa95090b788639edc0011c75f34364958a0dc24547ddf62ce1b704c3c758a3044c5ebf51d194990c4835598794ca1be5b96cbce32f59e245d22cd59e723c54416c75515fd1e5587450031c008d044b236ed73208022f3cac590bc310e9c0a170431ebeeeaa1b9a012f27f226072a0b4dc47ff29c75deee315d1af76e34a053e78dcced8b0b7df192c6249d76ecbd147aab54656a2e28842d0b65dd00906c33fb7a463d2b1c06fd564853fd4d28821d6cc8b2132a9f69a6c84276f8b62dd141f3672f2ed389409104236e8384eb9d34379e366bec2353a3e07f22f15154692f4d2221e33cf2e6b8ce76a1f6aeb177ee8d50b6d7e3ef9db45d595e054eee2350de7b4fabe54a9178a62216720fb814ea686753bb6ecd6f2739a9d22134c6f17315b11bf2242332d02409e0a7a877f82c24e5d5485dc6c4b9fe5aca85942cfd13b266079a21e0e96e7beab135e7b58e06484e9369d9923c16ad6bc252bbc0c94de7a7ff1b5b42768b440320153114ce2178f00ca7fe20b09f545ac35dcf9d99f36347a0cd520b03e632f16a34d8405251cebcb7846475db7343f00cf75fb9b0f981ae8f4302aab1b07aa00929ed525032fb760724c0f53889413ce633a811d3379bc72df05fc9e1b9fc20c9947c510e28d1c32287553e73e001c42cd3f56a4e43943ef13842d600523c8ff3fbb290292e672471ed8a1cd1c9196c92a2e1307cc79b4372c0897c2c5a057b914d2437dc0b837b13ce598575508525db5b9451ebd486241ed47b1d2eedef2b7893b65b21690cf2791a1502b1a56f0e20e331a9cfc8dee085c21456d4e67ae85b12126f43b5e4081eaee897c0faa449ee36408ff279024fde1d8bb89cb05f67aef35157c5d9396606eb30ed63df677450634c19a970257e1151ad2ef1a17bc8c46cf575e21ee219f5883c50e444e06ade9d5399c95a3efb124c6da002ed608ec3c4d53dc1e611517885c059195cf84c31eb21de5001fc17728e0a8b0bfbe2eb8f514ebf3d29ce256dd4939339c7a14a644e5c0caa4445adc54211fa4ca2789"}, + {"00000000000000000000000000000000000000000000000000000000000003f1", "002d56c2e04ab1885ef230446aa853491c0af04f1b4d54bfcb7b5ec65796b9f7dbf9de5e06d9c5775988105991f35827dc65b8a673cdb56a2f1a0a36f5c82a2bd4726d6294613b4f5ba335162cc3470bab9ae5280082636f3fe2de79e2d1f5bd3ded7cd630b572813e43647aab7d51bd9da4cb4579b6d8d3e3099d5e8248211d46b0dc158028c5da1347d1307ff68a6657e67a313f1341725da4011ee1774919fcc13e1a3a7e995201a09f0ddfc6ce5bdcf9e4fe9c28ac3a0527358e391a6d020e4b12a6fdf3bba524005bc7be7ab638f50e01f5e79903c122b76123f48c9c4339c934dc9ca02a49e50293311f3c4734bd696fc56ad9ead62bfc2b05051261997e535f2759c242d09ac66f1943029f1e0f1d604f39340c6a69bef18998d3f18a978b581f0f460c53dfd732c92f5f204fd34c23aad653c601bf8def15b09b95f4df7971997b495c0bf7d4dae13c19bae0038539267c934679889c77844ed2b6aaefbb7dcb3c2183ca521d22c319d675a4d7f6e821b9bcc9745bdb11f6d154ae1089bdee6173c1ebf69dfcf8894ca4433586342e47aebdafa26af3e0e069450b24855cb3470aa7db853a257fdb6034c15e87b77e84e3f5690a7720f09740d7adfd65750a53635f5f6f70ed64b411380d9d2feb241724d312b0313514acbd394930f5dce11661de2c31995b4b6c5962e2f8a574d6e2c83dcb17057a4b6b0e86f363bc41529ea93445a8b5ae39285a323d9400ec7046ddded9b334f1698b4d368f140e0d07027f0ce09c1e8974bf812968d359987fc0b5ee6b4ce847931b1a1dcda07236624b55505b07435afe960b448988f29f246ba72423f90463e55526466ab0e21dba872ba1c9dbbcc0975570fe42a99abe8ade73be1304de1cabcf7efd7da2c9e2eb5b85f6c260fbdf3f23ac240fcb89175c49faf437b0e34c0575aedfb4b700990ac41e0d43897d9746f48e4aaccaa8ff1aa6dd4da56602dfaaa3e55686466b8eba81db1a5bdaca6e07381afde89aca03747d90bd422440c4579f255ff91444512b3769427ff36ff19abf51ac5b149cbbb6f90d7580f494a33447d9fad0f516bc19c45bb5857a5a40a3f2241d611f6f9b5f36da41ed374a31533d004a239c2aa63399a6270cfd46f7da5ffb6e22b158d52442f2f5348f6dee85fad5471aa967d9d2a1521a087902b629bf4c99ebfee383f2490bd22aae74a0bfba5820fedfdd259c14ccfa840595983b67b31230fccdd20af299f860c905e590ed50c62073d2925919dc14d40b055d604764cc07cf2924967de559915050bf8af004b9023e64da4b85e4df31dee0d280a2d1977c80ec1e04c7690d91f076d47b3319f0ff385df1d8be5e2f1bc45c29f4ed1d67f9f794e62b68d26f51001bdd3c2ef8d6a2d50f363d9769971bb2d426771c947a7bb302a00f15b15f328153d4e4d3c07a4ac19bdc9b188e45998f072b7c3d3ff743657a77461e13a24a1e1e8f24a513de999a9101f2ac837ab0404431b8ed2f6bfb292e41ab43ad7753f56c15425df53f517ffe1c517413cc86561959267b001842b21536ca5a5791b3e47d3a5f06c8b05ac0f1db556772b1cf2ea34f637cbdef156dfdcd76b102438b284a17465e12ff80909c7949355fb7abac6d4243ebab1770f5ed8115fd3bd195a00379859bc2ac3c81710fd355156f4a31148012db5648efbf7bc29d0c1709bd453f9cc34bc73aaa5c6d5c07443d9b1f765c0fe2477113244f9adced56fdd95d2ea82996adcc3f5897a0d89834dcfcca32147466d410a2d0f8de9d13e514285303cbc273f902d45048dc25d4fb102cca0fcfa777369ec4e8962dc1875457612699155d28a77407857c79e97463b4b34ec89bc39e3dbef44437b766adf76ac820befe7586f8d1daebc4"}, + {"000000000000000000000000000000000000000000000000000000000000000f", "00893317f3e2b0ebe43b6437d0ea447d629932d94c289d25cf206b6dbb7d23e330c348b338f135fde6890c50f1ae1c09b220c09ec62ca4da5dd6472d1cee792974e70918115059544767d168ca8f422dd63ada4707f6752040e4c4018ece56262dd38e7ec0541d0225115ba61b7bd1a9e1caad32be1c326de96e8c9e5e202e86d9bff820175f25d1b4600742367919fe35351166bde4342aa6d245fcfdf6727c7e9ed234d85cf13d0596de227f43fc410c6261a2065ba234f8bbd5da36360416d88fdfa2c3cec7262ceeeb1bd22cda97b65b0d821304dcd862cb795225615553f0270ebcfc2b331975a38acb3bb53bf13c24e911e539d59d92bb012409a5ad8affd4fe09087f0127fed9200097fdb2db7d1dd3b692b66705cf732d61df4d9cb2ff24d0fc5f710d211e3f740db38c9b95226494a457da4bc71e51580fd256ae05cfcdb34a17b731323d4d1f75a23e13aa0112a3bcc41c1a35cc186258a3c32e7e24867dfb8702ff2c162587be23ad0932b938a9e3e0d923d1bf9a02ce137e38e06dd9c32b09d845554e6ac35dba1f7d1e78e7f6a59b88a9b3f762a8cee2df5d6f895bcc4c027bed3939823933e5c5a35081a3b10a2954337cab214c897c721ac39feb1df24784277c9eee37df962f0666042a475d1d916343d106131d05f4aa5c51d7fe15705f454e89456fb541db2fef69cc2b0281f855ce06d1fffab651226ba51c3118e673dca2193f99dfe0193057c5778ca24d6cdb81ae4812b8e38ce03f504b09165ca636ccc3a173c0130c4564f36ee3fe9f2c57116f59c7058543b2a0d031f45ba52f790c80ef4dee09174aae5baeeeafa968856e1ecfd0626c2475e3ff28636c34d1d69241bd648a04f8e17802ba4b5909990ee6bc5075478021cc3863b04db2c7eac9f3dcc3fe36bb8f8ab9143371ff94ca2d6be653c2ec67dcddb600aedec913c5bdb259cf912d05473b1225fa3e1d64131ccb557c2640c5db0de72fdccc25721d4c7ca99a0f7e8bc14c633d6337c97587f8656801ed6f515269154f8126722a0ba7ff7431c9fe8e50f4c7e697a52603756f9793cf889f0f9261d4c56d430d3855b37c83077dcc15fedc672ba3dd75f10335975d84e0cdd15d08b7ad507c9627856aaf652e82fb227e7b9bbb778d5b5605461fa285f3974e96b7dcc5aeb6b21b38e7c70957f0d313f6801be776c2783fcd2446cc84b8d852270e9b9c0f8c9fad906e6b148eef8d87b720bea95e133bbba91bce2942d4e6b2bcd27d80a11f5a8d3f9315690cb03d4f5327aa5e52c3d6a32533592f3ae652106681d095517ac7642384d9d54197fd68ee8f2a8a7329cec960e5a87df3de685ed2664a5f998a3d9f7254d34ff0a52fb837ff1225d24370297ece9dd8a005733ae73fb81e6ec1365fdae946fb78e2c5e8de0172043944512ad2aa5caf9f659f364226d2d0bb5c20390e31f60cb05f1449ec84e172285fdb49b5a378bbab060819f9e4c1f67bf41555c003f69fc772b7fbf50b0f39f5a386df504f795b5461a1b452494534783fba11f184b18b19b5cad6a953a7b2d5ffe7b399ff9d973303df99b26683695e51762940e54c5a28311aed2f1c81ad2c23673ac1487f62d1bda673b24abcfed6f0403615273f7455c1b7b585d5a6ee4dd5c15afe32de0661b7fdf1cf9421cef3c86389794f7b9de91f5d36074f9b2ac0a429ddff1cf1d1d57c6f4cc7d5b8733a0cc91912a1cb7fb4a54db7b8bd6282165d361ce03239a79add42923da38992551e1f7e00e655ab56d6721104d275d59f45016d6f01d1baf830856fbe14be4519adc560cde02939f1d5d313627ff67db99173331523f2f9505755f196fad835a2a4783e662047144e1d42376c14cad323cdc89b1438a43be4276fdffc8f3d"}, + {"0000000000000000000000000000000000000000000000000000000000000040", "005b32b36a9169b7b99a110fbec8837486e4bca13110c247c840cd761be100328c07a10f3ac6b05821043cbd966461162c4597be649dfa51939df4831fe1ad74da1f150829fb87afcac8f832fc953a5947d78f3f050d186c0102cd691374560df7737c7632431cc6df23e69770cd166ef8b9595ba989e7708b542affb57b1503320e7ac676909c4231ec40129e8b2a42fb1b8331d1d3e3f47d86e5f7f936cc54738b3de983f01af30b2b76afe2c62a63427311c29bdbc97d0c40d4b94a47a84ef55aaac15bf05586d36e6a315df9983e990716be07eb910897936a5b918af3928d5cb82fd8a10a2a0c73c9b65c12b5c8d9b3d6c9d2dc359b0cee79240c8fae92f5accba5798c811dee7dc8ac72c8557d8f23ea7a1bd6a92325b8b3c2b7163417cd77a19d711e0dabacc2f6ce452e96fc04d67153ea5d8adb1ec2e1171a898b26c9c30d1f83a33c604ff77e5ab8fbc13b0216d7b9e74ea22d18e58522233329a30b777d92462c969b053025224fb733571ea749d292441b9ea0d605a4aef04798470d43542378251d78edbd5fb36fe6064ae9eab551459948c9672b9ad07d8e15bd7c37700230673f40a6521f6d86809ac860a642c334bd74a006999336a34a1e55853de3f13b2352d985ecdfad3f0c242318d1c4f1dec90e814c2ff401ccf5d5ca1eba0e18a1415707ff372f72410e0b58db9e3428f95dce04e2c847d9495dbcc32014bf17a6b3c61ac8dbeacd0d23169cd550426f834904de8a33002e872197d69c0e8b121aa0c6b665331e85353d68ca823ef2bbac3b295a9d52baefac49ab8de55183fe9f3aaac5da289905898414a658a59cc63f309c26c36c313861789bdd1afd87ae0f86d6ed2c359806e4508c7a0fd47558e20ee775e4ae4b85a0b92d8231e035828965e3fb1ada2f86a5f17a238a8b7cfea8237c58a2670a79d9e5ac018dce55d7c42f975bd2708b07da46dd1838ecf7e21a83964c34ac6055d918531f9156c912a390f9596f1553a659371101dbb7ebc1d75be5b97cb3b46b6e522b6afbf5ec65050175a053838cc4683e5426bbb3e31065d7684c9665f15edf1422263898f957f3f09f4712869b2803069648387292b92a96aeb55032fcbb2f17f4a137fd90e2f79cd1d721d1749d3e0b8c35107f2197e29456b1671fcec2966f9833c227382e9c5c5d039af24e0e302dd58d9721b6ecde586942be1471e92513e742f91a47f75d01e2b17bab98fa2eef557ed9231e0ab04ee186fd2b032449a7b5d8851761d80c064204dd87eb5d17a59e6525a7b7597b45b8115da03c0b4a9c0baa1bc953889623f6c6e9696d9de99fc08910b6aa2c8e5faae7aa72b356d7fd2a4fc6a7df831510f3f168ec4d3337a1c48a8db2f25cc2e4e9b9ad3f16dbbc649260802942438287eff74db641b2b229df01e9e6176228aaf9f13a449ef34ed8392f023908e57caf7f70c82393f1b0c569912ce55576b595ffd33406e4095ec5075034d0af181f5273e56e3fecd202261ab4f4025494420f402c8716d1df651a953fba1a4009b7872fd4b1bbebebf8f22001f3d8e7a7dcbf459311265a728fdb77ffee37b1eb2fe9f92d5f5876f7ce0dd35f5277e3fa35436271da1b545b6d05cd0cb4174262daf665275bb9cbd6b7839be19e8f3ee4dc9a9f02d033b39d9092fbb4c1434edd2a0ac511adf84f70194fc6319a0bdaabdd7a2387551f3255d45c763093053e66cdaf4382b44bdab21a2d2f5b35985e95857a074c8ceed798cf03bca2d22f81a2dc8cc390bc0c680463e6354accd9d5b959551ce8bb83a2adc33f2b550f1fdb6dac0a71853d8551ac326a34c1333dff1c9b219f492e9bd6e525dd33734747d9c8863d6c9461d2533b9f301f15e0b8b242b9ff376d71331c4d3f230a"}, + {"0000000000000000000000000000000000000000000000000000000000000006", "00080440fa43a4305708d1a60b2db84114295dc0ea0c5d7c7e508323fc4da1820298da1314dc3770737729c136a45ccd747f7e2164cda6600c5de4f070db144f803cdf809c421786559ba1f5e7bbc765453d03450589bbe40dce6e76b507d62003f8081ea99cfbc1a052aaa4a45fb37267af0cf5db0ae272ae09c2b114670e7c731eae4d334b1d9c11183850faa5a1b1578de225af72a95e2b5c839c4ea46d995cc6e32fea5eca8700e01cf97b344201d5a59090f874138eda581f91ac1411faa6c62ef4f5c6113320e8468e1f58be5d760b020905baa504f19a4920d4d52fc48f22b21c5aa28a296b474d9fa0edad55744407a0f80305a5177a557f12f5afddfc9698639c4ba9b08ce5d2f2e74a38d50e4694c4f2939ba385a49d8685d65351e38dfa3f2e3c19349a5df5b197c3e0a742e660d180a6727b1f264628f08308310ee353818a72b6b9f4169db62113695604827fdc595b4d0b724ce2d4055cef656bc49b417014c5ad7183cb8dfcd49834e57cf411c3ac04bfabe90b4c9c4a7b1ce7f345daa32fa2ee7d72250799e30f0be54fc7fc496958b022fd82aa768f6b6550df25b116df11bc332be9fbd03952ca09c9b0c98507366c8f1b1aa3745e546407e77996cd5338058dbad79bcc8418b3f4cedb6c5b59aba974920cf9d3973e48bc43f443b944232aa42d47a21a1a684c5b519716cd9dac4e0536b9d0f4842f05e25f133b5d21434512ff9ecc3b3a79247b419df9c50dbbb5128db7505e30c43825e30888b9f7671607a3c869b54fcf2aaf0db828dabd422e3d4446c1ece4f79d94f683b0c7d11b0115fa2d100c96bbc8a61bf2e7da9ef1a74145b149afbbefb11d0d40693b6417dd35b66e2b678876d7471eb1bd63090dbc73ae75cbcce7ac3372758d7907ea81cef43d4b49024f9762d6b50ec1c0483f0554b9b6c290168c5500322be3128f66fe8ed166dcb3d6f8be2fcdd26af70d81d2a1c9688fada806389b266bfdbae1e71d2b611338bbf033886203fa57a545b2ecd061ec62df23fd2ea19271ebef42df8b14178d626dfc725e601cbc33052abaca9546a113ca22d31f3e9bf1c27bd7fa435f07d3b9237ca9b9fd9dfae0876db97d86a0fc1902fe185de9dda18e0181569451d6fdfdcf0a0efc9ac1cb51df4cbe1e70390f98d3d5452ab658719ef11747c90b0a8e4dd15186bdd1ee561c44ed235261997fe47023ac7c71af52ab5726a3825614b6f8b8a075dfebc00d9e5dd8eacfaa3bb8f28373e6c75ad5c7bc9224461efc561f7f87df65ab973303031e9a4645eb3ef4f113763d1aea9f82f5d54001cf4aac06ddebee5b835213f4778a8af4a96bb3f051b729720f420e139bbefe242d6b5ff066c5cd5170444d66d7edd7a1673e98996b1f939097345e2dfcec78588c525c57eee4ffce4606749a8b4bca77f5731a31c39ca0b1267b74f9699f09834c8c22f2d901b53051e2e6b78e3934c470c1cd194f4bcb45b41501b78a03c614d8ce8eaca3fac9692a94841241342c2ffb4cc3cfd35ccf392a19fb9e5e11c0341853110650e8d705f5de303c79e2cc97df721a916a25a0f7971bfeca7463b8db92e95871ab907d2b1496254b8c99aa776264146dbd7282eb98db53aa527ba580e16d3e9776941678be53eea64496967fb70a7d2167ffc6c2b51e0b948aed2e553acaabb6a4f919905d0bc84830eff90e8497e3d4acddcace1c560f0c9c2903b7c4c2dfb4ade16a3df6a8f93d92794cfe353a3d64de77a62dd22f748871ce0c9e663eb63d3d12db28b05328cef1d6d7d3230f3a46ed580c0eddfe69702d0971ad8cad852cd815c97d91c61292be9f61167520eaa191c68cbd1b24b31ab82b71446bb3aaa31f429233187227b9ea33f2f09261b4ee975a5db5ca"}, + {"0000000000000000000000000000000000000000000000000000000000000002", "006f901c59a010c72be0e2e881e81a61565d0e0a97261214ee04d3968be764e43e4e3edb9a918b596de90d214f243b243d2372e99464aa5b4ac1650bb8f65b0dc97c089c92c0af49a55436c5b3597529467e57b706dd3c39eb077549462dc11a99f13729c538ba656337178449b7d4fd10e56e5432f374379f1b47ba24fd1b9e9db876b0b8adddcee3f0e5776f2506e4592fbc4a654712805b0551a18cd8e294faae7affccf8b57b0a80f79219472ea69f3fe11d4d93bf59c37596dc1f2e028bef28e87f93c0cef646bf61918a581fd6d6ae28038f2c8ccfd6437649452fb74a8c1695ba357cc82ab20c9229bcde4ff3c1a2fe15e520e264317f32351430d1bab4e00ebf977c63ff3bde679d11f08e1da71bf659fec6b2ced3980adc5aa4e8bba73cf71cfcea14f0f7992988e005c49be188aba80bde34b097f7b1694a2bd2a79ca5dbd95c57822b67d232abec56723001401cc1cccd886f5f239982504fbcfec461b899a257384fb3a359be15613ef72becf64445cdf1dedd13069c25178c483de9b97550dbffc70e75d4d69683be1b0885b7564cfd1f245cdb268efcaa2acd653ce4a609ba48ea102342773c03b10eb470a3acc0d76f71b014c71176b548d632b01ef34acce3eb22a62ebae70f10da2f2ed05c3985572bd1f4d9a8feeecd18bb7d16207f6d6920700d759f28d3396c27f016ce2579d792083a8e4aed5b85af5cc3510c98cc19a6dc947cfc400c11d90b052ad0e7a23f85289b4b4cb1ca28161cbd0d4ec7d00f0523df792a79a738f9b99e88b4da277a1aeb3bf992b93f03d1eab1e8d84b7768ffc152d1f20e8f97d467a17691c922c1b276100b9d4bb2fbb8de2940b2fcb84afa9c899eb656ef629c46a5717eb1ec0ec600a4fc04d45d3502247643280abd9db11c88d35888ae8e635b057b0a670589233caa1a4098f4b4cf00c36fc6279609a1058aa014030e492d3555de66e70b99e89efc51df58b586c2f89f2624be7b7857990a050bfa8f6a0bcdab4ad17180a44ca6be843cbc948030236b97a1aefd47aa7ed4a3e955b98d2c7e7ebd650dd68b698dc43b3858a7e91b3d73573aa2447ec29b433ac6329766502dfcf9c8555bc9fca703701d4ff52fddf4c0c34e23c1f951f3f6d852d94a4f613e57307706b51f3521caf733c3f881434b3fa70474fcd97c0478d752b4cdc599bbb2574e00526bb324ee1cf4351fd71b312d134a998bf0632c57e8e172306279f72308763e6753103c8786e71895655b403ecc0db9c278096b22fa978a74ea8bb481cc8d66d0d8c825df06ea05b44165345bc852e47e0451cf475c159de432beec12def11f4bd5266f9e3ac20b4d1c8c3cb5e6e7ff351a0e3feccce21d4f820ed26a41694cf98c503ba59f2dc7d9b56114b0f5f954b7fca7e987775a12bde18d00d1b2c5b605a38f8e2fe11b64d4bb14c53cbf320839056d9c5f1509d2ccaad48b56d05cba2d9a5fc3ee035f94dc71ca91cc8e43d05d7bffcad92415723b3707403b40810ce625be9b138ce34cc3b61b94741c6c03e55bcf7b5b1a9eda2a420c3ef417412758fa548b07d72911790546c84202e0eb507960b16f1f78635211b077d032e35f81e97094643b7199de9ba17630f52c4dbe3277e0071d2d2f84c33273085187a538062a01523cd23a18476b9ec210f4bead92896b2b56c8a306ccd454dca44eed84d1440082213039838b1770020ad1841d6122929b170db4024036014178d1f676700c75e2a1a6474da78ecfa5a16dbe42e9cd979a12af092f754a434e0457f546c0c22c66c16db76cf4ceec245385a0c15edae5473c92ceebda0d331c325a02d00a27799a22d7f9d9e5c2b54a08c043f1a88c107d1d0b9f709f79080d7d586d92645a72a4712311ccabdd"}, + {"0000000000000000000000000000000000000000000000000000000000000004", "005ac1e7e9ec960df137f0750ebbef144eb4ec488904723a2d7892c80cb4a622f429301ad5bda92fd58a08d3d7312be01f473d4f16a045ef0566f0759de91c2622b235d554e5a962341290fba5d6891a0c75c8bf090f4c168a696cc953d130fb16473678ce81d16a0c17ba6164ace4870b775ea1ace76beab06fce7368180f6fa53c3e0b3acacc69f37b72b718daed04bd2d9e6f9eee43a7a587e7629698d0dc702ad2b75718bc99011a473fdc8d32d9128fb54a56c3d01a5f55d8226b066e3e5a1503945660549325e8ee963e50a05f6dc7088c28a2e9eb7a2bba736219c63f4b8e25f17384f00cae7fdd741fe02b09c0ebc881de48f39e035ee60e1878ad84ca5077bf30e0164e50c8ffda294034e9814f5262f4f1e7856bb316b983c768806b7b77df74da1de495dd2f18f917243bb9aa19d09212a956bdb72a3a6aaca7ffed6e9bdbf6f45cabf04bb3113e9ad48601ba70e17a11a8f7bc5aa07494d8a56540ad3b89171baff6b4f40f43d8eb3f53d748f2770e30dfb44fff07af9f22066fc9cfff4ec2f953611ff138995ed32a4e484b17b895bcd35cb2150c074eeb9a4011d27f160404c93cef7d6eb5f0ceb178af1d1fc204015529a2392752f0482acf5fbdd29719786de15601e1f6a33e066de607fa0cf1a5a4e100e62b2f58bdf86cd33b5b52cd6f05095526f3887a15fbcd3f78f731c25c79b002fe41eb092ef3f3bbb7037238c028e19e94b3354e35188c4c3e9cff19e655891847ebad9e5735d2d3d70eda488f53c45f230171017d2fd1d482766695b856158952a6d3e0cdbf3b38f374863f541d7e86d0dc280430dd4c654a7265aafc31b7a4584a494811eb874a1c591a6a4254c76dd947b22d794ed734ce9918570f0e64dd7412608e2fe82fc0f5aef760e8a8526574f613c41cfa16342589a9d7e666b4b87ca62c2416e16c0136daab3cf6faebc08d81e1d3ca97bd536a9a21da03516f545e483108c5ba057310d3ef4a841b17e45803821dfad8121771657f75fff6d6fe95c9ce524f5516608d6d6adf3187ab74ca3f9853c12b56a99e134c0802df629407aa83a733952341e166e9747b1d12643983a6b37b3d180dee9675501f666d6d69ba198ba90c0fcb9e868746a983be62ddb443d55e01acde3e0e2084e27ff326c05ffb9b5297b09601cd93f7761ea20405562bccad0b076f4310c0ae1c8c20a7da4629b60c4378a4cbc741636556c1a21a29537185030fd4a918d457e289a6e8038533725b24ebdc05ba7850201739cba3e56d5261bd8878e88ad94adec6334bbf221e04f092ed3a482042b17986013f6f2c15bccbde228f0bf81614643181e7bfc3f2b979ed63b0d3e2195641109c964ccace0642e6b4022f12f7781939115025c3654255c75330d333d62d16d305e23a562ef159121003eb5f03c3c829eca4e650d41b5d6894b2d15489c42f2eed7d6d0fd00760ddb646db57d2b5a0d3501e12071bd3842c480400697861523abeec70cf07b92c9e1b917c0cd19522f77d9a84d731e34a95dae27921b310531ccd7acbb0bf75b112a919b7e76afccedb2bf217f5f2ce965b6ee574cc81b7652515599db95e8ba125490a04d2497fe5654394ad60f933b21c339d20a53cafee417b19adfb9a15869f2bd3548e08e9361bfb04a1a75a43299cdd82d9d14621ed1ba07993f5d94209a2cf3816579da4c86444279ae7f10923adccf24311cfdc390514d9bad9d0e33a1248e94e2e6112a80613cde4f76e89664c719c91e4c494e226af2c3d77e50e82eedf635d167d7019d59421c41dad737e78be422119b4e3e6c8d5df923714ff735aa41709c73ce1890fa9b1859806b675c3ca911a281adf944b2fea9f5d30314e5325676e6dd0ab048a4d28e91abcd89a630e"}, + {"00000000000000000000000000000000000000000000000000000000000003aa", "0046e8aa8dd6bccde4d227d290e391f698cb7f87890951bbd93689486d3658b5d7a7d43eae85857530cd0697c0777597e6ccc603345600bceeca3c88b7c5c32b0a9742fae7e9417005a70e75cfb4e5cd631205eb020a4db66dcaebab30d17114f627f9bd54612d75af05f1059238c3374aa54153a59550034e76e3b651280496f7a79793b2b1afe061bf967777728dc25f96f219388c9d27d83e7af7ecd2d709c0589bc8ab7eb0b202db4e5855c3bc6cede5913db23b96d4ca4456797f1442467d0ed665cec38363b6e6dd00e61f6c112b941434b3b20a4a596c6eabe290f460b309edc97f0050158a2e575049f27eaaa59be14ae2510b2d4a3fd83204068dc93aa45abf8c02e8dd0778957e5ae7b8f98f0f2d49ad53debc4f557d53a01c40b70ea681ddc4d332fadb9fd9536836d06f54fe1c7117a26abcdd03353aac743ea3d8f41b2ebc25946f6a70fa441edbf633007a3f47d54c778bf0a8d68c144d75d785177d29130d06ddfe488b4cf0956bd14212fd2b129af2b71b0d10550c9755918807a2f0d6d23753df95c0a16f97101fa7ee4d5d3b110ff67d155abef48db18b6ad825a707fd1b05864e84e9b7b534f417e7887579ba71149811d5e8fff825f2cf3c24536a099d561ea4a75c03e012bc7699098fe0d29e3a8682fc6530b339129db6df2ae5bfd3521e15c723ba548a4bc2e9132ae45ebc9000ff9dcb77513ab59b3330205fc59f20895dadcb9b5f3f2434296aacc9faf218eebd68456a7499df7b6a072ad3277349989994561236c4e6bc617765b95920388494e2ee8eaf034cac54c7dff92a519dcd58d4f20af6cd1e924bdc587f327c7147fbf073a80e1f63e320a164b1450bfbbf8505a2d9c9c996ad154d1733ef2a649616aedfda7dcf71152c7eab551375077cda99344a72c899dc3989f9c58411a457c299db4b94b5aa0118686bc720a599ad8c65b02dff19f3ddbedfc825353c4512130ef31bb451b47082e6e89a9c9c3835b817101c9432db0d1341e5b5ff164605727cb7ba08641c46fed9eddc6cff4ab5574deb46953a6df776f9b4063021cd417a1c49f8a9d0e3b2b7c3359d6732a1e2067a87e9fec1ccb26e2fa7d139cfd1172aff7fe85c0f4f1d550e48d917cc23b343886c5e8abc455e1eb4355a96659d22a62fd65d53912e2d9ce2a9709a65770140a318ff14cad780daf4bf1fec9b9d30a9b315fc1101bd1140f9f267f4bd83a5c9f03e7e54c9dd18423c1289f24de0411364a157752b79b966eb3f7a08405c01ab7a90a990ed9ee6d627bce2b125979b2cf2000249dc49df55d53ac9fbe025a599c7402f3c26d7b2296943d8528e3b19d84687abc4f715f2f0cedde98a2adce728bce0313b0248766339e84f89e72cf8fafb451f0f9e3197fc7bcd9696da4dc2b84a1b12595a1104dd60c943d4b059ce8430e23adfd8ea49bd52997e139026fa5e482cd953f0115d80362c3628ebf4e2cc1b09744b5687fa64419dc4bccfd33c1286f1b684b930e16de24dcefebf8121a674feeb5d6a31f936edb5058d9ada2d316e2b972982fde1f3d7ace7ab5c10aa1835de690af2d241fb9c93a0d95e40b73749fe2baf1aaa9c4c534d96f4a202c26d057ee8e35f7e7cd9a248c2c38c91a5c319fefd262083b40092cd2bdffae60521508f04c5f4b3ad85508b361427f565005b07c91653b14f7e1cb631d2e394ceaa59dc62386c1b590d110f614b7195e7cdeca73764f9ec96f34e327f6c5b338135934268410f958dc421296ff1a6284d5564f10a9eee81c81500f18e91b1d1801e633e99281e94461145646acbd80b5f634e68d60cd6fb8f2b9d9ecb9c0c0a0b803b5065fdd324f604d36a3eb23f34f260d724d106a3628ecbff474b564aced796e26d39b57777"}, + {"000000000000000000000000000000000000000000000000000000000000000b", "004119923cced1f108e0372cbf43ee2e60f3bed7bd13a6d8eac89c27e30763e301df2dedd1d073be53110cd1f9d93dc73898462ef5650cbf5bf1ce6f3e6a4d1f610e7a12244bebc286b4e01f4c1da9d8dd1857c60f6cfd343a0760838fcc423aa1c1bc791e4b0abb4f1c2cace44dd302d8b17ad569da5f7665d2c86fc89c28c21c65ad8b5915cc4ee3d2a26f75da1d48da36c66d1cfd8ddeefb40bed77795b4a5d0512ade89d28b304ede16a2e5b443948181242defcca3db866721d6b47020b66e3191200ea80768394c552c6220c5980080c3d622c4343c5dd9a6bd6110ff5b972c9663fa26915d5d2a0f1e19c8d1161246eebb1631dd18434538e09e316be4dcf9edb96a6e19549ef2c652ec9959b3d2ea46db8f34dd53b1eda4541af7a7efa4a213f726f22ba2eb94011683d8d12065663c8376297639b56e94894ab3713d3323f2692356cc2338e8615f2bd37ab0138f3a8d15a5e9731cd42bd30dc3b7ce8496c25f41098e60e3f0c5fbbf33261e33ecc1b46164473369002d4423f541c2d37e52d63b776d4f7514ba39c99bc433b2397f159b279f32717e025d4b8b68d09b9f64c01daeb48826a0cddb056423abbaa8346d86e5f152419767c31f95cda75047275ac6d4de69e18ced487040536b9ea1f072109936f12e1dbd68439de0336477a1ac125609668e04fd82a658b82de7da28b913e478d0854d115298bb28c6d5f424b497bc21d3eddac8c2f164013e301aa9629e44ad65d1f5a39fa153751a5660f6e43bc0c5170f78100e4b3b9bec6055ccf0cda831496fe149762f50938a43232191ef0d52c318eb52308c5205ea1e68dcf3806b88c7b6f1b063641f4ad170ee96b68921f60c97b2814821ee1dc2eb9d5b782711968c17854258a97aea897e2e9c595e6269378a21e2b0675873310d9bac1722381e49e0927c3fe1fb3240073f2333a4d87009e868294aed97d18cece4f9930042c6792bd1a87cb5ded35a4e3475bfe741f73c3fe191accd72188df7ec4d451e896e307e4a0c1677b821e4dfc7d0de662a5dad882dc066fa16536dd1b17e1010605ce59e61cb9ccfc51f3275336091056dce72c08482c4128a7a8633eda71eddf9d83810372487b1505634ce5f4903847c1d340f70b08472e49e85f43a4216087a5f4c908c55191949336c68b76ea8d1ee438008e9ba8dea54a95bbe0b2c92e59788cd5ceb64aef279d3e38f665cf43968c459444576181c3de5772e31ffcfbccccf4ba87b985ea6be9ecbdab78ba5ffb47292d4760865bc5f17fc934e57b4accf59b91f3ffbc02ba72bce1d93110f0a1e0a19fafccad7194ac43061f835dbdeedc82112bb112d55f227a06058cf702b3030e10465ac32cab38b35283b5f0feea73b4583b57062b3bdb160c966ac2db959569c41ce9b9666f017e050cfe3f00c9ed0f54c7063938419135df9556b72f056ed2fa90c89b5ec41f677f25c855535ca6dcd5a70834d3307b473521236bd166c328518abf5f3a095629d9f6ca05dc1df3d77fa64d31c888d5bbf8d37e3b083e6dc6adc5e11329e042058d991c35ec379f17301efb5664a5cdf78ccbc85771525690620ae61dc9a31d7cff74965594a199aee3788c3072f97c299b173925864e1bc6da49373d80f29f372af33b2f5bdfb0c90a58f9704845462b42ca03c052c07b811ed5711a4f3d2b6b7c7b6c3139f30098020243fa62223ad9fcf51809767f1c9e2699f94477d8a0c344622b26d7f9aa1a79d709cc21e8e73509151e4155b65a2b5857a2d70fc9bd52c8e73515bc99667052775c71a2fb57f9d711f1d7894e05ec9055ae51f5ef9e2080a6686ceb051e4cfe681b7c4dabfd37724b5bb9233caa171ff9683ee989fd8f50842aea35f6a7efdf15ca61ddf5652a"}, + {"0000000000000000000000000000000000000000000000000000000000000005", "0035afde4b88e0f3cd1dd4e703b3487d6380763f0332a16ccccf942641c04db473567969be7d073b631c1c9edcbbcb2225331de373414cf6f93b9b45fd09d22c94e4bea9910f59dadc049970745932c82ddae8240d6df10b2ef89441eaead62030fea4170a7699ddde3fa42a159311d805894805c1a15231b1e598580b3b0e41575b04674925e98364b9316b2205e489de876f1399e290b8cc339fe49467b50c4d23df45ec5a6c82029db50ca4cc6ce0d37c516451b9726d70090eaf6019b2a2bf9bcc873b6aeb76b5333d71be1a669a850b1379b0ea0116d174b796626ed97d39ee98bbf7fc50435755290998ddc1afd9277e1843994e4221fad12515c89f3cad9d2ead2d45345f8eec679181a9ecff73242f956c5c0d4e3d6536674df4fb80de4f7cdeb23c2f03be9cebd13bf36f0d0518f6d8191d74c0700d7d6bd23e0b637387b5f2da075a6ac0e1f2aeb87986100479234733970f2fa06655f24673caf1c9825e84e626a7c5ac418bab251f30d2902d9b1fba6b4f57ec751a1c6ff2f44a985bb23e18de56d990df03ce9f958c335403fa5993df45a9bee3eb99d23e9ac7f83ff5120a235d9f63dc1479fd0f6352ac5a31a309e61e2f6624cae95ab814961bb57b23323b5fd1bec2ba3cc44b0bf4a0e25a24a839f403b6dc2cd074da30301f81da106aafadc86fad47ce23c514f87562f181aa512b4704b3e02d2b0dd6390314626b92f84fe5d0d434859e12492ae7bcdd8c1b8037455a3d361e02982ab709020b9d7ad31d8d56bb2aa832c367d7eb9f19337e310124107a42de2122d71f5d74a0aebdb2b9909e7bac5505d6c0d4e66a54455799053fe77987b5b13bfccc86137067277b07471f6b5d32d993afd9956515cda6b506b32d54e9d56ec16056010ec59474f641c2dd893942e5a42356187f79707a590882f4e4c33aa67f7e0f00469f5b3587597b4df960bca2537872b35addc1851a4af9b3970dc963bdc101b754166f4e993114f91801516a0e885355b1e55f00f7c7db7f14e166945dff18ba34bdc15b9b4fb96da284b95277c5047fd95140013b2f5564a46aafa39df705ed748a31fc4479e28724eca5b6fa0ea3372d81c261eb9ea0b0db5aba2baf030307c9401a2a9eda1908bfed5befae53a21c51030df559e94460859be0e9c7b44e70086e4a3636e1840429286643db06af1f2e12d9fd599eedc73c9c4e655328139cc8d66fa9e9915564b0f3d2b6b1ea9da8c20aa0191a7d82b3e70d5911e0dc9d97b0bd30313fbc365d72402438e229f4f033b108b0bbe1485f14f2a90a189fdfa251c7c29bcc010c0009a30dc163ee8db836813c43b456e9ff4ddef6aadadca5cdc9611b31700acffedc7e83977ef8a7312cbdc36a94d2ab771031201d8539ba217f494abb1a65df7dfe8f15d13d570f07368cc0cf0f97930745d2ada0aff5632a6dda46c908396a1dcfc23937546140abb1bdd30045c30670c133451368932f6081c9a0d4aac16a1b8a024410e5e5410156cc855c2792fa1926002be0ae2e8c14b565a00b3b0d25f9ce0795402292a85c665e4585f20f75ae435a2be3c910d76e963a76af9167159eb321bb941f0d356dc12c912438c4ce259d9af1aaf9cbaa96d99814a38dfca7567b72eded81fbeafc0c6c8aefaaeabd07bb36896b46dc10629190bddd279ed912edd44d644023be19279065ee86fd06b7dcdbe68293481dc5810d583d8f388d800352f352f68121bed788a37cbcd412cbaed54a2334d79917f34158a090f9cdfbb4c9790af073ee42c929076919541b805bce268c71f4bebe1b63622257b2b475b8418521a775eba1a3d81f8ffc10294ef4348c9bdbc4fef2d5e167f9e9ba53f4c6b92e4ba560ba8c5075f97ef5861e52f271a9d7f45469"}, + {"0000000000000000000000000000000000000000000000000000000000000004", "0045cc55438ec569072433ac0b4a3c314bad15e9ea0bbc1daac7914ab6e487c4b90a460e016fdbbb944701c21a300c9d917daf7600c93f55ff0dd8d2b8ce3e21528deda497b17bfe7512751eac6e5920afcc6c1709c32b821c96d679a48db3c17273ad16251c3357b426405cecfaccf9678533f328ad2a6f90fe8a5ea626173a0637108c0517cd6991f5b221eb989740786d991e2793a15497744309a38388b5bfcb69cc9ef915aa024229a2f59f9103367dc777b06a928e8b551abea9118849e101d3bbb1677e7217e4e265a5e306172aa827957e826156c243bd82234d63249c556328dff7502f1f69ff90524913b4a992f5124054c61414d0b52209371555831572b1dac0b2658942b6a17331f16b1b0f1f3a6e93ea218dbf5047a2024261067c1d7c99d109b806bffb05ac79e85e41c2dbd14e3eb68c7739a21122bbb0af0b06385d9a614ec3b5404064b3bcfb0f0626a2fa0d0406d2d45dd587b6ad6f4a1039d5e509412bf7a354e14e8b55f624cbdbcacb797fab7c6a9320c7f467eb937efcc9f6a4b8d83e3faaeb8d590ea424519c02ea0aa6f8f15f94fafba840073b149fe4ee0b53d112940de10d7e81d12c758cc2e986974d429b2856e38d8866ddd997f8842b4af6c3b24946761d3e1d57a1056234c2b7ef3b339915b24b21d49db365ff249d6459e653465b52e2b2a03828c6e20116746dff06418b11dd87629c6c8fb0f69a2334d99c04db69001518c56e8807bbbca8498230e930d1f93186bbb6c0080baf83c76a34d3e59f0462fcb503a9901efad6a01dae857207cfbbe6ec4114f0c7e9e1befe5d1bab510f01c17cc08abbb1e41e5190ffc0f0d770dc3caa411c3b4b0a471ef053fbf6540e34b54b96614dfaf319174b9b81b72aa63bef1255bc2fd792ba3a5f7c82983b0753fffd54fab7248533c43a56387ec32b36e10500af84affe504a5aac050125f8e746f246d19c3510600436ac55acf3198e9e673726e95389daa4b0541c146bac2644190d82f93fd2a9ed1ddf271a2b38fcdb1e5b5c26759b39c1881b334638b753e15d50f8b41d06f4d684840e94957e64a227a9c6417d2976b5b2b92e11251f0ae568916cabc307dbd3e7ea8a67f58b470916770f400c7cf26c5f4a1319647a3ac02a1720e10caf8476dc0e53bf45d77395ea340e6e3e061ad15d08098598614aa2d8c7ffa1b942cb1bf1f435927b4b0f5eb5a5f790e97cd47c164a7fc8035ac63eda3bf60ca54f5686930932d1e0a453ad7c4dd183234e1f0316754dcbf8cf1caddbabe2b5c0a54999a54f1f24821c2004e91218a7eb168af5b28d7cfe65dc3bb4417e3559fea3f6a1d1156ba4b446093c176eac4e57757a2efe45bf904c83a0da2303a17ad0b9e340d37c4d7932b19ee1988f39f30ea50381bb6c26ceb92cddf63100e808c2f666fe87c609f6e7dbda384a2642bedd54085b46ae4cc503a4b6e9fbe1c8720797f94effcbc0051f4cba5a18ff1ba2e2008ad01dbc255f37548c9908e3a3e1bd19511106fac6542e7de6be2140b8c8290a6df3dbdc03dfe557e166070cc19c073fb1baf7010e23cbe9f4c578a3d01a51b378133655616d6cf16d159921a1bec984e2e62c615aed7cdd1b0d27fc3c3f61bde50d20a358f5cab9e98760f9e38f7ed97f90b8074d05736b43358d8f0ae355fecd12f61dd89a29b0272dd7a3f013bc4dd75493844cd7f97ec6d4fbd2b30e0686a9d89e5481fc5e03984af7952d9c6a7840c715fbed41c3768483d69b0a2cea6abe5719c4b9c6d60967ef909a632079dd6b36ecc97c0c85e596bc0fce193b5fc2658e9352e3ee5399ffbf5d0e47013ec77c1746daa6791473e3136a8195f95ae0f4c2c6eb9c101f55d586b15953c57928a60caf4abc438debbce892"}, + {"0000000000000000000000000000000000000000000000000000000000000021", "00b4902728a8a8db67b1344baf4a1541ecf8b81a13497b3d1afdef05e987b8371d61bc7e91ea3d5623da211b3cdb2c7937e1dc8ff280a14bbb2e1ab93e1ef63f42443440707e9fa9e9544cb3aa0211ad11127de20510adad4304c3d22c7896d03642b7520650dab1e440815ac4565306cd56af65fdd8c4e2398c5fcf921d092a3375fc546f490983514747c08e0d05b93cc87809b3ed5caf6f3cb9bc0150ffb77d090646df553a8a05da226fd5e3e28f255bd2c3261eeae68a59d50b890a6d0c15cd4f4210c67500f4ca5f3ceca4eeb54b1f199ef8edab49c3438d29a5882e51555d95911b505a1e7572ef79079f85386bb2aa543cd6bcce024964040e1c11e176f6bf41f06a8279d5278e653298cc5f45174369adc50e0b0923c8522c4197ab18ee88dd344619869faff6e7a3ef6ab48454e34718994dc35517483418b334a1ea80cd78fc2347f6a0ec869485d8e8cd011e4876cd487ab6abba1033b85aa2ccac03cd8bbd1b8674e18c675e69d85952d782b7475164e4b684e00546885da78b59bd3cf1c22b15593ede908e56e86506f46ef8eec72c65d028c0fcda75ff46fa77f8443a04a02602a9e72ca9ea5e169e94538cd2b28279b7a50fe890a963499df14b0f2397f3a630d5562aff50f00674ddac27f82dc3d8c393d36620273a385b5c2b760dff53fadac9b7ff651d555fb1b47f8f01939f7f4301f8a97f6aac5ddf951261176acf434ca0d67e16341bea85245eb5f345cb1ae2904a4f2954eceedd30d914e32f30c4b2e9cbd659645ac4ccef27a8111eb6da21aa258f5812cb3d94ae13fa2c2beadd675b558cef04808a72859cc96584a32964a9cf1c26803df5d53e0667d5edd244e3a3f41530c428a069b534fa337fae113c9734d30ecc8f488b1238e4c2a3b96d101b6ec95ef9a6b173d99401feee86f0dc6fdf8f3bddfbcda1018f8fd12e50dce74be42313456b8334fa0051512b22c10e554fda2429ab2df2713c2d1a624511366ec72495b94943c94f367e3e83dd3be2c5610467ef0ee228008798fa5e8d8f5b2673ec00791f82fac57e51310924ba88fc28ff13c9ef7454dcb9a3265d75f31cac1bf164e9b752d691346c3c4308f62ddb5ce07ee76e101d19500bb571d5e40bd139d25180e328f439960e5ee2330143623c8d9e15263638bc6f69c94035ca4608b0dde2ed0908aa84b290b77213355d42aa35abc01ae7299e7b4ec649b761b5f02db0c24997c75c23d22012c9e4acca4f47d8d274362c63995b2bb81967cb26b4b7bdc058c61cee0f829b7f60bf64e8fa2f4a152bdaa99004a90aa9a2e8d5dfb6ba073a269c3b8a9f46df4edc7caf04ebbca7552dbae525ffc2bd5f68cc352d1bbdf2d07bf79581337650a19a894e11d91e144397ecdd70e4be315068c43d416c323e38eff7f5f20191bd02519c0121eb6fd3027c3403b1b527b4d9622ac3ea2b21e429c3e085f57f4b340136a3bfbc196505e729cc84ad8373a63a926acf4ebf9e5a5e9edf011b6af75e98b7a11de8a19363577f034a2b05f467c4061e6db182b8cb01cd7d95f60378387e8bf37e09030f1629865f10dcf0e4fd24f3d557e129894232db240ac8be642c4bd483530351721934850a1782f74c7b6cd964442c65acedca5ab7458dd11a3ea721f96be80582d796e0440d287425317bf9478cb4a396da9c4a11f4f2f4b10590b64abae528d14267a2fd2c5fecd417c9c4a0ae5f4c91c22cd7d037e494ce972dba0400362fb5c5f662a7a78ba1252186d5b487a2dfde81ca072a52dacf8c03d4ce1f02bbc5eb6e81cf00b51b4420f20cbc2362e8a34dbc64ebd83ffb25920bfead7435a3ed98dddbb9bdafb0b37653eddd6eb65bd6e34a5dda65bba828a4eb8e542807f5661ada22497e01c9"}, + {"0000000000000000000000000000000000000000000000000000000000000003", "000f32f3eff1e9a9cfb380d8ee306ac44bf431106c23699a165dadc6d184dcf3c54bc5bc6da1192d1b3004306658e45998cb67d5b3f82b3a4f39281bdcd6f81bdb790c5e4704189ff85278081f4850a1d6fcc91403b8677ed8084e1e90f16292d9c604d92b16ea840432e2ff8e44d3c26bec3a769e11dd94b5b8a5dbe91905d0ff96830fa8ffc78210725eddb200638e77acab0aa2339544c6fe96b020a657e5fa1671bc64926f1e0e39defb94dfa6c920ad428b4228b155855b8d9d251e6042dde91482c9a69152ac82afb39516b9e9a4261d2b7796c7aafae5cc87f6e778c8026e45b4199bab1fe07fd3e2ce325699b968a2bc4f20fe799113db890ed66ac04954a19ff8b2c18ea31d17550e475a9b2442bc0dc7dc1a920743d795e219bd38aa880317dad93d900354a9e4648b842bc81a25d7446782d55e248e42dda29a05ef12419dbe49d9e5f8ccb78ef7fca428005e79a3aca4018bf75ee0fc5a6d3e461c3f1a140012349dc5ad4f8d2ac200133c2620fd6a5e0695d57601182aa49d27997978af144a45f4333772bb3eba67113ae1f32b0cf6fee17ce133c6a2415cac2af1a22a03d16f75ae74fb53d617f22d431e82bcf84fbef73808158bc8aac8a898a249d77de8ef09ca481c5ef8441663279562ef9555ebc59a3c7a63c7736e99fd4bf617c65490f74f2492b77ec4226d281c272af33c802b0081689404512551582a03e1524ad5215a9f9c1bb4283d0b61fde8f155a2e582ec29a2016e5e7d3bd7960cb2e566298d3790c0f7e38fbf271ffe4f0e58b61223715a68a6997fa7bab2d30d7570cecd1b1db314970253d209e64e610514c54374542723c6cd789b9e3f126e5ac2ab77ecf7de6952b789ebf29a96b0b606913b76959e3c6f9d8f9bc1e5e95bba5d59ed4ed58b77497a7f8b9a1c4591ec03452a09b4fa96da1099813a006398a5a105de7d331fc14ebb2ff7f9727af5319d229fdc67271d057b7360f5f2dccbbbbb2e40de7aa604ae06cdafd07120fb50c08a8ccb51a42fec2478e50c3327a90cddd4c78b37240b0c4a2dc51110798234015b28cae7146d1b43f4095789d3a3265ed7dcc9c3486f7d14f057a9f7e2d24a1943f47452cb40da643709647a2426826c917b4701413a2a3d78dce02c538462aea6afb39bcaef22d548cfdf65d4265d11fe943a098cbcab39277761d2da41371cd9c6b679c5165cb8714a5c1d215f14bd227b08eddbe17ab75b0f7dcfa12d0fa56395d24e97add3a3ceae5b67fa604c7597813b5f39dfc05564d0fb4ef4cb637393c75c95bb77060c98fefd99498812b573d8c1ed5106a673075acb337638ccc40a2d894981aaa85335df82775f46db3d0f21e0cd3ba48db7537810973b0f7dcbd5ebf63d71b4a3c00f86032b32b5769f9debc87d9dff8281ddefb201d34ba6a991a0796ed0208c361e1f1a63d5f861b40d29cae09b9e4a2f6b9fb6fa47da12b264c354d93d06e44e5e744b004b967a047d93ade54567f3369b194790dede375a9b391d83ba4c65ef7ca29b1fb743d2056e53cac90d6d7fcbac352ecdcae66666da362b1d5f0c83165022ec355c4f480032705883237dff7775217fce56b9dd41634a47ebd96af5051bc2ca1ec45030dad36ff1e3e3955324238532b71bc144de979772033d472e25d20c5e964bd2ce2ec177420a6cd6aa313f90c316a738405bcbd6483618e9f20a0e4e78fcad0525944d3ec20a69e85fa08aed1acd9d8dc817d0d1384744d1d0e7dab599b07a264bd5518aded2b71fe404d70c6c5d6bed0fa89501dbc93c1f30be76fc42832b7d77688d0d8db3c3c4247edeea19d242db524ae9129bffd6014a15b8eb4ba1abcf446470cd824c46c81e5cda5bb70a69a31d77b200f95597ed601e0ba72a"}, + {"00000000000000000000000000000000000000000000000000000000000003d6", "01547d9556dbf38f94c2c76036fa35c277563aa87714b0bb9f2a89eb5cffd0b5d7c4dbd1ba6e3d98c0fa0e3c85fa9e8d0e155e7bb472b5a9ca8e43a9b8db304889faec5016840584df3580bbfa2d3e057b3b22a20347f399c5d00a6180b292c8b9b4eaf8f9407541c029df33f6462e218bb8acf4e88fbf71024702be3bb60ca88bebaf48673a939cc17e452c115dad937448bf26a41974cc4b3898f5bd743b6fec796b32ca5f3aeb0dcde1b7ebcfd78710d43a3b265a9aa6d7991fef692ad239a4e6e86d95e52d38e136e952668e8815d7d412d6f7a1bb93e83f4aa9e29554534dbddb0fbf22f115e1e36f06e48751e59a8313d67d94b0cd6c9b24e11497d93988cff91927f13404233d8cb2745cf4de2e511a7c209cd73f174188c83fe0e9c63e70fff6bbfb3654adede531c5239bb143e41fd6c5415297bdd3636e3a54d003b20153bdb939533fcaf16f6d3a5db7a301c2a2965fc2993cac59a19b42dc63c8f4a5ed3af7063bbb0a2ae29c0d23d6e1c45d9cd73d16b83f3b0001e1737faa20c3bb920c74eaf6e3f58a4ca35c1db22136f4cb7b0aa5a49c7734a34d70a0c56af18d526a028656e6d2d42f4d7d39f3f515d0ac4d495d50b096054c3ec74c8adec87ed2b2c20cdd56aa8f5d784e84148342979aabe26bfcb3986b6afd09a71225dc0ce11c2fa326c8161383212bd21b47aafac9a60af05a7701f8ca2b6e27f7ff91210052d7f720a0456844f1830a94bb1d9c93354eafc07242a272dfd75feb5c8d1716ab6d269c77ccfdde2079ee19efb5dea2c81d2e1316b03ee737e36463eed618fa7359e39fc80adeddad12c910b770cdd132b90f91a55ea62e236918feeb4a42ab5b9ca92bd263870cc8adf1de2cab4a19ff14012414b635b1dbe429dff8f2fbe3bf65c4e1f59671917553c7ea0670a023dbc54806ef648a8b2fef7b7cf80160f9ba3b8a584e7dabb8cd2475b9c6c490f8c0551eab1602a8de4250f3dc2555887543c68a06b60c0a2a12b60ccccfa8d5e09c2575e1ea917a5686d4b48b746b8ef0551daa3326f1cb5e4a6a38b70737dbf435097ce68b26452b5d56c931995fdd3021825153ec4c0bfc815bfae5715567a9210facf8d0bdbc267359d22695acb3439157e1c738d43e885de3d15a0c8e05b745d103e4b024190ba875857f113ce9ad72e43146cd065ac17248d86017025e56fdc7d44f4ece6b9cabb92daf25dd0e92e14d83eee4745bdd17996a448c13aa17aa5de5b9d1a0753ee664403fc5ec626de3dce15c38d6df7734d91d87a17d459b733bdabeb22cfaf96009d51ee859d42760ac4d2502a938ab06968cf536582f872ee5b9e536117036d7236cbd3609cb359949e810181d2e52532b0ba650d70f9ee4c1322c09fa427a19ba13194acaa6473cc31248821cf22ebd5f5d7f6704ae7ecc87cd8ba2e11d6224ca9580a19c3f18ea10050671895aca2bb1c88131f703ac64c88d31de9c4007ca6ae713fc5991e42a9276393a448cd3c6dc137f143ed4ed82ded4abf5a215d00e74d72610225ee8e72bc71ccf57207a2f8d01062e076995b6a1f0988e7e5887dfdd1f9806078f7c296c375953925da7dd0a4b30c4fcfc02e253c172eb887adcca02aa2fe355a7b7445d06e9f71a294fde89850ab2fba51303d99a8281095ee4bbe2576ce5c9d7b0a21aeadd25d8779a43b414fc4b5ce4d6bac558d9c1e040c796f9f0551e675832fd375a2b920d6fa67964df61f1e68a954afaec8044abd60e30d35210f8bfa48785f992e58fee3925050e566bbae5e1cca39ea48922cd72afab0c5e3eda043fc74d23691dda518812e462f8dac3a645f7dcdc071b3312174894bfb382fc63bdf7c7f9d5b371769bd01d63b614844e64f58ea50732037a892e7880d9efcb"}, + {"0000000000000000000000000000000000000000000000000000000000000022", "0004030f316defaf9df74ca4d571f86b38835d3a8f0e003d42f55a25c5f2a20ce561748f836a02fb932805c5ed5f87968f32d14f30fa97a8c84cb5dbb3945d07056576db6426f1f78cd174b0b54ea4cc3f79defc100a3c420629d717a55b9164a83e6e9467cba74d5d4c073e64031492c3686f6593dacfb48e1099b82a4f1837036f8d4eaf3bb41622a9799aba00ef6be78d3b18b8f0cce7a0692315e8e18f36e6074096549ce4c9000ead6f1c0f29438e4c818c315681b47df6f2d541088aabd003c9a5fbb20088065ad19ee35364de556630f766eac192a9a390c43478d851b793743ebc4fe831a697081a7627c7f493249e1db07825d221354e0206d8ab4de52cb291a3789124773e16057890bed07012aa8b6efbf77579d3de913961d869ba9c2f5b6b5a0e98712f48a4dd39c07623b5abffe9a9008c4aa8e30eb4fff8fcf3f611c92c9323be76bc42700015a60d0c6a6c6f3d08351269ef76785a447e8e8deb7d319d23711a88560b6760f7fe32a6e272fa21e4f132de61239c9fdf8b0e32baf920e24eab7dcea2d57c5851b52e08fca69553a7ffa0dea34ac53bd6930a76ba5a3b201accc3d9c9cb62d359543049c8ba737a43ff8782382926f6e611a7e55511263161e72a33849a7fbb1c2bd0fa6398d4b924d274c2c1f47f057d35794efd2b2f3c856b94a5f4ef495dd394886cfe1ced5db871e70da73ee9e4092ddf11d923284dfb2cf2c5dc37a8fc10bcd17be84b65b56bf974a63bd02ece81a8bb6b6d19ad07876e2dd7d57451e385ca1c9ee230567a810f1fd98dcfae4ee88eacf7126004ab777d6d19cd3d6213ee528cd1c895babc2c44d5f55270a2b785dbea9b5861778dff9a565769eef739b0ff655ebddf99a07b18935369318da2569d5352cb765b7dacc58a1a801a2e7839e6291fd7a10f93e31dc0fb0d9938592a4839011b0f3afb4b0534e51ca2416fddf3f5c890f0d06705c1d445f2776da7f28dc5cfd7c1a1addf5b3eca8a18fd2dada3da8987337fd278b82db151579eda43ee38b60ca56f0ee1c2a727f7e19dc828da67913f0cd60f03dae010ca7f075c423539d2e25b7a4114deab1b104bfd0dfee955856ff745efd0b510d6270431bed41dd6522857dc20798cdec92de84dfb4a9888ba26ae277696d9ae948ba9e46d749b91d6ccc16dceaec2dd0397ca4c96539528b5f5f612985c444297569674e819e6bbb983ca255c5ef88238aff4f54215a11a15a945d477af3d63852b622dd4aa657f9c2616b11b72b150d50fafc3286e0173d898e089637d5736b4dffa4d08af68a42b873e819161c5cf2b71093575bd175ef6211c3c95708a770b97cd1317379f028e0c3d32a9390dce999ebfcbbff9e019815930db0f9894f82870e52fde36a1e3991559f3cdf5a449bedd76633d36797a0432943863f69fdfefb2f0a3a805ef8ab3b0db81eb27f4634a8dd6187f97d1430a4ce7684cc4c8efbfeb219a738bb1a1ad57524c94419cb1d3b5f143fbb7e84d392d2ddb96a57f0095861655ea485a94241ec7100ef1be41a91a429feefd1247f75f61c697153f9b231a539948562bff157485b55f962ca4ea139aff0a1712a9cdf1ef0c5b37aacea28ecfe69ed62f5391d05313066d0ac7e6034f640c067d324d991a5040fcd34605edac20bd09ca27af68c77f6cc1a0c2c36979d0530fc62eb2c25e962944b1a428afa316a920dfdbc68e1bcbb1a38d4be191a38a12a7d1248ce4f0112cb3c46938ae654ded4a29e9ca86c58b4a423e714b5b9a76099f432143631e738579e29c5ad5ee8cab31cb6b630d2b473623ca5d008a217113ea168b6c694c252f322eca52b1c1665f87bcc394145e52ebfdf5103132ae3025e50f9d6c55b9bae2081d227099c7bb031fd331"}, + {"0000000000000000000000000000000000000000000000000000000000000006", "007c0779e65899914a5f2305887132ce6d59fd1f8d453843ae6ca8b847f3a04859657a79d3055dff8ecf1708b8cfe74ac0cea6e7f7ab8bc02b220a21bf13521fbe964eb52ae2fdede4637c13e417599da8f56e341a3882542bf269d1c662359afb6d48eaf0bdb7b03f31bc73c6c497ec497e45c3c260f68315a5f23f881a2b6596bf81e5af698123864be236244f3c7c7ff0553236edca5ee270e3c8fef886666c6f5f05a6fd193807b6c4b405f0dd6df1c190d8ed09fe961d389608d727dd54098a322e95eea025a345496a06b7a63cf0490ed6153f39076deafa13393240d117fb55fa9d04d8275b0bac9250f0659c9a046f24e4a83a74dff7b36c165b13766d91fdf5713ad7a6f54e4603b966df8bb020e00b3c11519b553c55353613e7609246327d934716e2df91a9166ca11e7e31f745dcb628e58974fa9a212f5f7eff13590ce3dc6553c749583edc4859c27d013b64419ba28325ddcf1761d4722f2e3c733c839d5a3b5bc7ffa24ed58b10c63676b3071201c7117e0732696215dedd240572b4946852684fe55a3b9a30a5336569e36579f1efd05d4557556ae49d7b3c1205c4042dac08f319e6456394817a17d128e0700f76d29511d13b4c7b5cb8dbec21657305bab5ae4720fda51a0f86ef9a74f38f1be70ba3c29d6f77c98e9194412428c8e4c2884afd3d03e71a5379f91e8ae032170ccc03d583fd231518a0d5be37caff7b694e60a79e96eb0ce0953243cf059ec95e12a47456fd6a962f79fba40841489643d3733ee64352b2caa43e5136d8d99c511d093ab292dbbf5d6065e2d80b9e6b557f73384100099488c8abd9e1c9e391d0d886bbb479bbef97393a1011011e13a234c73ef5724420d0fcd26e7e99c0800a7e2d1194ad9da7db46718ff3c056548b820b54b721c18ba54fb9cbf3f7d8f33ae31af82a450454a67d00d37174ae62eb6130da52dcae17f958e4ff2d21931d64174fdd4a66c33ac4925b473a4da907885d3dd30c11c4e32792f5c0c79713a1b4723c8917b077fa814067968919912c71e2f587963cc9529df70db356910a4ead4b34846acf14d296e9cc6bd555cb697851d614133acf2155c891e001654cbdf0d8cde63556736a1391162c5421b23527fc8275ac7369add549ffa47322c6e3cb45d9fd2da85e53942733d85627549590a701b72818f5f2723f9ee0625b3f303a5b00533dde4d1726a386538bee79c838d58ea138b045708a7830250a7de278a4b94949d677b2003ce2b8adbd14f6e1c10b7afdff7246d85453bf254ca14deef310d49c13bd02622932dcf163effe4200ec549e10e0bdfd7b303e2d1c0266fda0b9b71461b2f8ac4298b1e0d417af6c165903ae52f98b35fa038272971e69b6058896c1132278d16cff57e0758326c2c49ebf0445eb32b9542d0134615b3b27a469f93944718efe20972fd17994f5061e158d0a25f09b621e91680a280b8605df12e8e216a739d2dbe6b867790ae242597a61e0c0c8762dde2764c365570c8bc0a3fab2a82b5e4f8227e176b55d0264f666ddab9deb6d3b42caf9993b39286fbf49d409561b473e7659cbd776117ea0fa3325b31e1d629832167c7765f4b6b5ddcec89dcb5537fbdb81df44405f535304e55deb6b838566c20b37dc839ef13ea11803999dfbd4c999cb018006dfb2f256a20f3b5e062d2535d1b58d541c8eee061556ccb7bc3d8846998348184cb4805348760bb88e537240c949c8f3708ae514254547f0fb57afadc6fb9754c1f877b24e737903ac0b31c3bda8d46d6946920953ab745c7f83239d58070b7cea5f7ade5bb960bfa201243aed52cfed97b44b17a4cb2e140910a28c74d1a4a3ce0149e5fafa104730f443cdef95c336efb5754f7abb30c1c0315f97b2"}, + {"0000000000000000000000000000000000000000000000000000000000000003", "003722b77b8537f5c469d0e521551b484a0279cfc718434a3e86d3a77bb738127d77a00e45432731433614bf7ac9b3f2d2fbc36bb193fdf1fcd872eb4c404f2277ac8977d97c28eaecc361307c6b277786fd62cb0844d2069d8f5d1be32eb3235c2117355e543f95850bbee1ccea0bb485c0f33a72385a355ac208bbde970f070f95c3abf0b3785de3f90b40bd7f629b9dcc023cf362029c53c40d1931346ac55f1641810fb076960e86e7f919482b5e8f13a3e43c61606d272a7a952917812c10a51ff2f5c94e0572c6b8744d5f9254bd2f3e2f867ff69b7055e44c8521954967cb1e487914c05f455d7be7eaf1115935276620f5829a69e9f3c4a31239bf92b8ea9411d7802163d6dd8a24b68fb700f04d13e36ed4d5ef2fdd3449ba9cecd24f4d1cbe8fd61322cceb94ab1875d76891ee4c550ca2504373e32e2420cc222da96719df87d32319b68c5149897127e00586abed611ef0ff0ce90171823371d97bc656be8c1df21f729e289bbff49b45ec95c11b2da78b1e042906d8dcaa26d95cc3aa9f755d92644095e902f692a63feabfa5226afd4758fb848e84f1bec14e73ac397608815c7d288a036868bc81fd7e77881d9d8c8fe64c11395e283b1a74dbaaa40940b065b16eef53d7bdae0a663e902e6efd53c2b923213e44ba15d62ad99cbb1705c6c65fa0c09fb8ed720158681fc9530478c600077138e051121519a46cf0ad2df662bda3ef9f0b9d3ae92d19fbea5b9d823ec4f846cb54be195d54d6670bf4e7f8549eed7fdcc6554083d069ae1842350f7a1a17172e5b19b32fa556741f6a7e7aef1ec01b40f80e0eaa934f690247e90f2338c733e091d0c333b9f70fcffa1852c64e8cccb4b24e1c2342f4d5fbb842a0145de19fde995c6dea095218119c0fb212c3575eb624ac8adc1289e6bdbc7c663282c807c9edccbe354401460c0c5a22c31fbe6bb37c22e259c5e10af1cf7e0f45888fa25b76c9559952c020507c4181e995def51469a29a98091ca44a5e64e5bc3d60b7300b5dd32c1e307793e65dfe8588cb17a33a7a8fc26ce33c478906ba35f363a43c0bb394c5c9e3501e432a11fb9d580dfe316ac806a2dd1b2924d207ea761a3758d239ca0fd7ce93100fcad18b79343889ef032ad6dc984e7a2396dabce695e9b5f5b417ad03e890fb3a3f3f36e104693d1665988c577bf0c174e8486a7eb8a519b66d284255119058a733687ca6e90046e1631a1d3b223b05e4d192490c5d14c40a6494e6c8689d5714cbc2bf17a63d5c0206c452789315270671ed6b7af9bc473e0a9fd16055da3265c5c4d2dda07be40ba3c5be09ea11f5e7ca40ac73c9743ba1245e09b4927a54ff017519ce0a632a24e0fb773304b509679882a2bb3777331acc411f5b93708cf4d499259b4a09f3909b3cc7ea0328b050b9461bf12a6215f8dab129e5c4c8b1560910e1ee004d4ad22138e871da837ea47496db377f7013880776574d96bd9322a13e668dd00ccffe8c409c1dfd0d4ab6d1672cbd3e73db24cd41ad800f72061911f5a55802e846775cce085844ec6e1a3fdaf367a43b3dcc57c956024ac64bd66975d15ee345509fede13de83e3377980cfdb6834509bb5e514a005d5de8e0405605a61fad1db5ba44e4ba22f3f49ec7eafcc04a133487243dcb85f97c84617f53bc52fd5cfdec7c3a29606b8081e36005ab4e6829f662d2424c0438cc5e200a27808f908b85e907459c5e51c172893cb942103da90219d0cff6e4d046a42b4451b879605ceeaf8b13f91376601c856dd97f351fdccc84a3536b1b03e62781aa73412a4f456e1873dd357e0d3907e9572fb33de314a10f922257ec0dd5573ebe5cf9be23787f133faaaffc931405057f8f946cf7c2d9114f7f6be357"}, + {"0000000000000000000000000000000000000000000000000000000000000016", "018ec6ba92014dfd68d6d702e5d92f8612b957060628b6c1c8c21dc6d4f9206421c6e67882bbf77b1ec71f7db235daeb8403a501454718ac7d1b4064ba14bf304faa7d6e50073687615304fe783834f8767898450764e545de19a3c331ada2e6119b1a28ce85683af60b7f7ffad94345deb15451f089f652c5f3353684790cdfa9cf30d288cbf8c385fa61e6d47e5376fbe2c434b7cb21dad7f06124cd848abb7842c587cff7f0bf026a6b75558533c196f21419c3db0cb1e88a3fdccb1163a39a0548767fff16415efed8b8b93a970c35ee04b924dd46d87a6b71c3633f04226305e52713101a167c5d52a0fa2ec3ddb7746c86b8857a102850f9c205a8b58cb60deb23c33282a2e77f80411c9fb517b30c247eb508cec00d67c451bf8659d309ba962e974526fbebe7fc582fa73f08c55015fc738de47096387a32e9fb691252ce3333460b9b2c732743480a7e447a01cd41e810cb2e292f18e1897af3b975338ed3b949215bcce013d741af5c8d636c536d725e2cbb1466420d6e08d1f4ecda478b12963e96f6e67a492fd3823213497c24035e07f957fe11f613fc61de198d9651c2067e451d63c8eb39165ff09030d1630046c3d2b1561f95948f78ced4f7019ef5b272634ebdd1b3fe319807702bded3432745453266332e650e3b2245de303039cf6eae27524e8771afe3cc19c471924320de3bb1033608e0bc30d17da136229e14dd44b115e50e85ce31b704854ba97a278d86f57517ccbd42694919df20058c84492fe2a8a93ea0f76b0e5c302b8f51df485320834fc9a09c6c7378f0327c0dd85b0de1435a931e049f78d6044afe6bd4e1716205cf728cf95c924210218b81adc0edf99bdb46d4d3dae202dbc6597f679d1870bdd9740a3e45aa2bc1c0c453499942a5b5b41f1f3155b9ff60432751d1a4dc975018ddef5197e725027df477974633706f01d1e543ecdfa1b3d85e3c7b06a5bf7254d3d9491966f3fbab34f2652698337cfb067e3d3a3459e08980afd759c6eb7365de13bac7a03fd2bb4731aff64be614360d3c63796e0984787828170af98c8ca6bc73b716725ffbab80566df27d99911c768152ab507a6562c5436f267f94f25713dd0e571ce60c875926a739942be251e0c6d6d691cfd52b712462c48e4692d9c0ff650b67eb7de3df3d4a7ff70c04530304e593c331a7a8e113bbad358dce983ca5570542cc5326ee44277262b9d70f59f62f29451d666b315e4380e6ee91d1a86463c12f6a6c1199e353f7fd57a507d7722bcacdcac31a43c1586ad296c15e91040a94786581e57a1555701413a2e7f34acefa7c2e72131804b60fdad673410f138500c4dd828ab39fc1b8178365a484e8e00fb62cf2c4d4b2e87da72a7f63261a87555fe867c09d9837932ec8fe5309192d8b65a1029eadcb2b540abb865ef2aac5e3ebcdb9d259f05f169e8d3a1f54187d87c581f0666e6373bc471f41901b2b5bb2df66ddcde0c6e1e496d9ca552cb78b9ae84788dd26fbe951fbd28296cf6846e72a33de59a64c0c2d8cfe76e04227181613f56e4486e99a78ee84da2b5e735bc40c145d33e324b76f628359e8e5fec02e123410bc258af427bf2184797bcb71ad8a8852bc5512bf3481384aa648f884e67ea9c1198b844b3d80830526244a544e52a690972324f827e1324a84bfaa2c422cee4315612215327a5bfbc17b79f33dbf1b42150ab782627f04a1543acd75b000eb40258cb3373ebf23288e5504efde17892814e2dcdff8f98265160a7422e74fd8a81a0f0daa8d677c63cd53525870db92fc4fd1b5311c1eab2dd21f46970dc8f3a5cf48aea80a2de535a32faf987594080a3b8cedb1df985a3f0e1c6ae7354e789d8b272cc2d76b313fe0c32d921a121d"}, + {"0000000000000000000000000000000000000000000000000000000000000020", "00830f6275c3027f210387bd9a4ed45a46257cf51a3dac95cc53641a75db5aa511bb38374e2ea699581f1723f93ddfbd62cff22d722ef2960ae65bd95c928022906b5fdf6469117aa97283651da1855e57972fed03333fcd0a2446c9821aa50f59e2428f4ae49bf8230691f2fb16ca48c7f9e44294cef8e5860a5b1e82e204da5680932d6f6ddc1c01809d95eb38e145d7fb771bdd7e877fa3281f41b3858911ecf1debc2599533c06f2793cb29bd029ca0a217416531fce78813b679c0eedd685cfca0579d1a8b4d2a1345fb652b67cb2cb0b5cfaa1398b54dc6cefa269a29534f6f1449984991af8635adf489d35a5aed8864762ea0ab057d7747407434e2b9c5a084dc0d3d1167bcc0199620b6e273f0f236516d5fa3bcbd7f466517a3a03fa0ef3def9c1134a21b56baf43a3e4ad83e41dceb08a0956d8030829bbf7964fb48855d45754c869ddb1ad32d23e2a18015c11f4d903cdf131df70e86f0e9b7306e1196ae201b01d76642af6797f31c078ba6ecea9c6545c02d401d2e5193b4b275124982252ce6fc6fd4c4b9ca74e3a01bf5cfdda084baf94a59753dfaf3236237abe4809c630ee6aa6287f9422911a162b82ca5bcabc2cf62ed31fe06f5aa37705664a3f1b63e246b63b7e84171630bc4fde0ba87a76df7608147a42829bfb9a92a21efb64494a1ccd672980aac73a7f727b250c3f7c5c05b50b99ceb3e313d03702f9fc9e0f6a184e10d096133f1a847839bd1fdaa1763fe479ff6374569f907c2b4126cea5e219ab452f13803f40a5ad2ec8d481923c982288a2e03f816a24d51d9430e06a35817240a50c0b0da11851bc53f74bc6eb35d8d739c7ea3ce7f10c43fa0723a142cfb85563db9a5842e959c1b9910712838999915ebe057a89034d02723cb65919d8da4f20477fb16390472b12cca3eecfded97fe6859f87a200bd26471fa1b78fec2e105a684965c9c5a0d071ee39fb5bab75508929c9f7e4b26c3cc931e7f49cb323135e90cdc5d52bf8d0b274c1f37c0af9da14fe6bbcab8075a0296b3dd9fd40bb61cdfe397f1a299aae15030fc20f3ba853779076e2143e592ad3c730fea0c43224cdca1fdff475858fc6d8997daf2dcfd1f6b6f02af4e4d719b01bcbffc284ba4a52e94abbc4f790782db0ef4b4a6972e5aad833d0012bdf4d1e0b8d7b0904a5b57b9f4c833c78026288f2c1760617355ebc993c4cfa7ca03312afbf3b95ccf87f6f2989a0cf9ec824de04738092fe6954cee2896adfefe1ad80ef326a39f595622a4f5c63f21c67f0a7f8502a277d7b96490cd304e794d8fb539308110431178f16ab0578bf7d157b01f93a2b89f1ec6943a2c7af4fa525a45588e312b126bde465cae77315b399a87b35292f433260b1352ecd29ff99329acdd854a20d4c10dac08bffd4ab00c85a016090129566d9c27a3623bb1aafec189cf71519c934da0f98928b66e49cb43fefe665b0d7128d0e689293f0cab85a5c7714ff184737176f911bbdc0184d7ef5650db672fccf435ebb53fb51e3e3546d52011fa43fc3ebc923fcd412deeb32f8a93aa8ef052125ec39f56456e449b5844520463e1715548818f05315b1559d7321ceef55bc52e09f999149c36b0ea4e72763b3f1078fe283f518f4576561849726087ff5980a07870512693dff75ddb2b3dfadaa95a9940e6dac1584cf717bdd8653e53f44a117dcbbc94de8d765630d610c0a7e1c490940163135116aa53d5c6caee5424c8985b6b2963a073e3c9524d3484bb6ba5bdbd7f6112f959b876c6d0def13566d3069a64a23685722781246be504d04c045dbd5c236cff366fcbcad29268f137a7c457754bfe2eb10f30d816f315b05cd3bfbfa3830050ab46481416eb4e738195d45e266e43ee698"}, + {"00000000000000000000000000000000000000000000000000000000000003bf", "004f47f15f8a883b31d12097f23d3d2d0c3717979248266c9ef992ee4ec685f992abe88cc6ecfe97eaf404e2d89968212109dbee22a71099b30a8d0a7c2906384a43ed4bbd41b9f75924d8ab38060da092d3e83205cb07218d6f75ffd7b238e1275fe1e6de757ba59c137c548866898a7f081f614f47970541a675d4f5d7062393f8a1cdf98ca4d44168a690f951652914e044128c99b90288eef5da43b302f9651a8af198babe510641e63c2b30f2099a6911f8e6104f55fecf70d96c440fad23dc2a582fc455f7ad90c467a2c5fc97fb172a00a98f410ac29da7a744a6d375ac2988fb6d550046f5f53b90d3fa3b3aa386b7ebd8e372f1dcbf335907103a7384d775dbaa2963b1a172dce181da5d78ad38584f2860ecefa5e8c993c39f290809ffdc906584152a793303735e65db65e169cb2c8354af8496029854a19d359f72bc6dcbda55ffbeeb5509d220393a78013bcdd194d878397fef48b51468acb34a369ce4b70a46bbee434413151ebac7711ac576b644ff97568301930043360560913799223d18f90109ca2bb80fc5208b291c9389451d0cbc944b785d5595c598fbc2cc119ae6086e8d460b7433837660f15c2552505ca02e12b207bb0fd19fddab1156a37365f8bdb2ba563d061bb1a6facba58e7b673de25bfc2d5b7dbede5eb418524c0bb8051e2323c5c2999920dfa04b41cb7e78f201b9bf88a0d7a9e17384d31ed7e7c141e8e9b62f291525a6c7a849ae9c7844238661bd1436c2bb3f23df0bbc4dd14c4c1ae3846f838c58276dcce995147b7830320feeca95936bfbeaa3bc4eef8f90fc5fd4693a0cd8792ea6940b4993f0955ca5cc38d38a55be54e015b56161f7b99883defc7b10f4f8305f8010bf61091e23671ef427107d567ba6813251cab26053d81e194d5b7344f29e679f0bf5d58c9c50f23e01ac94e745072186f8d5c2be7136d49459f64bc031aec0b3d2e60e2ef48152d117e9c173c7b61a76967a1594d74b621c5107f1b50e8623070002b06258d2c2ae571f83d548371fe02ed806a39783851b244af352d40b7c08a5245dc2f5ee4aba0918d025406f35dc8a5c7717ec55305ff4aa4d1b43d4e4503571294768ad8906af41b625329d86395f947d6546a40245e7ee56259ff9f94a6b2766d6b2f224e5e978895da24b29032dfe1d2901093f1b6faee481a5687cd0c4e21133055514cf876b0c34595fe81ada4f19d6870323e0742b0c0158b2f40f4ad586f2a28a478caac17a4ee97212ea2e3c756b2ba9c3d41ad8d1d5078d489a36c7e57231a63eea650b74a65a6e46ab60a95ca1cc047a3b9077fd7d1e850c06db155b96a68ffd9e817edc6b5fd10053d26af033ddeafe2dabf5d38b4633404c1cfc6a18013576f75a6cdbf9aa9a02718d478766d2c7f531e5a6b6db8008111be60e486de2ac91f47ecce4c4ea36bffefda83113e990e5220b2d2d3a05d409dfed2e90e479669c0927f2274f99d358d0c973df4e3d7531073c39ebb1303cdb28ae578d7d4a8e641fe2b100fef83b3c52cb172ca39abaa875a173544513dac8898aaf7a394b742606f6bf6290ca29d7c6242f14df2cda44d1b4da401d3531ba5f9072b2ea6ae9ba28e87a52e2d95db82d29e214b98c10a8aabf1ce53f1e49d7fa2b23f3a5630a66f963b74812b91a92524ec5f891f8ede4e9ad7a2cfa9d5f44f2abd7beea44047a340d429a29f5ed7a231f5c50dd9a6344fe78629001fb0a8dab7855b783585b1517ae97791d9d20e6376a487eca1e5bf2b27a0e37e967dea3c631866a539959294be9e8d81a5a5d410f943f33a56b3dea8964413f2e4d8e87d31be62c3fedd3acf56c0109863f57b4bedd09fe7d4afabc1645d5fc241a5891131e3a6a245452281fa984be4b17"}, + {"000000000000000000000000000000000000000000000000000000000000001f", "0031f9e6e8645e35b05014daeaf5ae630e121eaf6a01029d772831524df94858acc070f4568fee3c286411a24c5403c933ab239b12c4174fec6f134759ede43cb5f3b91cd54bf3c3052484c145dda5214d3d3c7d06a85b188caad0e79a7462bd8bd6c553701a9e33ce2904c1fc8ba89a1dcd69d6f67a7991b7c9effeaf1a150db95625a793cf6a5e4579e7dc31927d26ff2ce62823e3934b54bd70b11ef3985b2e260d1a67708eb3041e3d667f2159db0e15a2206fdf23154da99848fb096cbcb40e876c6d795e8217c3a01014fba5dddf7a0b2f7e9d2490b912fae6734552524b3dcaf0baa8ef0e4aeab9ee134ef31ea6b1e09962fec983416e1f2e05daf1e915a44791a854e61c58db84ba9e83da727a2f519c72722123974b82081f47e43aeaddda1e26f90e35171052dcdf913301a7909dfdf236b050986fbe24d78c350b904c28f7eee297384a7721a00553a14603e835c97b8192c0d87f613365aa178499928a1f101712570e4f8850ba60e5f781a53cd13e4c82194acc15b4fa52dcdb85a7dd67f3654ac72aca0dff1f42c41af3f9204f5545d551fa763682b8f3d5ee5d0fa85d0be048e04311fddfd18406004dea1c45c0bff886c9141a4eac9b120e43316765e6dfcd97b9bcc79cf1ed116b81de248d4013a06b227daab703b90e091dc1a1173b657e46a4d70bdb7972daea582fe4d0c433a595067769d385e378a3c64df0e7240d675e0221b0939b0fcf50c0ef9e1db7111c025e90ddb70cabe38b4ec71303a324a35edd81bb99b6709fdea69d9c73d5249d3fc744106f1f835d902317eebbc244721f94feca3113948fbe91a6ebd7be0fa360101efec73dd0fecdc73527aba73258e6076e44674c93d9b4f64754b75a3230cb5e4260611f976d13b45bedf1bc3531b5eb43674b62ea6bd6a7d85b59db066fc959a6d60b221bcd1b00ed31fc0c0798369a7fe147bc513f8131e57410dc01741edc91a9638b6035404c5137b7df7f4bde1340301a69f7fb62cb05271b56b350433b8310197d331262b9634ac06498f1cecdf80f344b8a87216a5b30300a0ef8e95a5203b8b895f5e01f366d55d1555287b939f66502ea66ec0b4dc2f8aba1fc8a7afeb03bbea10f750344b60d11ad57cfa30b2c3fded95bf378cdfa20df23f7875fb119c203c39aca435c29cc611bba7b026279a91496c9d2e783c1d417320fd4f8a907fd1948175d643b2ac54ff8bac4bf037a9d773054bf18a00e75cf8d168e425d2a16a1a435d15b2153efacbc2f2809c7ef5b4b53212c1053c79cc390f92a1bdc4f5107c72fb471143167fa980143772fd446d96e7bfd290f36bba4a70e8891d8f4c8b0826a3f5ba4e19d389a1d4776a0f32e753fd3d7a40c3abef9a5f40cd038dd5eac3c7ad872b669a4ef869d4c7e1eb634d5929d680203991f58a20f5dd70dd5d79f35cf35d6762f0eaa0b704d85ed6a40598985550bab7b5325e0437822be094caf8a60c3ff6d3b8451c1ffaecfacca92f7b3ff4d5463f5e32e7b41a38ff8f5cb7ec73253691e619003c5b6177c0c195fce18c37989513fe18400f00aeb1339d9639277575fc6a243906f71aad5adb91c29380480d1532588b999722de0bedbcdcec89651f796364a7ad56cff71d6e79e0857155bc5e0535b7dbcd11b04739981159dab2bec07b2f967de57735e3f9b8ee710c36544af8fa84e7f5c428516dbd3b934d629ffdc0daa17de278e8953ffcc93828aa9725503d7f1d1031edfea2bf20d5990ef4f48e356fe3902a9f3d7f8e21903eab38a4e19f4b151727528bc1e750363f6f3f5241fea13028fd6d910c3235933eeef59129cf3fedd2feccfc3a8ee94b9ae2fa7fa44569de21d50516e5837c4ef18f1e1fe8b5171b7a6a1d431ff110c9dca0d"}, + {"0000000000000000000000000000000000000000000000000000000000000006", "0053769b0f2ab8cf56de834c6e21de00dbac896b3b3b94f4b16d945f61e609953053aa7796acff7ff73100ed25744a11099e9f0d822052124f849650b7a6f90a976d1c59ab4a9bc0e8e119a7c46695fa32b113d910442a6644d3bc1570f7d6205e3484ae5fc5ff0ea91cdd85e584d2daeafe58e51722af3e1d4b2a9296ad22836921a219ba70db5174af187705baab1af944e02512dce59bd0549c860a77fe3f5c335b027b38aec70e9a888c3a8d8127571b9165c53448f502cd2a8e411d5cf1d935e4b9eb7349868b85fd859a2ba47f9beb5a6142e119a8f081756d3a13d251b5cef895fbd426700eabab991f310ba3bff72749471d22fb539a003d27c6817ba8d699fbac2ea3b5c344e2c50c782f662637aa252e1e5662a2e67e15f5dd6d4395b5d4bdca953366f550e820f311b2093d0db1f299675a7c9bcb013a7cffe25bb1031be800065961f354d5972a34e87b024b9d504ef7f841ea945361fba51b510be6f25d743a48cd280e23521d3c52a4030053a093141b9a4a010f8cb49ca658a222de2744f5a0d0791e11d251c21310d4f8d790d14929e6668144b3450be8a0bcac25f8047184ff42951e27be4c963f63d4d1cda83d989d2311fdcab09786b8197e0301b82ec9b7f5c34e531c4d04e70b0658a21e27dd1f828fd741744cd10bc7bb2f0d1c69e14e6160df0f35d27951b912e2f0863e36bc038b176e36e900e3cbb941021a6df9e4a3f48d636926441610a6c9cb490a16e3726ddaa8467e9f3cba5016af8653146a320dec98f49b7d26519aaccd55e5ff19ef9aa7589ccb616f490265eb195cad00d5123199190755a7e5c7ffb108d0e5fbbb3a813e0f1096cbe727e9660b718a19f9876db43ab2b6999531a017593b363bb7495e58b9a5c96de4bf7ab7d92d48d213ca2358d864e23fa19661b9a8984584c6c7264ed2ba57b8005c7acf5c9d2c710889ba554ad75172f9caf9bbc77380a59d1c641e8dcda8c73b2c46ddbab4b057bc551e1022b9088a6dcf58b9b235eced236533ac4d9ffc5af8d489662c22efa681a9a0f769a7b28a387cb55800b23b76ba910e47f431631e4bad14bcfd991590c01bf4327a7ba46e19d6996519bbaad5e587cacc80fe0fe9cb00e4888caf19023619dc62003a38f9bd8a2b1d195d34df8abe0dd317e45aa8da568d97ec951873011cf9c9c449bf4994111589c67d8dea92b5954be21c4d7ea662a0e025cc8b257de573f6617d227f340c023fa510359ec8df312d60e2b4a56e80bddb50617b06dfe491c28a57933ff36316cca0443edccff81d7f056ea897f293714b5d43f39da5d3b2610aca4939b512f3c2ec83c6177ea26a8440a133657e4cef5c3b351439846c526b01c9a7a1f1c4eb60909d28773397e942d692c117258bebd11a95b2a5d63ac7a4c95d565d038e593990514e28c7a8d0a1912cd639f7a4fac19b3ef3c45e18a7e3ed733483f974d56c3e5e5bd69b0c082189d34d142ac3785dc562f03f5aa565f20fb4e91bc5f6143f07c2e47f0f826b5fb8f53344153d29ec0461506efb8f086b6d6230f2349723ca59aa9ab1f8246d24dfb81089153973c753774a541e299fb4e0cc0b13abc6b69bd6fd04b8e890d2f14bc28b33d9f8de37894c36f7dca4caf5bec7acd46e0d8a88855ec3ea0842491d6e0c67a4f20141964872d2a0d462af533a0dd75bf1499c1c955161e259966b8a27531dfb42350b988581110466bf230c71a17362893cf385540221105a6462d74d501b84ec5203b96afe9afc02bcbf090b3451d38108f7c0e5375441e22d114598bad9a71423476ba5634c7f79387db3660d2ce4ad96243ab78e110ae5b95351b3533e4d9705b77dd24b577edec5141d4075b1d8d702d32761663f383709fb137e5f50f1"}, + {"000000000000000000000000000000000000000000000000000000000000001e", "0049495267c57b1546cea029f70e2fc48e49908f3a01843e2f0796e8e0d472157fbec9a90247333e22a108fd27d70b619297cc915527a4c635967502ff0712254c46e44199cb235e76e604693a04aa7b4bd4ebb20e7faabb070ee4d6e7a33559873b1801b73b7312ad18504f22f763e9afb61db1ea05cf3024ec81cb42f223fdbe8cc8da8b611cca43516efb968ce3a132782e36dbc7396f6278ed4f8816923853a151c6f01cd88700bcc256a2868670bfe860ffb6d52261405d9401f44c1535b479177af1c636568611de408a556b5fcaf00aafd3c5e005fb3de8203721f1c4db7f327d1b304d3c7d0cf862b3ec3dc89a19794d6b62927a97d9c83d02a08ee56846d7c437dde05c92aa4e81a59fdd97e324ac0db35476e9b5b79565f5257dd84f4f237e31c40b6b1a234008934f43f8a24ee16e8bd65fde97c6c5337a4e2b421a223de5b3a618c26c621f62033fc4ab010eb966eda13b75ef31823fc4d70148ba911cb6744d34bba0659e26394a387643375e60422a0ad4de3d136769c12f05c69d5675741b1c20f1e95f4eb9533745fcb71047b821a9ed87a4ea3a3cd973c5865e4c4c0d8615f645ea9805e64813c900a771dd120cecc4f01089f8cd3f260ec5a5d4615c44ab47210d7d4c0d4410bddf6c3108e38f9662e4a92df3d9a66ff279f0c426d902c9d124dded451e235ae8b4e9e27371d76d92050b377caaa65209d27a13f68d2f314df8a2599d3e15756178750975acd5eaf4f36eeee8d9ea931305bc274a241189ef8635b4c6fabcdeeed55af641dda4433d4c8b78e2a9e77f5e3aa802ccc1e9c695573a996c098b4be66d242c633b20710ab5a9a38ddf3fd6151f2852b402bc0fecbcff6c930f71ebd073061ed83ef60c3a22c24b4ffd38d985163777dbc9da97627e17eb52ac642cecb13fdfcad2b7decc78ce9e1e9df511ed0279397c20299163524ef703036852d7540d3fec0e06d6499934dbe831d998f3ad9ae97b4210f7ba705618df8fe1fcd0470d239dc1dfd25d64b5d54cd5669c31b8cf77af56c3a99439774a137186a762491e48b104c9e7f692c310c51f03307ab11cea4dfe817967f207757d67c20771bc469862d3d96de570f9cd2b4abb19d6640ab4d71f8fc8ebb3364976ce2a281fb2fcf574d703ea02a26239354ed9e092ebc9170da098ef460416d4bc504fcad4ce8f76c0936d93be273333d5eb0896248c98b36d99df3e71c6c896db227a2b9a2add1657d913f120d285e493e7cc9045bbb21264117a21695baf6b08616f8767e86907af59421eae08dedeb30c3f5f48ba4bf9c8f36370c5057166783838b1c8990cca43dd621c8d073aa8b42430c441ce87fe7838a31e92b2f9f7288c917ce80dfd997d030bb9e79f03e42f0cc3bd9c55bf057356d50cd753c9cd73be9ee6060409b0f76f2d1d85b7e2d1ddb2100dfda9217476140d4c5e14fcdd67cdb85313dc0cc6e173431c3c2fea1f9b4bcad8c9a36b29878387a2ad17125ec33a2a5123478454f98bdd89a273a58d3364a23a2b8a1d0f2504aa042d2bd06eddf42a04e39f69013d42fb5f8d2b1718f2065f202b07cf12c1b69f584f618f5cb93cc20ccf036013d1f77d95dd0257a23e14ea7e80f8b9a71d3e7f2752530cb4eeff22ba4b4132a5673db25cbe045eec6b69418aa1c037a114fc18f4d9db99f093c209d1b10bf8082e44772b37522176e4d60f2d1abb8415da35947c8bcda53a28d35d4741807b28f65f251e59c42faba1b39be1c81e273ccd42e87f6e1fbf935a05dab6b10094b1caa654a30e7fb895bcea386af68b12bb7e7d4bdabf64fd8d163fc4e78ef5f7c2df555808498d78c9e5bb59f9ec6a344ee8dc0fcd73bfdc632227b29f6b63d7515d0e126c1b9c8699ab7494834d"}, + {"0000000000000000000000000000000000000000000000000000000000000029", "00346c46f773deb7cb31a1fcb128fa86577ffe731225dc3ee84ae1e513fbf905d6d3381f42de6cffc355104e1d19fb5d98c934ef3310b57568973aeb9d3e6e2ec80b35b0e04a47f7d3c5b384d0c609ce94f37ac3080ca5b653924d3ca2ff31c5bd377ab4ef8fbdd18d14c3a9aa47f9d367d6c3891cd06676bfb6339ff2dd125293338790bb39314f69cd39d0043eec4a19cf854058bc3978db881d9cf976d0b877bf4a0d28d67ccf00752de3964194ba3daa66287d5435a1d12b90c4cb00fbbe0be902666fe08a051c3759089d70fd56fd01244b475e76a3c67fdf5c74041c65417d336b32442d2732448b4e5f055362e4766744b628d1c89d8e52ed01847433f7827e32c7c4e059c28e6364283aba6e990f97bd9da5116cd3d728017a8f7d7f74fc10948078118d27729d6583bf49f4048f1cf894c1ca90b657a22f85bdb96427ced9a926a40b0e3604167e13d9f2500198f9ba43d7e2890ac4d47b2b27dccf9a737dcaed21e851c88ad765d9f2a3a5218be71b0d623a4bd7930a294afbb6323b01986f332b746535d1ecf6959252107019ab428a82673ede33c7dfbdaf7dbf605909c0022f7e3ac3573c477d27e7a95674d262aaa2d79e8c0be7a5ea6a031a3443dcf1139bb19b80579019e4a5047b85b1a38e862e96fc21502925bac11fae51479c45bfefa7c89c2c617b5294c8cfe6b53582b0d4e9c0019dcacde633be57b154612caa14c7544ff8dfcdd808cd587d26cccb3f994f53c580f497559bddd9ecdd07d88c46af03e10a5ba7d141f78b0dae5a62b4d0bd1bff020a7493e94925f451d6029c2f2515fdda6aec06538c61f7c42c07f8bb90f0e2e69a9ad966170d42077e8cfe7b61ed89232312825dc08ea776c93c6a920bfcd5ef3be76709773140dd1254b2e0968b8f2bae303da4e147176a37e13c03fdbee2c07d6aa2114b4102054346f3d2843fdf1a37380d4b3ed20743d2e7a73a3f8d44d7f0bd099ddfa659c25f27130a903ee7170afd2aad1f1d4c5943d191960ae52a397da58c8d323923ecf7408ffd43bb5d29c0d777035ee9c85874350b3114c30551e1fbf48cf64448fa333ee74b1b2de3198364636d0940b9723312036d3bcfb65482b8eff012612eafbe84ca4d18ef019b096ba31b27cbdc56a049cc1afead9edcdbaaf85567d7f63a2d9336bb5bb1044dd65b270a09931dcc1077229bfccc963a06970f101b58d5c90a07fe78dbf6f833f4ae5a879377c45926af1cfa451885adeb43132bc4715cd975953bce394bdbd55523da50c9a9c4057c29d848269aacdc926f05016b2d51b771bdf75f518cae231614d97e1e443413ee435b7d9b8521039194b28137f2360738dc6f430a3dc3ef13d3fb5f0441a40a5f7d10811043aea7a5231d35bafde571f186b8f6ff60622342ee8d3f9c9304ddd0855b661413bacc03dbcffd45b143cebdb5ff1e2947f7860c75bdc50b033187e9b444d3441c0a6010a08f5ddf17b417edaf115db20e306505f28edddc56276dac60b4f5d1aa0606a2c7b7b866ccb89c1e71057c97c798720b4dd42126e325f4aea717c899b74705f4103127c9c1f5eeb4921d3db230fb4672bf493a295cda244d9df485f04935267648dba1d10a552c8f324c11e1c2e36959a99997b4c9d4d9462a2fd6991f06cec44cb961b1e97601e534e7e8b7bee52e791d831d6a6660f89817df52c4c2b4fe4c9f0d5f93ba573009b86505ccd809cff0e3950df9f7ca5ed37a5d91ce1a9ecbdc1f1c5d8ae91034b70c31535718bd9ea4fd09c7aac4bc55e9ecf0a20220804cba3ad7183bf52b0fc95fd0f90df0b9ff9a6192961e7261320991174d10ab099c635406936570428cb498131dab2a5c41d61e4d8684a454c3d5135ad24560454bd9dd3b1a9b1c"}, + {"000000000000000000000000000000000000000000000000000000000000000e", "0043c00c93738ce1e4352b017bdcae3f75a1bccd1c08902516d4101534b5c350e2a64a98d28d59d6d1110221c59d260516a738a5b62aeb43c38e2d73f948290dd4265e6975c123f7c62982d77c6d7f45f71d77690e71e8dad90a02316a314318c2195b1925ad7708be50d5ee04c39b8bfb7c2305719af1877df90f3282066af655aeafa5e93b941c97f35f484be624b0f8b2197bc464202c72fc5dfe356927afd57bee7684b7488003fe09134e5e33adebc5b3f043ef93e9e0d9bb2e3a14eb8ff47f4dd2b89b80c6148c60853a85321c8b2509fe155edaae1497de84c166d243d6b55d78944aba205543425157f28ff3ba135b6ce4dc9ae08b1badd40f0f23393e21e9475182934d9b4ae1e5b87718f93b376e7d95ef5556234956d4e82e6e9079778cd8404c19af44de7d49eb90b3bc443f28e07e1ec5f49eaaa13bed563262d6c08dd3f3447c51e5b785b56f8fd50c02cb16bd06da18993593338701c4f72d4df7d7132109e0147f218da7f33dbdb77340d02b1a4c2c3d793b087dc4c6c6cf3b6742f43098cfdac2994ea4dd77d456484775ab95f67ebdcd85ed4bfd29099a1cbdf4bb0aa9c602ec4f7037696a34bb08458299d97b93c53a0d1f89baf1da77950083e3c7edb394e54bc1d9e9fc34e78b60759fee4575be27cbdb72cd26222759d8c04c240bf9b76ccf4d9170d707594d6851cff89cff0205f21e76034994a335c3216187493dfe7f953b26e051b1263b4bba34abda7d15ab447cdb1b4d665a71c608c6c49fff84a2a87f4350dfb5450dcc89ddc8b1585757af4c7ae619e792669761343fde4de49a9236e70f66aa2dfae48a779385744d5f30939ab3dcff5a6f12514a24e607210edaf044226665352271e138b56347c8ae317d92d6558934c77466f4645634cdf1e9b549e0d5e6715a96b3fe00d60aa87e5302688cd71df400ae4c7748845a57d3d6c2038e389fe50e6e3893e62785ee5327db8cf37c1fd43bc135bd55d63fd704170148c95b21b46509fc5ff37f834e391de60fbe4c840da7368f20c5e41dd3fb72ee525b13bd42cd3f722502b660f71a399de1d2a2d11b700be708bf4bf20ba911dcbf6e9a4a01d3ff4321ce21f0948a4bfc5e2253068b65f3705289c7835f344be0338df9b3939ff7df31e3b5c2269be23fb77b349f61d2e1a326de7f1a12025a004862939d5383c4d4883753acbe0b2ff535dc1bf7c19f39e3582fb1ad03ad5ee3462df6b8bf9470171355f69535a6e7f33e9532dffc0839c41db9bb25226e2f8a2c22ba175e4d590efee2b406531b3439a80d45879124623991197bf14dbc7ead1ea854194b2c203ce620bb5ba161a627426d2a1a304afb8bf994c513d6aa22e959ef50e58ae30544c5ec260b4f5ab874302786ad7e5da58763058782637d026de7c137a7a603487fc94a6028cf56235344c5daafb9fd801cf9292bc7251f83a7ea05ec5c7964147c39d3b87f7e4f44067bd9bbe274166fbe2803792be9537629ccde0bf01524ca3427900550f876f2bf9b2b48e95573fbcd0803777f18bda516a3cd38e368f8b41b41c18e1d021c04571ffc1a3460f9ad1452a34675c9e56f0977459b183ac4f218861969692763c0b8c48a1931c31610bc3cd58f9120ef1d3bb4af7511c7b55265e38cb62f0e084f992b176fa29be07e6578f165596efbbefb7b7743725cd533ddb54ef5db649f49ad107dca5f9eea510ed65ac6b48745b151fb3427b9ce6edd3ad31291f33eef9279799b02b99ec954711aeb22a6526ff8f2c80b697b8326d92d6b2c3ca35e6af6539972e51e4a9a42a79c57b0d5619bfb398705955951e612aebdc7a50d5bbefffdc85e96608c92700b32e03751e5fb937a38cb7484e41432210c04f41ef4cf44d9a52d962528"}, + {"000000000000000000000000000000000000000000000000000000000000035b", "003d7a484b0c9c1872b2a16fe1476995f749b182520262e83fc45ecbb7642f678e4eef29fb90abfdd14117990f170c084ba0de053323ed733b79d1151f52a524bc9edb53d06f81833562e4d5f93a4a83c0785c541047d2219c17c767db219328409bed873e693af1f4310d4e236216aadf7c8d9b38afda10e6d5939e1d644cd1feda485d8b1529e95544c3d3b4f5f33ab153535bb04cf6281b3b5533ab67382b7cff5a5c69b8b4fa0bd97e35d50b92656d20a50ad03be5776263fed1b1248bf6e2a74b7adc6030a9e4bd63866e8942fc38cb0f91bdbc2c880002e98601752e3aac459e8ded4ba019395b9e034ff0df4dce62592974d1c5dafc51560a1504870964d1655d09df36554af4e3869c9257827725b2acd7ae0b82edc7ac669189418219a725fcc6b12209ca1ee6b6079bc382e894f9eaa06f382cbb20f624e66ccec2b15627a80833f9ec7edce361ce3f617b00637b7da3d468abac4eb4c7e755a4f15a8131bc573cda0a36d52b299dd50f840a17f52c2ec874b6d12101365e514cafad29f261a40a553e3e318254721fc91cc8469005584e2729c0b2e052eacbed4135383952021196e76cc82def307452bbcdc386a6466275144726bbd4d52266b497c0aa67def97224166db716e5b90321f491519d42034cfc32b4df53d25cc61739069d299f05193890910cb7e302ddcfcd10f9cccb1891d7034ce4223e5bb1b108a6e1cc4f61802c961eaa49530d39ea3e4ca9bfc5e1cae3b183a1bf25113b372e9b381eecf71355b84151b1548e1a265115f4de3b03b938a2bb483354eee32073f5565ae6024555f7f999190da3d358fd1c559b8b23c18a8a981d4f94ef1f5941195aa331d9cca467611272f8812abc2f1b505a43800eef6c128fcb63569ca1b3123caba429742d8ede44135b7343059623af2c9911be1234771ca7ce0d451302bd0e7b774f3316fd9d70c2267b986e1598be5d0807100ccdb50313637fd01584fdff70ca4ab21da6090751f5d516975f39e2e5e2e0a6bffb11a358bcbc6008a951741da7f669ce259999d57bc38e8ad2db6bf52bd6a255e4696537e2ed830921eb8096f86edbddb363804d64629cdc0f3022b6b78ec18d51fff57c42b839e13bd99491759cce1c050a4836e3ca17cd120113468952b459f64473fc04a6110a4d5b5a1bdc570a65099b668151564a939323942743f2979612a857a2e50e2ae78ffbf65bade3b5f38a43f74fe90d6f3df4f80a823dc10609cc2ab6b5811f0970b3758610d034f810fd5c58bea3a817859983c3005d135322d9db7d86266344ce4f13f482b89e9292b64327dd30f93d6451353ee4ebc1686857cf03a5a277428445ec455dd3fd47fce49ce056a257d65534e85bb2c10a1bbab8b90267a91d1100fa6913f850385921c935f22cff7fade002d77c5bf0d7be357e1c10d57b0ca9e639381c6b2944b83ae1acaa14c7db1ac5e02efd9a1dcc05b18ada0e0dd16add5850eff56e40fd77ca4d75102d36f54231a5ed01299f161b44e979273950dfc2d8de1e55f0139f40f6b38df696a249b51e18c06cb559272afb521801962c44ccfa0bd0b5e47a794eedd1a5e7cf6dad1443249a4a8fbcc7b7e153db7478767232041555072aa286c2a8d6d66fe07086c635b633ae8432dd93b405094b6622649fade3f985f25cb072ce35baf3f27705a1ee53e75a14859b1b909af48f7ec84e025f5e5818495a6780cecbd1be16d59444ea7d69bbf658db191a364ea87a4a34793e6d54f7a52f23029e3d553dba0970a90b33d446d1c9c4421a5de94ed16b783af097453ca78306519c4111f33b366776838af453ff0e1715984d9eee0d617ea10472f9806878936776fe2a091b471f7aec0db1bfda02c2714de560d21b69db16d2"}, + {"000000000000000000000000000000000000000000000000000000000000000a", "000ee6ddaac3c7a9b5fd21f541ae6d81bc436ea24000876ced434cc9c12fea943c0e3c605a482f7e39d323af314c0fa0922fc0fd92e4e53906113f923f1f6d61170b87a01ddff30003f6ca51fc12c9bc11ae9f3605eb3b26abab9a838f5040d56f47ecd8b5360e8a6a0a5cb575052bb499b2d0764602da8059d3a5785d7b1b9b2dbd9c089483a40f63e3662a88016808d6d5992cafdf32ed68d2eb9f65752f24e0ef972fa4dbd6210672ce2e9569819b8199e4011065f7499d90d31a1c3c420393528ff96d2f22d6eb9dfa7e767299bf5ebd0e3c5eba2e1dccd7b5d9725a57438d46854fbe5c092ceae5bcfd993ddf734db4e1fbd5baa5febb1d9446075e771fec902fcded5f07adf4da714e27c778c42226f12f455d5216ff769383447cdffd5a3d2659cbf60de5d69555131e8ccf39d20461da66b0fa9c4b8c1927e7539058d4bbf914cd8624a3384e66c9527864e10217fcda4582732d2fc0871b423dc4e71a9c1dd152241057fdb6233a49576ba356bde1ecc0eef2ab54d81b6403f0ed7753a5ea595441147a67a98bd7beb916319d79ce72aead53d895b5ff47d87b8660e2d8f04a076bf2bba4e3a6896343920661e089b4da803fdc24457b65887ae473d746ae78d670dd8ade98567cebbb083d6ef133c94beb730b21ad8d144388927a9ef6991915a672d55e0fd1c121860c68f8a94350f25c4ae50d5567cc458c9063863c871942efdf9312a0df14d3111f3ea58ba3aa9df9089219c1a1dc2915b7d99f531881956e48e25d4f260c06a393f5d736a4d8da086e48ac068f9af5cfedf3c42811275e1db6830bd4eda91758fed0ef616aadbe64a45493e0c721db9c9eae85227bcc7aee5a1031823776fca2c64929e3dc772a2531e28f7dfc5979c94cae67de766503d685249b50ed3fa91bc2ed5cc52bb1e754a2825a482e5d557dd2cc0130a1b3f4cf54a307c2c164b620089ee600ff69fe1c875e34b00a2c75042134b6daed32769f0f9fea77049977742f4312742f90b69dcb6c53aeaabb595c15688e7d86ccf0cee3945cca9cede542c786269ee04e06866260ac07032ae7f3d50dba2a34627f15f5e3ee490cefefe4d87cd190323cdbbc7afa6b81935dd2780fdc652b46219249f76af3d83cb22ff1dff1bd03c5108f5c9ad90db2526e2112ee8be6694500a4fdeeeb0730b23093dcb2891fe626df9cee0092e16cfa61520fece3c865a064d5385392791dddd3b0ccfa98b9d7122a02ac05d7b05f67beb3780fa69c2337819b5dea1fd037bfe54cef70e45607065c47bf4e15d4b8464f09599d2ecd46194b9b7dd0af43397b2eb8f8f940b3188a765af2208a4119cff795f3c7838eae8c9b1cc616e388fdb046b9234fec74881d452e3daf53da606219f5f0dc07acf8fdb523929662fbb162bed9f83807020a6cb65d510fe6e6be1669f6dedd92aaabdfecd40c9e09bbc3913d66e1ce1542507be3ce6a609b5eda0f22ededd3dd0c6db963c25a267c97c210a1733c544fc91b854af331cdf7652b16e5eeaa66e1de79ea4103af543dbc18bd8f2a3126116ef08cb5e85dd1a5d528d32216078c7e015e4d961c1168c03219fc9627c72d0465b1509763cebc38f67d7de6f06278227c11125308dfb28ae37e27641ce535cb2c56f6f1eafba3dc053a960fc294a217c2cd307476094039e7bd9b953512bc8ec4e64f71792c0fb3f0b04ba7990605199aa10ab8acd10dcfcead0a7a3261325b83b9f84d1c6a8a262b3ef822f1bb2be3e0e26b1c2bf9d8df3408930709ecf71aad43338be7dd119077663271e26cbcd16231a0ca0a2f9c4457f3a11590e561d78db1567df54815e9b3aaeb5516a904423c24256deb6746c91fc44d1c0a4c7c416b1d07d292f31178f34b9e7eab1e12af"}, + {"000000000000000000000000000000000000000000000000000000000000000f", "00a437c55f115f8de60ad25789f4eb05876819ba2403e5816da12e283bd5cb134d9d2619a67e061c45c102c92d5f0e4279752ac7935a49a6acd51ad7e9d631055a1434dfb056efe8d7e4e0cd788dca2eac1e02a1031bbac286e2fc6feaed70603640ba608825fb28c81da7a512848cb3d0c862f4c5875347f29523ba57d507f3795329030b251e02d5e519ebdf02bd049a341333a9823cc2661e193d19d6cf8071d87e890196fb7400f2dee19708553f002b52992e742f2d727ed38483039e11bb7a837c9170f1b3746ab1fee6cc68fd8fd5070b42ce0421fd555c3050bb6a592e4cbd0c486cf717dc26d83fec4045c23be7cfbfc0085f65f17c700802d1f65887592eab0185d62b7f4ad231e4139319a309e49bf0f928f6e1e28c714c6feeb366ccc27866ad08bd6355c66fcc87c344d6ce513d0ba7a5af3f22470bbc967e054f93c3d71e62cd76606dd4d7591584bb0206cdcb43cfff78e994b5b48bc1a99317d87ad5590f7778829d8af0e05c25165b70dd32ad99400e80f72f7c6f940a6395b72be1032d2c1f25ed1c9614d893365fd66fbe57ad2bd739047f87297b469f2d3660470262ce3be10c6a6da9a7b29633be985181d43dd3b722a6f6d9bc1d5f1fe9e327f37dc49b16f6221b856008a703b4f8ccc2df8bfb60dc617382f5ccf33f85a6132edcb00e5d70392d46213cd2a03f8089b7cd703e02e74fe9ca5015ca954e30e6dfc27ad613ef3e2a2e242625a6645a40f5008812665d3e5e71ffcf916f38048cb1fc0e4f24c7f6da2240d2581784cd7f4c08880740405d479d8121753e24db0e7baad9bac4b09ef0063ae567bf972aed6f52049d982df2c5bc141263251330424cf225b22d6e9f07d5ceed8b12907b56c76e093eeaebed1a94dff82d13db1ae4ebfd5d247d248016b4b719c14c400b8cd27759254efa926f519a2b300158903c16c0d87ace5c85ecc92ff0fa320734cdf555a0268c4c1c817d0ad085f90a64aa9615be9ffadf2ae51d07e84cc639d7e494111c24e4413172ae8e8171e1dddfce75ebebd10fd769f06b9f76566e3fb7c604a9495731deaf3f40e2d079d9e1597842eed1c8b13a6f05113ca16f830d4344324ef2f6c2dd0fdab7881b3196f47f0d6ba0c407f1faebddf96ad4d03a697a2fa87639b498c9694bc3d7e475f28213121e7fda4901d7451cccdc1a5d8362e2cef275e791321b0ad1ed27d1d721ab6c1345cec304977854604e0a7f7bf02f0b4702605143a96ca89d424dd2ae69665543b7f737151fe8b5d294189b6350234622a3f72b8f0bdeb86813b9b1a1ee1bc4e1e54073aead70a089e3516fc06f46da5c220d21391df4b898d1b2d10cfa4a191de52b1a0c3cfd551ff14f69cd53e62bf438f9dbe5764f2f2ddc9a20ec558b9bd1ce965e856ff85694855c9b44070a8f01b34ca7a108f861655d127aa33ef7bb8cb24e6bfcfef85c7907f32fa53b55d5e979c6201bcdb5135155e3e51f274780e5a49776e042bb10053b005b4d9d6ca6bb5d1bd5f80516805172d69f24e69ea1260f799573cae3821bae7cc6c865f91c46c8dbdd7272151e93e0030c8c09804c615ef4693cf945909859c12fa8dc4ea1b209d7f75834a3cae7d9594bc15e4d4e4e361c40641b0384fd20271798727f0e52e5bf8ff00ac50232d6956666b58f07e2d16020523daf16aa2d2d6dc1c7e95d936d9def73786251a46fb1009e90d71c766d585c13e3212c2b74bfee47ac8e952af6069566332422f89b9bdfc4d467f80fcb940a0bc39af47019b04e7c3e9e043131d7234075bbf464d5609760ab2105bc744ccc40f6824b45b7bfc826fa366a38c94b1f8b6c113892986cf2e4b897c67c52a2dbd93f05572046f7456a0dc9e2bbb986b3d74fc01dcdba989c47"}, + {"000000000000000000000000000000000000000000000000000000000000003d", "0046697102de3edbdfbcb7bac3d92cc9fc30d75db801b27d97cdc296c7f07010b21cd4a3727c57fa90d4147be341ef8dd335bd5ef436686b9e8d25e0f989591c45433154d9ee12ef9403ec5c62bf86ab29b9cf9f025b464e042428bd3a169226f5aed925e1b1ef3a7e0e766c86c5c88828636c62579f9719431566dd26a938e2460cdf28065fee86165be74769caf0fe3bd94b4ff6d3f07d5c7307350c260d4a5a8aea691e1f0de6031d898099c2a70e6b45927cb06aa4e595622cad1c27ac053414d82675ff4875dbd954428238f399b4930c00a1678b0b87dff740e30410573d34c906951e1334c462bdc057d8f51c4a2b21cadf17f6ffdad8ac6806ea8418108ac619ddbf75365ce18bb608825c4f350ee77a6a2225687b818393e428f94171fde358f2e217a535ba8c9d1ccf708bc53429569dc2986996e0d05213eefd549db4758fcc79e8087b3a86ec3a3958e30095b33bc50d3427e62b44f375c226eda19ecebd9f14f9c64e5545ae30814ee4b408b2a4cd81a3dd34740f3d81082a73c7bfbc3835b5286b64769ba6fb5af618cf99cbec5c5331349aa9a6356cc7cf15c4ff15c60ae2d6a2765e437fa0fbd467227e29152b3a296f1a221c8189b28f18bb591549e6935c6e56a8e595ca951435bc3eb9492329ccee2443e2b251f287dfb80e241ce2b590f7a956bf8117059a454ecf6d96c631c5e706d59d9df2525c0ea857668d9270252afc647940bc38925230b3d01443fe5cd684ebe478bdefca1921e10c871f2bc3267f95ce8023e9c8accc9100da6e38d6373193e9afe46d8f3cc168f4c3c9ca7b6bf3be7f740b37cb79c926308d3f6ff7c89cf03b2ad9317d98b4277a7b75a112df07596866e1e7ee93e20276d903d82bb399d01e162d4fa0504494e9e727f76ebdbbe3783d15ebe530e68ef5bc2796f6f4bc74bb481afc120d00cfeb7c940709a6fc217785cc42c3fe9f471d858c1dce0e16a392c13f1cdfc6becf39606e8de87d075909771ac61d21772f623bb1998537663ab5b65ef6452d2f35935651ad7a9e48c493f7eb2fb54ad170d07404fbbb63fc90f77d96221a4909f053efd7883f2d050692fcf4e91c4cd73786057edcf9f4c262619db8381cb70be70a07f3dc714732901cb99c58ed23959bb43ecddb2260e10e816299481540f0d9fe6b74de4156053c248396e3f1fb29ef008ae43dc50dcd6c71d07d0904af23af2bccf59073f2b911717690b332543fe4073193fabee8e99d9180f0bb61f1f89851198f6fdb53a6de801e2178618a90e6bcd7f319bdcf7b6f700e09cdbef24acb9c5ad45132c369fde1a4c0594ab58720406bd36dcaa2dd59cca51822bbf5322e6f9238930de7b5c11a89b012a2327761f74a597a7595d69e891a7d0b16e9a8395be75032a54254b87aec137a6cab01106b863930a1ddfbf940190c420da24688969287395e97d0579c3074f006555a49559d9b5d72bfe6ae1284d6e3c2924b4b698888a563cfa0ea98595afd97360a8f6101e18937e003e9c7a36f65d6c052def65e05f1e422f60f4932c73a440fbd5f55ce7b427def2f1e7425e956ee78177e6ae913407bc036f8fc9c67e6112fcff4be7b8747e0ad859be8c11939fad71c0681163e26de84550ddd5952fb13d2f80fc30fc93e0dbf0306df6a618a7f8ee862f4d8eac1aff64c1f1cdafe0df2b4155688c2ded14e035328dd0060e7bd87eb0d108372db39a407f981fc212efcdaec82c7cf1b56b3155d229be449860b7327a9b6206fc6d2e31d5e25500d315e6bc507b53aaa2ef4c76b276086e7d1db92fc6c358f645c7ef49ffed557e02879795f296ede9f5726120563ad4a6d34a1d356ac3f3cf08e79fc16612070047dace7aa3fd3bd20e71048e9d8cdfba1daf049"}, + {"000000000000000000000000000000000000000000000000000000000000002a", "007fdaed3735b74db866f0f936aeaa78f4e730076d1814817a5a4b969dd96f947a277fe80540d3bcf9723381f9b570e3350942d413d4a62c7d2985599ab3be3f100fb2a6960f4adca107ad8df5601252d994dd5904f54138ac9ef2834ffc96b21e60f2e3be40de123b334c8b52956fe923c512874394600c873a903f3e2a18b3e1dbf5cb640f41ab18cc9bfb627eb3d73830942ec27c80191eed6b27f4c6a8e1e29385f1fd97d9f6060d4327bdca27b8a08421da6775d5b98831b8f1e715d0a21e7087fd7083c7e1bf98ad3bde49e6f81ec0071442152be2e227ed7e508d4ec0ba018767716a800d882992d75191e4e83231724dfd9e597e563805a3158fb93d63d7c86d693d62f27ffdf138f639092bb8206515d1280c9d61bc4605878b47b59e0fc0da96e61897ed23914999356c5a2637bcd4757711b7fd45de4dd7cdc786b3e3c7cdacc5480d744c2aa0fe5f45ec01be7900034938948d62a24c947fba5d60b9dc55aa15ebe457d99bcc85cded031cbaf9a62ce2d2d1c495026474489e29ec376be0570497c6c2c5f80419bd8325bb61420c2ab8cda04485e0ece768d603e15aec6303e83451b8554d3b2d4d50e498342cf83ba4f1af4b1b59aa10b4258dffe6867479ede8f1cdffef95b0260f7cdac03146bc68576ee3beef6bdcf51ed8bc2aef1e775387361d0e49de19a30f36ac743dca381371a9022e119b122a32cd5eab19dba7d45387ec221f823b1bc8310f66c8a7d247e3c3c8f2ceec875c05dc11d50794963106b1bfa59c19321ed1f7838309e35e221a0fdf16610d2076316cc4a3fa115184a9f29592b8a002cd97382dc618e072373171777a788098721f0f3628c203c996cd0bee78a8250213352fee728dd6330530ad7d2eb8ab4853cd9133c4964c3a6510b28e4cc656aeab959e977f86c89bf63572d9c946716fbaac18011e87801409c4d5da6fd397e3b2a639ab90b6ac150719b96e60c395cd1bcc54492cc9b8e5900e16a0b30221e88c7cc783990402e57d05dab21da16fcda3d906f06aa33f98f9fd90f930f1c49c8b3c8ac18bebeb110668e56efbdf2ff9286346bea82318f5703e55cd27f7fb8b97513e71f83833118e59465d1312ca5fd016596d39eacfc8708d2613d98f68a04e116c1500f82fb39da8254ed32331bb489cb45e2dd2d948ff772e0184d40fceca7f8ea96b119147b7c06d87b014fb10171fa5c76d2229716af6c5a2b35d691a652f96347f02e7df99f7d5f268b9b7d44f1ec7d00d147999bbb7060e5f4169210ded0f7cf782467721d61618f79c57046b2496b0b7258dcc9d32215d5c883371559c45f96329c690e57997ffd28896cd2175f24de922f173c205921d2bed45f967779cc69d24ce4a89bc0dbbfba634f71a39c1a9cfc78e0dc84a515fe456653a7f9e380122f628a3c7a14132f1610278b4a738988b78028d0e071a121f1b29bd9edc01f97b303fbccc6d2b139d1333fc6e47dc0727b3876478737a4a45a5609a892e26e71d7ef5cdfe3083c0330682d4ed226676bfdf54052fae7c4fa33f4392f123536d2fb5fe0440b092150e9e8978f2e97563aeb80416b4dc80e18c8938c7d22186fe888c5318195ed3e238db6a462125888be5dc224fcde0fad00c7179502a6cc66977eeb19a5d918d01cd4158d2e0f9fde335d2985d9d02ed03cacd0e9f0d011db68ea3197954b211178cc7bee19648d8d89619c49be46ee7e69bb8bb697b5e7f61fa64acddeef14668861c2f975bc1b9f8965c32fcbe81e299b9b94e1bbcc3f8201a7c71ff2352f8bfb8b099f73197ada11e88cf9c3d188cd5174762c460385ff8c6eea786d537777f802ed2efe1a7f1842d1d3b62693640fb8026596eaccd09d95fb2f5a9e7c856c8c636615337c634"}, + {"0000000000000000000000000000000000000000000000000000000000000007", "0124a9483114abcb470b4644f2cf0c79d142f09e3e1c028db098d6ec64e237357ebd60856a0942daa62f3cd91fff2593e1ecfe5b3aa33bfac3975b13fb5c624fd5bc1ef29e67c5766de67bfec9ed96e1d35c52b60b7d350c26ac1e1d947f256db25b470db54fb536023ee5fa6711a71ed3ad058423c2f1f0637db17c3c1e2f94e4e1c6903a98a744593af94bdcc699761576883b1b9c196cf62827bf5c886d88de70bacca35a009e029feb8c978f97918cb1d267f52ebc952bd2d4162833638ce3f3d6b0fbb1d2e4b06b2afdea241e9c815f1837dfb801699b77fe8942ea50ef8274e2604d06662fbcf24bfd5129709df0031483fb5f412119bfef390656821d989ed737128d52bcb0cf72be7ecad52bbf06c48911f5920a1f86cd50b81971ac9c78101e93731887a562b794b7b59a84b55bfddb40e58a663063021e88dcb6789c86573b6c522801eb34c54dd5b63d6e0346a794486bb9e9a8d57adefe6ba766bf28594127386e9bd98aa0d69d710665f37078234d83c8d6da651c49331deee7d5f9ad338a1507619aeaf74c5bfca21e3ed691f972c66bc4cda5fb9ec1dc323323f1c4fd171b5e3579063df5996948b8c2758aa75f653d9ea3355b03d3b18d8360db935676ad37de3b7117be472132c86b3e949fa9798aefa78304caf386c08f7ea9d0363f0b04106adb29934ea473b5724a3543db2acca711ae95165e9cf7c74e8232e4cace2fb8bf35a8e24814c88b8ca831bea3d71394ebac3de3d643eb3cddb7165df9d0229a749f4db6c846bd44c33636b8f96e342020fbd424db48759ac6347cdbc5ec770fa53ccee0211a12c6ada9bd87543e89257760729eb5527655f123040dfc3717671de71e4261c8f2f2fb72debf8bbc25f6eb6283d1497cd1c31298576b0782ff58597025284d077d70e4cf999366b2c3e2dd56c4c3ed726469061722b9b9a38115efa5e71fb0ce736662df7cfb9512d3c5e099ad7cb978cd94a7aa3ad76d5864b0a25a27cf6bf1a7bb69c1fa32c33a2f4e51d9db00d5f2e45f5962fceaa2272739320b4394f2ae2333e3dd4a1d0ffd6cb19d5979d756ebf1d1939d4c80f8d919b85829424a929790855518122525e96f1f4580ebb7180119f39386de894be4e021e5d0577a813291cc5aec652b160f2d0ed8af4b30ce772169f35bba4fea3a8ed006ccc5306ac8139c4510674e59f0bac1eb1acfc9da27d22c4fcd20fdb741ec03262c1fd7b50e2c5e2a170a0424b8e69ee5a33458715940955a4c60fa876d140b82d19a8b0c760f6145417ade1c9966bc837a6df609b03af89a6804af498d815eb66f4e72ca0a7c34aa47b224a2a457ff430b79a62e74cc4773a40e5e4627246dd178a71ef2ed65f6861fc0c53e418af1cd928047bbed2aaadf8503fd29253a91daf3718af2df3eaa0775286d46b8db7dda05f1b602324aed65d05b573f39b45ca4457153adaa381457c42b90bed706d7cfa024fa1b7b80945305a43993aa95461c1617a439d0db38ff8e09cfda99a192e0c60e8d53eb17a130fd76370d93e946de975bd3446501dc532be416953db9c0c81deadce3981499cfc3ea5628817cb64baf07ff2f8831b81c4285cd3ca55b0873962ae6b0c951203eb5ad3eb3ef4a1a52a112dab955f68cb4abd9c71ad206f20c9882d757f09c8b8dbc9162f1a5f6b8a235d242592c740c559e1dd325248915c380ddb9b65052de1b1f0d7e3e9907a738496c48e0e968ef9aad0ff5bcdc9f36b3fc9e1319d945b0e1fa4b6554463f6c595f710a0ff791f59cd0ffbeeea1451e852978d1f83454d0d738862470a5f261e9a07d461bbd43373221f53d368f161577826a099bd981cd5867ae7dffc288307e653e437eb74c1692908caefa967236f250a7221d5cfa73"}, + {"0000000000000000000000000000000000000000000000000000000000000339", "005b0b144ecae618b78d94feb671c1cd62701926100102ce1111ee9b5f876444df913b007a4ed875cb2218516b240fb910a9e67e91cc14102011fb67d78db42183bf7fba6d15df6f75130fff65a02e940f1fa70000fc074bcf57d47f56d210233a40c7af88adff801e07df5941c24a6a6a794221a9a6acf8a8ea28bb471d0954c6ae014381f9ac162173092fccf0e074738e36420ce66bae78f17df294747424c5d2ad6fa6d6620e040c7ec25e8d0ea7c73e55264e7d80a175681182951a46c37b0f9daedcfb4e27b2fad8142e059d59d57b0ba9fc8629cb85e35cb5d4df38748f7bae0dbf4cea39e2f77507d99883c1d9942cb05418c23405f66311058c0423862ce173b23700a092d8571a8a3d15826a36a28462a329f56f600645bbb859b83971cf5e696b12ee6ee6dd6327fb49a151cdb720688da3cbb31f1b2d1c4c4db6e7ec09b132e2e43676848a08e6f812ed0332051f6e05cc651e7b73b36cf8720dd159dad37b58361bb3dc5eb0736024f6531a44627609e11af8be03ec1486694353925c608236eac9b8fa19405a01452e43175a998f478d2719758a7c507b269cc81c060e033c7fbefb8a4951303ec6d4b74bb5864a0abf5cb416e9adad5032e2c1e41a347b8dc48d335c7efb86c1095d95fb0b4de0e3aaf062fbcef3aaae316dde18ea1b2a2ab1144a13ebdb0dd1dcf10f199d4b6e9bf51f0b61d5e765f48f87e0dbe2e210335bdaacc7df52e3190d392ea208d8004dbb642a3a3e5f3d3d787d90130e094f06405afe599863c2660727cfadf80cd35751344d4d50e29c7a33717dc58a0d7bc0fedf1ffcf3b80c266591a9728105cc8ab35a14e0b2d5b184df795f62757da16a6821954c31b75534e615526f81f71d8c2876ca0fe94fa1d5479f154a78ebbdf9ecea75c8ee289837ed6f20533d78476461912a3ab71273bf93a2018f55dc7f4255edec0d4280ff6892c689f17e6f994762ba94d6dd3233b8652547ee620981a07c1bc4a70a1dabab24698ae5b53a42b991e771acc7c9a86263294c9a33e08a65251c25f6973cca1ae9ac12fa3791038c55d8544bbe7c7901f0b6c2dae02d363ab98e8b24d046fbbd1f6941676564456e65b2ea031819692204cd1eb5df28ec07508ba1cc9946d6188fa5bf49ce07d72e2d655f7845e913e1f5de78517176d0f5b96a03399230ba072d986a38d08c3977467214c3510ced176aed91c6773671e591c1886d16fea2fbd5d9464b1de3ee1db813a6276a5543a1b7e702c8fc37af44f124f02fefe0d3b879d156f619c0cfdcda5014ffeed00626247be75b2743947d72af8951d82a746a1c5ec320b6db327508dde108bc3346fa4e4cf3030affb0e72d2b157b660e26dabec9fa968a6b3703a3765f4446314835c0e56caa81805d63ff0e66439572d8ac9b0402c6cc06891862333fccb03ac263eb0a50b595dc692e858274d3e722bfc2fc441077e1566f0f99be988f081fd95dcdc83ca29581d46d56cdce06273358b56515c071d68848f511c0f3c21fecdc543f71c17c5829094d53f884a6596d9b2da2c1e367f3aedaa3dc6e080b1800f1b1d7ce6f5c2552476dc7157dfb849995b00d5f7c2ee003d76f3ec8a53cc4f79765a58fce1aa736da67f9936542e571d03669da6893660a6adb24f20b6ec35fc6eea42b9242c5191140a9be8a561fa71221d2dacab2737c2baede34867233ccb17697983c9c100772333487993d620a92d28b5a12a92f897e611321a6f1a6a75f59f36da725d8dd5e17cabc9b59ddde0cafe79e04e7fb6da0675252e6c687452e0e3c738e326606cba192c5615194c42526acf0a5e575b95da919030697070b1679f61b2257ef7fa2b71d051e91892fc0dfd181341597c553c46449ca7c032f80bc1169"}, }; +/* TODO: Regenerate miner tests after launch // NOTE: These tests rely on CreateNewBlock doing its own self-validation! BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) { - // #1398 START - // Current test data expects to receive a reward script for the address - // 2N2e2FRfP9D1dRN1oRWkH7pbFM69eGNAuQ4 even though the test is run on mainnet - // and not testnet, and there are many founders reward addresses not just one. - // When test data is re-generated, we will no longer need to do this. - Params(CBaseChainParams::MAIN).fMinerTestModeForFoundersRewardScript = true; - // #1398 END - CScript scriptPubKey = CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG; CBlockTemplate *pblocktemplate; CMutableTransaction tx,tx2; @@ -181,7 +175,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) pblock->nNonce = uint256S(blockinfo[i].nonce_hex); pblock->nSolution = ParseHex(blockinfo[i].solution_hex); -/* +*//* { arith_uint256 try_nonce(0); unsigned int n = Params().EquihashN(); @@ -209,19 +203,37 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) pblock->nNonce.begin(), pblock->nNonce.size()); - // (x_1, x_2, ...) = A(I, V, n, k) + // Create solver and initialize it. + equi eq(1); + eq.setstate(&curr_state); + + // Intialization done, start algo driver. + eq.digit0(0); + eq.xfull = eq.bfull = eq.hfull = 0; + eq.showbsizes(0); + for (u32 r = 1; r < WK; r++) { + (r&1) ? eq.digitodd(r, 0) : eq.digiteven(r, 0); + eq.xfull = eq.bfull = eq.hfull = 0; + eq.showbsizes(r); + } + eq.digitK(0); + + // Convert solution indices to byte array (decompress) and pass it to validBlock method. std::set> solns; - std::function)> validBlock = - [&solns](std::vector soln) { - solns.insert(soln); - return false; - }; - EhOptimisedSolveUncancellable(n, k, curr_state, validBlock); + for (size_t s = 0; s < eq.nsols; s++) { + LogPrint("pow", "Checking solution %d\n", s+1); + std::vector index_vector(PROOFSIZE); + for (size_t i = 0; i < PROOFSIZE; i++) { + index_vector[i] = eq.sols[s][i]; + } + std::vector sol_char = GetMinimalFromIndices(index_vector, DIGITBITS); + solns.insert(sol_char); + } bool ret; for (auto soln : solns) { EhIsValidSolution(n, k, curr_state, soln, ret); - assert(ret); + if (!ret) continue; pblock->nSolution = soln; CValidationState state; @@ -242,7 +254,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) std::cout << "\"}," << std::endl; } -*/ +*//* CValidationState state; BOOST_CHECK(ProcessNewBlock(state, NULL, pblock, true, NULL)); @@ -431,5 +443,6 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) fCheckpointsEnabled = true; fCoinbaseEnforcedProtectionEnabled = true; } +*/ BOOST_AUTO_TEST_SUITE_END() diff --git a/src/test/pow_tests.cpp b/src/test/pow_tests.cpp index d8fc45ec0..46abcb431 100644 --- a/src/test/pow_tests.cpp +++ b/src/test/pow_tests.cpp @@ -39,7 +39,7 @@ BOOST_AUTO_TEST_CASE(get_next_work_pow_limit) // TODO change once the harder genesis block is generated bnAvg.SetCompact(KOMODO_MINDIFF_NBITS); BOOST_CHECK_EQUAL(KOMODO_MINDIFF_NBITS, - CalculateNextWorkRequired(bnAvg, nThisTime, nLastRetargetTime, params)); + CalculateNextWorkRequired(bnAvg, nThisTime, nLastRetargetTime, params)); } /* Test the constraint on the lower bound for actual time taken */ diff --git a/src/test/rpc_wallet_tests.cpp b/src/test/rpc_wallet_tests.cpp index 68883f2f8..2f674df0f 100644 --- a/src/test/rpc_wallet_tests.cpp +++ b/src/test/rpc_wallet_tests.cpp @@ -1090,6 +1090,9 @@ BOOST_AUTO_TEST_CASE(rpc_wallet_encrypted_wallet_zkeys) Array arr = retValue.get_array(); BOOST_CHECK(arr.size() == n); + // Verify that the wallet encryption RPC is disabled + BOOST_CHECK_THROW(CallRPC("encryptwallet passphrase"), runtime_error); + // Encrypt the wallet (we can't call RPC encryptwallet as that shuts down node) SecureString strWalletPass; strWalletPass.reserve(100); diff --git a/src/test/script_tests.cpp b/src/test/script_tests.cpp index c0614cca4..cb028dfbb 100644 --- a/src/test/script_tests.cpp +++ b/src/test/script_tests.cpp @@ -16,7 +16,7 @@ #include "test/test_bitcoin.h" #if defined(HAVE_CONSENSUS_LIB) -#include "script/bitcoinconsensus.h" +#include "script/zcashconsensus.h" #endif #include @@ -99,7 +99,7 @@ void DoTest(const CScript& scriptPubKey, const CScript& scriptSig, int flags, bo #if defined(HAVE_CONSENSUS_LIB) CDataStream stream(SER_NETWORK, PROTOCOL_VERSION); stream << tx2; - BOOST_CHECK_MESSAGE(bitcoinconsensus_verify_script(begin_ptr(scriptPubKey), scriptPubKey.size(), (const unsigned char*)&stream[0], stream.size(), 0, flags, NULL) == expect,message); + BOOST_CHECK_MESSAGE(zcashconsensus_verify_script(begin_ptr(scriptPubKey), scriptPubKey.size(), (const unsigned char*)&stream[0], stream.size(), 0, flags, NULL) == expect,message); #endif } diff --git a/src/test/sighash_tests.cpp b/src/test/sighash_tests.cpp index 164bba576..c825a8bad 100644 --- a/src/test/sighash_tests.cpp +++ b/src/test/sighash_tests.cpp @@ -237,8 +237,14 @@ BOOST_AUTO_TEST_CASE(sighash_from_data) stream >> tx; CValidationState state; - BOOST_CHECK_MESSAGE(CheckTransactionWithoutProofVerification(tx, state), strTest); - BOOST_CHECK(state.IsValid()); + if (tx.nVersion < MIN_TX_VERSION) { + // Transaction must be invalid + BOOST_CHECK_MESSAGE(!CheckTransactionWithoutProofVerification(tx, state), strTest); + BOOST_CHECK(!state.IsValid()); + } else { + BOOST_CHECK_MESSAGE(CheckTransactionWithoutProofVerification(tx, state), strTest); + BOOST_CHECK(state.IsValid()); + } std::vector raw = ParseHex(raw_script); scriptCode.insert(scriptCode.end(), raw.begin(), raw.end()); diff --git a/src/test/transaction_tests.cpp b/src/test/transaction_tests.cpp index 55e7983e5..54fc6fa1e 100644 --- a/src/test/transaction_tests.cpp +++ b/src/test/transaction_tests.cpp @@ -367,8 +367,6 @@ BOOST_AUTO_TEST_CASE(test_basic_joinsplit_verification) test.anchor = GetRandHash(); BOOST_CHECK(!test.Verify(*p, pubKeyHash)); } - - delete p; } BOOST_AUTO_TEST_CASE(test_simple_joinsplit_invalidity) @@ -592,4 +590,55 @@ BOOST_AUTO_TEST_CASE(test_IsStandard) BOOST_CHECK(!IsStandardTx(t, reason)); } +BOOST_AUTO_TEST_CASE(test_IsStandardV2) +{ + LOCK(cs_main); + CBasicKeyStore keystore; + CCoinsView coinsDummy; + CCoinsViewCache coins(&coinsDummy); + std::vector dummyTransactions = SetupDummyInputs(keystore, coins); + + CMutableTransaction t; + t.vin.resize(1); + t.vin[0].prevout.hash = dummyTransactions[0].GetHash(); + t.vin[0].prevout.n = 1; + t.vin[0].scriptSig << std::vector(65, 0); + t.vout.resize(1); + t.vout[0].nValue = 90*CENT; + CKey key; + key.MakeNewKey(true); + t.vout[0].scriptPubKey = GetScriptForDestination(key.GetPubKey().GetID()); + + string reason; + // A v2 transaction with no JoinSplits is still standard. + t.nVersion = 2; + BOOST_CHECK(IsStandardTx(t, reason)); + + // ... and with one JoinSplit. + t.vjoinsplit.push_back(JSDescription()); + BOOST_CHECK(IsStandardTx(t, reason)); + + // ... and when that JoinSplit takes from a transparent input. + JSDescription *jsdesc = &t.vjoinsplit[0]; + jsdesc->vpub_old = 10*CENT; + t.vout[0].nValue -= 10*CENT; + BOOST_CHECK(IsStandardTx(t, reason)); + + // A v2 transaction with JoinSplits but no transparent inputs is standard. + jsdesc->vpub_old = 0; + jsdesc->vpub_new = 100*CENT; + t.vout[0].nValue = 90*CENT; + t.vin.resize(0); + BOOST_CHECK(IsStandardTx(t, reason)); + + // v2 transactions can still be non-standard for the same reasons as v1. + t.vout[0].nValue = 501; // dust + BOOST_CHECK(!IsStandardTx(t, reason)); + + // v3 is not standard. + t.nVersion = 3; + t.vout[0].nValue = 90*CENT; + BOOST_CHECK(!IsStandardTx(t, reason)); +} + BOOST_AUTO_TEST_SUITE_END() diff --git a/src/tinyformat.h b/src/tinyformat.h index 7d3de1de2..a259077f1 100644 --- a/src/tinyformat.h +++ b/src/tinyformat.h @@ -67,7 +67,9 @@ // weekday, month, day, hour, min); // std::cout << date; // -// These are the three primary interface functions. +// These are the three primary interface functions. There is also a +// convenience function printfln() which appends a newline to the usual result +// of printf() for super simple logging. // // // User defined format functions @@ -86,6 +88,18 @@ // defined function bodies, use the macro TINYFORMAT_FOREACH_ARGNUM. For an // example, see the implementation of printf() at the end of the source file. // +// Sometimes it's useful to be able to pass a list of format arguments through +// to a non-template function. The FormatList class is provided as a way to do +// this by storing the argument list in a type-opaque way. Continuing the +// example from above, we construct a FormatList using makeFormatList(): +// +// FormatListRef formatList = tfm::makeFormatList(weekday, month, day, hour, min); +// +// The format list can now be passed into any non-template function and used +// via a call to the vformat() function: +// +// tfm::vformat(std::cout, "%s, %s %d, %.2d:%.2d\n", formatList); +// // // Additional API information // -------------------------- @@ -118,6 +132,7 @@ namespace tfm = tinyformat; //------------------------------------------------------------------------------ // Implementation details. +#include #include #include #include @@ -133,20 +148,20 @@ namespace tfm = tinyformat; # endif #endif -#ifdef __GNUC__ -# define TINYFORMAT_NOINLINE __attribute__((noinline)) -#elif defined(_MSC_VER) -# define TINYFORMAT_NOINLINE __declspec(noinline) -#else -# define TINYFORMAT_NOINLINE -#endif - #if defined(__GLIBCXX__) && __GLIBCXX__ < 20080201 // std::showpos is broken on old libstdc++ as provided with OSX. See // http://gcc.gnu.org/ml/libstdc++/2007-11/msg00075.html # define TINYFORMAT_OLD_LIBSTDCPLUSPLUS_WORKAROUND #endif +#ifdef __APPLE__ +// Workaround OSX linker warning: xcode uses different default symbol +// visibilities for static libs vs executables (see issue #25) +# define TINYFORMAT_HIDDEN __attribute__((visibility("hidden"))) +#else +# define TINYFORMAT_HIDDEN +#endif + namespace tinyformat { //------------------------------------------------------------------------------ @@ -247,6 +262,29 @@ struct convertToInt static int invoke(const T& value) { return static_cast(value); } }; +// Format at most ntrunc characters to the given stream. +template +inline void formatTruncated(std::ostream& out, const T& value, int ntrunc) +{ + std::ostringstream tmp; + tmp << value; + std::string result = tmp.str(); + out.write(result.c_str(), (std::min)(ntrunc, static_cast(result.size()))); +} +#define TINYFORMAT_DEFINE_FORMAT_TRUNCATED_CSTR(type) \ +inline void formatTruncated(std::ostream& out, type* value, int ntrunc) \ +{ \ + std::streamsize len = 0; \ + while(len < ntrunc && value[len] != 0) \ + ++len; \ + out.write(value, len); \ +} +// Overload for const char* and char*. Could overload for signed & unsigned +// char too, but these are technically unneeded for printf compatibility. +TINYFORMAT_DEFINE_FORMAT_TRUNCATED_CSTR(const char) +TINYFORMAT_DEFINE_FORMAT_TRUNCATED_CSTR(char) +#undef TINYFORMAT_DEFINE_FORMAT_TRUNCATED_CSTR + } // namespace detail @@ -255,18 +293,20 @@ struct convertToInt // desired. -// Format a value into a stream. Called from format() for all types by default. -// -// Users may override this for their own types. When this function is called, -// the stream flags will have been modified according to the format string. -// The format specification is provided in the range [fmtBegin, fmtEnd). -// -// By default, formatValue() uses the usual stream insertion operator -// operator<< to format the type T, with special cases for the %c and %p -// conversions. +/// Format a value into a stream, delegating to operator<< by default. +/// +/// Users may override this for their own types. When this function is called, +/// the stream flags will have been modified according to the format string. +/// The format specification is provided in the range [fmtBegin, fmtEnd). For +/// truncating conversions, ntrunc is set to the desired maximum number of +/// characters, for example "%.7s" calls formatValue with ntrunc = 7. +/// +/// By default, formatValue() uses the usual stream insertion operator +/// operator<< to format the type T, with special cases for the %c and %p +/// conversions. template inline void formatValue(std::ostream& out, const char* /*fmtBegin*/, - const char* fmtEnd, const T& value) + const char* fmtEnd, int ntrunc, const T& value) { #ifndef TINYFORMAT_ALLOW_WCHAR_STRINGS // Since we don't support printing of wchar_t using "%ls", make it fail at @@ -288,6 +328,12 @@ inline void formatValue(std::ostream& out, const char* /*fmtBegin*/, #ifdef TINYFORMAT_OLD_LIBSTDCPLUSPLUS_WORKAROUND else if(detail::formatZeroIntegerWorkaround::invoke(out, value)) /**/; #endif + else if(ntrunc >= 0) + { + // Take care not to overread C strings in truncating conversions like + // "%.4s" where at most 4 characters may be read. + detail::formatTruncated(out, value, ntrunc); + } else out << value; } @@ -296,7 +342,7 @@ inline void formatValue(std::ostream& out, const char* /*fmtBegin*/, // Overloaded version for char types to support printing as an integer #define TINYFORMAT_DEFINE_FORMATVALUE_CHAR(charType) \ inline void formatValue(std::ostream& out, const char* /*fmtBegin*/, \ - const char* fmtEnd, charType value) \ + const char* fmtEnd, int /**/, charType value) \ { \ switch(*(fmtEnd-1)) \ { \ @@ -435,225 +481,98 @@ cog.outl('#define TINYFORMAT_FOREACH_ARGNUM(m) \\\n ' + namespace detail { -// Class holding current position in format string and an output stream into -// which arguments are formatted. -class FormatIterator +// Type-opaque holder for an argument to format(), with associated actions on +// the type held as explicit function pointers. This allows FormatArg's for +// each argument to be allocated as a homogenous array inside FormatList +// whereas a naive implementation based on inheritance does not. +class FormatArg { public: - // Flags for features not representable with standard stream state - enum ExtraFormatFlags - { - Flag_None = 0, - Flag_TruncateToPrecision = 1<<0, // truncate length to stream precision() - Flag_SpacePadPositive = 1<<1, // pad positive values with spaces - Flag_VariableWidth = 1<<2, // variable field width in arg list - Flag_VariablePrecision = 1<<3 // variable field precision in arg list - }; + FormatArg() {} - // out is the output stream, fmt is the full format string - FormatIterator(std::ostream& out, const char* fmt) - : m_out(out), - m_fmt(fmt), - m_extraFlags(Flag_None), - m_wantWidth(false), - m_wantPrecision(false), - m_variableWidth(0), - m_variablePrecision(0), - m_origWidth(out.width()), - m_origPrecision(out.precision()), - m_origFlags(out.flags()), - m_origFill(out.fill()) + template + FormatArg(const T& value) + : m_value(static_cast(&value)), + m_formatImpl(&formatImpl), + m_toIntImpl(&toIntImpl) { } - // Print remaining part of format string. - void finish() + void format(std::ostream& out, const char* fmtBegin, + const char* fmtEnd, int ntrunc) const { +/*<<<<<<< HEAD // It would be nice if we could do this from the destructor, but we // can't if TINYFORMAT_ERROR is used to throw an exception! m_fmt = printFormatStringLiteral(m_out, m_fmt); if(*m_fmt != '\0') TINYFORMAT_ERROR("tinyformat: Too many conversion specifiers in format string"); +=======*/ + m_formatImpl(out, fmtBegin, fmtEnd, ntrunc, m_value); } - ~FormatIterator() + int toInt() const { - // Restore stream state - m_out.width(m_origWidth); - m_out.precision(m_origPrecision); - m_out.flags(m_origFlags); - m_out.fill(m_origFill); + return m_toIntImpl(m_value); } - template - void accept(const T& value); - private: - // Parse and return an integer from the string c, as atoi() - // On return, c is set to one past the end of the integer. - static int parseIntAndAdvance(const char*& c) - { - int i = 0; - for(;*c >= '0' && *c <= '9'; ++c) - i = 10*i + (*c - '0'); - return i; - } - - // Format at most truncLen characters of a C string to the given - // stream. Return true if formatting proceeded (generic version always - // returns false) template - static bool formatCStringTruncate(std::ostream& /*out*/, const T& /*value*/, - std::streamsize /*truncLen*/) + TINYFORMAT_HIDDEN static void formatImpl(std::ostream& out, const char* fmtBegin, + const char* fmtEnd, int ntrunc, const void* value) { - return false; + formatValue(out, fmtBegin, fmtEnd, ntrunc, *static_cast(value)); } -# define TINYFORMAT_DEFINE_FORMAT_C_STRING_TRUNCATE(type) \ - static bool formatCStringTruncate(std::ostream& out, type* value, \ - std::streamsize truncLen) \ - { \ - std::streamsize len = 0; \ - while(len < truncLen && value[len] != 0) \ - ++len; \ - out.write(value, len); \ - return true; \ - } - // Overload for const char* and char*. Could overload for signed & - // unsigned char too, but these are technically unneeded for printf - // compatibility. - TINYFORMAT_DEFINE_FORMAT_C_STRING_TRUNCATE(const char) - TINYFORMAT_DEFINE_FORMAT_C_STRING_TRUNCATE(char) -# undef TINYFORMAT_DEFINE_FORMAT_C_STRING_TRUNCATE - // Print literal part of format string and return next format spec - // position. - // - // Skips over any occurrences of '%%', printing a literal '%' to the - // output. The position of the first % character of the next - // nontrivial format spec is returned, or the end of string. - static const char* printFormatStringLiteral(std::ostream& out, - const char* fmt) + template + TINYFORMAT_HIDDEN static int toIntImpl(const void* value) { - const char* c = fmt; - for(; true; ++c) - { - switch(*c) - { - case '\0': - out.write(fmt, static_cast(c - fmt)); - return c; - case '%': - out.write(fmt, static_cast(c - fmt)); - if(*(c+1) != '%') - return c; - // for "%%", tack trailing % onto next literal section. - fmt = ++c; - break; - } - } + return convertToInt::invoke(*static_cast(value)); } - static const char* streamStateFromFormat(std::ostream& out, - unsigned int& extraFlags, - const char* fmtStart, - int variableWidth, - int variablePrecision); - - // Private copy & assign: Kill gcc warnings with -Weffc++ - FormatIterator(const FormatIterator&); - FormatIterator& operator=(const FormatIterator&); - - // Stream, current format string & state - std::ostream& m_out; - const char* m_fmt; - unsigned int m_extraFlags; - // State machine info for handling of variable width & precision - bool m_wantWidth; - bool m_wantPrecision; - int m_variableWidth; - int m_variablePrecision; - // Saved stream state - std::streamsize m_origWidth; - std::streamsize m_origPrecision; - std::ios::fmtflags m_origFlags; - char m_origFill; + const void* m_value; + void (*m_formatImpl)(std::ostream& out, const char* fmtBegin, + const char* fmtEnd, int ntrunc, const void* value); + int (*m_toIntImpl)(const void* value); }; -// Accept a value for formatting into the internal stream. -template -TINYFORMAT_NOINLINE // < greatly reduces bloat in optimized builds -void FormatIterator::accept(const T& value) +// Parse and return an integer from the string c, as atoi() +// On return, c is set to one past the end of the integer. +inline int parseIntAndAdvance(const char*& c) { - // Parse the format string - const char* fmtEnd = 0; - if(m_extraFlags == Flag_None && !m_wantWidth && !m_wantPrecision) - { - m_fmt = printFormatStringLiteral(m_out, m_fmt); - fmtEnd = streamStateFromFormat(m_out, m_extraFlags, m_fmt, 0, 0); - m_wantWidth = (m_extraFlags & Flag_VariableWidth) != 0; - m_wantPrecision = (m_extraFlags & Flag_VariablePrecision) != 0; - } - // Consume value as variable width and precision specifier if necessary - if(m_extraFlags & (Flag_VariableWidth | Flag_VariablePrecision)) - { - if(m_wantWidth || m_wantPrecision) - { - int v = convertToInt::invoke(value); - if(m_wantWidth) - { - m_variableWidth = v; - m_wantWidth = false; - } - else if(m_wantPrecision) - { - m_variablePrecision = v; - m_wantPrecision = false; - } - return; - } - // If we get here, we've set both the variable precision and width as - // required and we need to rerun the stream state setup to insert these. - fmtEnd = streamStateFromFormat(m_out, m_extraFlags, m_fmt, - m_variableWidth, m_variablePrecision); - } + int i = 0; + for(;*c >= '0' && *c <= '9'; ++c) + i = 10*i + (*c - '0'); + return i; +} - // Format the value into the stream. - if(!(m_extraFlags & (Flag_SpacePadPositive | Flag_TruncateToPrecision))) - formatValue(m_out, m_fmt, fmtEnd, value); - else +// Print literal part of format string and return next format spec +// position. +// +// Skips over any occurrences of '%%', printing a literal '%' to the +// output. The position of the first % character of the next +// nontrivial format spec is returned, or the end of string. +inline const char* printFormatStringLiteral(std::ostream& out, const char* fmt) +{ + const char* c = fmt; + for(;; ++c) { - // The following are special cases where there's no direct - // correspondence between stream formatting and the printf() behaviour. - // Instead, we simulate the behaviour crudely by formatting into a - // temporary string stream and munging the resulting string. - std::ostringstream tmpStream; - tmpStream.copyfmt(m_out); - if(m_extraFlags & Flag_SpacePadPositive) - tmpStream.setf(std::ios::showpos); - // formatCStringTruncate is required for truncating conversions like - // "%.4s" where at most 4 characters of the c-string should be read. - // If we didn't include this special case, we might read off the end. - if(!( (m_extraFlags & Flag_TruncateToPrecision) && - formatCStringTruncate(tmpStream, value, m_out.precision()) )) + switch(*c) { - // Not a truncated c-string; just format normally. - formatValue(tmpStream, m_fmt, fmtEnd, value); + case '\0': + out.write(fmt, c - fmt); + return c; + case '%': + out.write(fmt, c - fmt); + if(*(c+1) != '%') + return c; + // for "%%", tack trailing % onto next literal section. + fmt = ++c; + break; + default: + break; } - std::string result = tmpStream.str(); // allocates... yuck. - if(m_extraFlags & Flag_SpacePadPositive) - { - for(size_t i = 0, iend = result.size(); i < iend; ++i) - if(result[i] == '+') - result[i] = ' '; - } - if((m_extraFlags & Flag_TruncateToPrecision) && - (int)result.size() > (int)m_out.precision()) - m_out.write(result.c_str(), m_out.precision()); - else - m_out << result; } - m_extraFlags = Flag_None; - m_fmt = fmtEnd; } @@ -663,13 +582,14 @@ void FormatIterator::accept(const T& value) // with the form "%[flags][width][.precision][length]type". // // Formatting options which can't be natively represented using the ostream -// state are returned in the extraFlags parameter which is a bitwise -// combination of values from the ExtraFormatFlags enum. -inline const char* FormatIterator::streamStateFromFormat(std::ostream& out, - unsigned int& extraFlags, - const char* fmtStart, - int variableWidth, - int variablePrecision) +// state are returned in spacePadPositive (for space padded positive numbers) +// and ntrunc (for truncating conversions). argIndex is incremented if +// necessary to pull out variable width and precision . The function returns a +// pointer to the character after the end of the current format spec. +inline const char* streamStateFromFormat(std::ostream& out, bool& spacePadPositive, + int& ntrunc, const char* fmtStart, + const detail::FormatArg* formatters, + int& argIndex, int numFormatters) { if(*fmtStart != '%') { @@ -684,9 +604,9 @@ inline const char* FormatIterator::streamStateFromFormat(std::ostream& out, out.unsetf(std::ios::adjustfield | std::ios::basefield | std::ios::floatfield | std::ios::showbase | std::ios::boolalpha | std::ios::showpoint | std::ios::showpos | std::ios::uppercase); - extraFlags = Flag_None; bool precisionSet = false; bool widthSet = false; + int widthExtra = 0; const char* c = fmtStart + 1; // 1) Parse flags for(;; ++c) @@ -713,12 +633,15 @@ inline const char* FormatIterator::streamStateFromFormat(std::ostream& out, case ' ': // overridden by show positive sign, '+' flag. if(!(out.flags() & std::ios::showpos)) - extraFlags |= Flag_SpacePadPositive; + spacePadPositive = true; continue; case '+': out.setf(std::ios::showpos); - extraFlags &= ~Flag_SpacePadPositive; + spacePadPositive = false; + widthExtra = 1; continue; + default: + break; } break; } @@ -731,15 +654,19 @@ inline const char* FormatIterator::streamStateFromFormat(std::ostream& out, if(*c == '*') { widthSet = true; - if(variableWidth < 0) + int width = 0; + if(argIndex < numFormatters) + width = formatters[argIndex++].toInt(); + else + TINYFORMAT_ERROR("tinyformat: Not enough arguments to read variable width"); + if(width < 0) { // negative widths correspond to '-' flag set out.fill(' '); out.setf(std::ios::left, std::ios::adjustfield); - variableWidth = -variableWidth; + width = -width; } - out.width(variableWidth); - extraFlags |= Flag_VariableWidth; + out.width(width); ++c; } // 3) Parse precision @@ -750,8 +677,10 @@ inline const char* FormatIterator::streamStateFromFormat(std::ostream& out, if(*c == '*') { ++c; - extraFlags |= Flag_VariablePrecision; - precision = variablePrecision; + if(argIndex < numFormatters) + precision = formatters[argIndex++].toInt(); + else + TINYFORMAT_ERROR("tinyformat: Not enough arguments to read variable precision"); } else { @@ -814,7 +743,7 @@ inline const char* FormatIterator::streamStateFromFormat(std::ostream& out, break; case 's': if(precisionSet) - extraFlags |= Flag_TruncateToPrecision; + ntrunc = static_cast(out.precision()); // Make %s print booleans as "true" and "false" out.setf(std::ios::boolalpha); break; @@ -826,6 +755,8 @@ inline const char* FormatIterator::streamStateFromFormat(std::ostream& out, TINYFORMAT_ERROR("tinyformat: Conversion spec incorrectly " "terminated by end of string"); return c; + default: + break; } if(intConversion && precisionSet && !widthSet) { @@ -833,7 +764,7 @@ inline const char* FormatIterator::streamStateFromFormat(std::ostream& out, // padded with zeros on the left). This isn't really supported by the // iostreams, but we can approximately simulate it with the width if // the width isn't otherwise used. - out.width(out.precision()); + out.width(out.precision() + widthExtra); out.setf(std::ios::internal, std::ios::adjustfield); out.fill('0'); } @@ -841,170 +772,282 @@ inline const char* FormatIterator::streamStateFromFormat(std::ostream& out, } - //------------------------------------------------------------------------------ -// Private format function on top of which the public interface is implemented. -// We enforce a mimimum of one value to be formatted to prevent bugs looking like -// -// const char* myStr = "100% broken"; -// printf(myStr); // Parses % as a format specifier +inline void formatImpl(std::ostream& out, const char* fmt, + const detail::FormatArg* formatters, + int numFormatters) +{ + // Saved stream state + std::streamsize origWidth = out.width(); + std::streamsize origPrecision = out.precision(); + std::ios::fmtflags origFlags = out.flags(); + char origFill = out.fill(); + + for (int argIndex = 0; argIndex < numFormatters; ++argIndex) + { + // Parse the format string + fmt = printFormatStringLiteral(out, fmt); + bool spacePadPositive = false; + int ntrunc = -1; + const char* fmtEnd = streamStateFromFormat(out, spacePadPositive, ntrunc, fmt, + formatters, argIndex, numFormatters); + if (argIndex >= numFormatters) + { + // Check args remain after reading any variable width/precision + TINYFORMAT_ERROR("tinyformat: Not enough format arguments"); + return; + } + const FormatArg& arg = formatters[argIndex]; + // Format the arg into the stream. + if(!spacePadPositive) + arg.format(out, fmt, fmtEnd, ntrunc); + else + { + // The following is a special case with no direct correspondence + // between stream formatting and the printf() behaviour. Simulate + // it crudely by formatting into a temporary string stream and + // munging the resulting string. + std::ostringstream tmpStream; + tmpStream.copyfmt(out); + tmpStream.setf(std::ios::showpos); + arg.format(tmpStream, fmt, fmtEnd, ntrunc); + std::string result = tmpStream.str(); // allocates... yuck. + for(size_t i = 0, iend = result.size(); i < iend; ++i) + if(result[i] == '+') result[i] = ' '; + out << result; + } + fmt = fmtEnd; + } + + // Print remaining part of format string. + fmt = printFormatStringLiteral(out, fmt); + if(*fmt != '\0') + TINYFORMAT_ERROR("tinyformat: Too many conversion specifiers in format string"); + + // Restore stream state + out.width(origWidth); + out.precision(origPrecision); + out.flags(origFlags); + out.fill(origFill); +} + +} // namespace detail + + +/// List of template arguments format(), held in a type-opaque way. +/// +/// A const reference to FormatList (typedef'd as FormatListRef) may be +/// conveniently used to pass arguments to non-template functions: All type +/// information has been stripped from the arguments, leaving just enough of a +/// common interface to perform formatting as required. +class FormatList +{ + public: + FormatList(detail::FormatArg* formatters, int N) + : m_formatters(formatters), m_N(N) { } + + friend void vformat(std::ostream& out, const char* fmt, + const FormatList& list); + + private: + const detail::FormatArg* m_formatters; + int m_N; +}; + +/// Reference to type-opaque format list for passing to vformat() +typedef const FormatList& FormatListRef; + + +namespace detail { + +// Format list subclass with fixed storage to avoid dynamic allocation +template +class FormatListN : public FormatList +{ + public: #ifdef TINYFORMAT_USE_VARIADIC_TEMPLATES + template + FormatListN(const Args&... args) + : FormatList(&m_formatterStore[0], N), + m_formatterStore { FormatArg(args)... } + { static_assert(sizeof...(args) == N, "Number of args must be N"); } +#else // C++98 version + void init(int) {} +# define TINYFORMAT_MAKE_FORMATLIST_CONSTRUCTOR(n) \ + \ + template \ + FormatListN(TINYFORMAT_VARARGS(n)) \ + : FormatList(&m_formatterStore[0], n) \ + { assert(n == N); init(0, TINYFORMAT_PASSARGS(n)); } \ + \ + template \ + void init(int i, TINYFORMAT_VARARGS(n)) \ + { \ + m_formatterStore[i] = FormatArg(v1); \ + init(i+1 TINYFORMAT_PASSARGS_TAIL(n)); \ + } -template -void format(FormatIterator& fmtIter, const T1& value1) + TINYFORMAT_FOREACH_ARGNUM(TINYFORMAT_MAKE_FORMATLIST_CONSTRUCTOR) +# undef TINYFORMAT_MAKE_FORMATLIST_CONSTRUCTOR +#endif + + private: + FormatArg m_formatterStore[N]; +}; + +// Special 0-arg version - MSVC says zero-sized C array in struct is nonstandard +template<> class FormatListN<0> : public FormatList { - fmtIter.accept(value1); - fmtIter.finish(); -} - -// General version for C++11 -template -void format(FormatIterator& fmtIter, const T1& value1, const Args&... args) -{ - fmtIter.accept(value1); - format(fmtIter, args...); -} - -#else - -inline void format(FormatIterator& fmtIter) -{ - fmtIter.finish(); -} - -// General version for C++98 -#define TINYFORMAT_MAKE_FORMAT_DETAIL(n) \ -template \ -void format(detail::FormatIterator& fmtIter, TINYFORMAT_VARARGS(n)) \ -{ \ - fmtIter.accept(v1); \ - format(fmtIter TINYFORMAT_PASSARGS_TAIL(n)); \ -} - -TINYFORMAT_FOREACH_ARGNUM(TINYFORMAT_MAKE_FORMAT_DETAIL) -#undef TINYFORMAT_MAKE_FORMAT_DETAIL - -#endif // End C++98 variadic template emulation for format() + public: FormatListN() : FormatList(0, 0) {} +}; } // namespace detail //------------------------------------------------------------------------------ -// Implement all the main interface functions here in terms of detail::format() +// Primary API functions #ifdef TINYFORMAT_USE_VARIADIC_TEMPLATES -// C++11 - the simple case -template -void format(std::ostream& out, const char* fmt, const T1& v1, const Args&... args) +/// Make type-agnostic format list from list of template arguments. +/// +/// The exact return type of this function is an implementation detail and +/// shouldn't be relied upon. Instead it should be stored as a FormatListRef: +/// +/// FormatListRef formatList = makeFormatList( /*...*/ ); +template +detail::FormatListN makeFormatList(const Args&... args) { - detail::FormatIterator fmtIter(out, fmt); - format(fmtIter, v1, args...); + return detail::FormatListN(args...); } -template -std::string format(const char* fmt, const T1& v1, const Args&... args) +#else // C++98 version + +inline detail::FormatListN<0> makeFormatList() +{ + return detail::FormatListN<0>(); +} +#define TINYFORMAT_MAKE_MAKEFORMATLIST(n) \ +template \ +detail::FormatListN makeFormatList(TINYFORMAT_VARARGS(n)) \ +{ \ + return detail::FormatListN(TINYFORMAT_PASSARGS(n)); \ +} +TINYFORMAT_FOREACH_ARGNUM(TINYFORMAT_MAKE_MAKEFORMATLIST) +#undef TINYFORMAT_MAKE_MAKEFORMATLIST + +#endif + +/// Format list of arguments to the stream according to the given format string. +/// +/// The name vformat() is chosen for the semantic similarity to vprintf(): the +/// list of format arguments is held in a single function argument. +inline void vformat(std::ostream& out, const char* fmt, FormatListRef list) +{ + detail::formatImpl(out, fmt, list.m_formatters, list.m_N); +} + + +#ifdef TINYFORMAT_USE_VARIADIC_TEMPLATES + +/// Format list of arguments to the stream according to given format string. +template +void format(std::ostream& out, const char* fmt, const Args&... args) +{ + vformat(out, fmt, makeFormatList(args...)); +} + +/// Format list of arguments according to the given format string and return +/// the result as a string. +template +std::string format(const char* fmt, const Args&... args) { std::ostringstream oss; - format(oss, fmt, v1, args...); + format(oss, fmt, args...); return oss.str(); } -template -std::string format(const std::string &fmt, const T1& v1, const Args&... args) +/// Format list of arguments to std::cout, according to the given format string +template +void printf(const char* fmt, const Args&... args) +{ + format(std::cout, fmt, args...); +} + +template +void printfln(const char* fmt, const Args&... args) +{ + format(std::cout, fmt, args...); + std::cout << '\n'; +} + +#else // C++98 version + +inline void format(std::ostream& out, const char* fmt) +{ + vformat(out, fmt, makeFormatList()); +} + +inline std::string format(const char* fmt) { std::ostringstream oss; - format(oss, fmt.c_str(), v1, args...); + format(oss, fmt); return oss.str(); } -template -void printf(const char* fmt, const T1& v1, const Args&... args) +inline void printf(const char* fmt) { - format(std::cout, fmt, v1, args...); + format(std::cout, fmt); } -#else +inline void printfln(const char* fmt) +{ + format(std::cout, fmt); + std::cout << '\n'; +} -// C++98 - define the interface functions using the wrapping macros #define TINYFORMAT_MAKE_FORMAT_FUNCS(n) \ \ template \ void format(std::ostream& out, const char* fmt, TINYFORMAT_VARARGS(n)) \ { \ - tinyformat::detail::FormatIterator fmtIter(out, fmt); \ - tinyformat::detail::format(fmtIter, TINYFORMAT_PASSARGS(n)); \ + vformat(out, fmt, makeFormatList(TINYFORMAT_PASSARGS(n))); \ } \ \ template \ std::string format(const char* fmt, TINYFORMAT_VARARGS(n)) \ { \ std::ostringstream oss; \ - tinyformat::format(oss, fmt, TINYFORMAT_PASSARGS(n)); \ - return oss.str(); \ -} \ - \ -template \ -std::string format(const std::string &fmt, TINYFORMAT_VARARGS(n)) \ -{ \ - std::ostringstream oss; \ - tinyformat::format(oss, fmt.c_str(), TINYFORMAT_PASSARGS(n)); \ + format(oss, fmt, TINYFORMAT_PASSARGS(n)); \ return oss.str(); \ } \ \ template \ void printf(const char* fmt, TINYFORMAT_VARARGS(n)) \ { \ - tinyformat::format(std::cout, fmt, TINYFORMAT_PASSARGS(n)); \ + format(std::cout, fmt, TINYFORMAT_PASSARGS(n)); \ +} \ + \ +template \ +void printfln(const char* fmt, TINYFORMAT_VARARGS(n)) \ +{ \ + format(std::cout, fmt, TINYFORMAT_PASSARGS(n)); \ + std::cout << '\n'; \ } TINYFORMAT_FOREACH_ARGNUM(TINYFORMAT_MAKE_FORMAT_FUNCS) #undef TINYFORMAT_MAKE_FORMAT_FUNCS + #endif - -//------------------------------------------------------------------------------ -// Define deprecated wrapping macro for backward compatibility in tinyformat -// 1.x. Will be removed in version 2! -#define TINYFORMAT_WRAP_FORMAT_EXTRA_ARGS -#define TINYFORMAT_WRAP_FORMAT_N(n, returnType, funcName, funcDeclSuffix, \ - bodyPrefix, streamName, bodySuffix) \ -template \ -returnType funcName(TINYFORMAT_WRAP_FORMAT_EXTRA_ARGS const char* fmt, \ - TINYFORMAT_VARARGS(n)) funcDeclSuffix \ -{ \ - bodyPrefix \ - tinyformat::format(streamName, fmt, TINYFORMAT_PASSARGS(n)); \ - bodySuffix \ -} \ - -#define TINYFORMAT_WRAP_FORMAT(returnType, funcName, funcDeclSuffix, \ - bodyPrefix, streamName, bodySuffix) \ -inline \ -returnType funcName(TINYFORMAT_WRAP_FORMAT_EXTRA_ARGS const char* fmt \ - ) funcDeclSuffix \ -{ \ - bodyPrefix \ - tinyformat::detail::FormatIterator(streamName, fmt).finish(); \ - bodySuffix \ -} \ -TINYFORMAT_WRAP_FORMAT_N(1 , returnType, funcName, funcDeclSuffix, bodyPrefix, streamName, bodySuffix) \ -TINYFORMAT_WRAP_FORMAT_N(2 , returnType, funcName, funcDeclSuffix, bodyPrefix, streamName, bodySuffix) \ -TINYFORMAT_WRAP_FORMAT_N(3 , returnType, funcName, funcDeclSuffix, bodyPrefix, streamName, bodySuffix) \ -TINYFORMAT_WRAP_FORMAT_N(4 , returnType, funcName, funcDeclSuffix, bodyPrefix, streamName, bodySuffix) \ -TINYFORMAT_WRAP_FORMAT_N(5 , returnType, funcName, funcDeclSuffix, bodyPrefix, streamName, bodySuffix) \ -TINYFORMAT_WRAP_FORMAT_N(6 , returnType, funcName, funcDeclSuffix, bodyPrefix, streamName, bodySuffix) \ -TINYFORMAT_WRAP_FORMAT_N(7 , returnType, funcName, funcDeclSuffix, bodyPrefix, streamName, bodySuffix) \ -TINYFORMAT_WRAP_FORMAT_N(8 , returnType, funcName, funcDeclSuffix, bodyPrefix, streamName, bodySuffix) \ -TINYFORMAT_WRAP_FORMAT_N(9 , returnType, funcName, funcDeclSuffix, bodyPrefix, streamName, bodySuffix) \ -TINYFORMAT_WRAP_FORMAT_N(10, returnType, funcName, funcDeclSuffix, bodyPrefix, streamName, bodySuffix) \ -TINYFORMAT_WRAP_FORMAT_N(11, returnType, funcName, funcDeclSuffix, bodyPrefix, streamName, bodySuffix) \ -TINYFORMAT_WRAP_FORMAT_N(12, returnType, funcName, funcDeclSuffix, bodyPrefix, streamName, bodySuffix) \ -TINYFORMAT_WRAP_FORMAT_N(13, returnType, funcName, funcDeclSuffix, bodyPrefix, streamName, bodySuffix) \ -TINYFORMAT_WRAP_FORMAT_N(14, returnType, funcName, funcDeclSuffix, bodyPrefix, streamName, bodySuffix) \ -TINYFORMAT_WRAP_FORMAT_N(15, returnType, funcName, funcDeclSuffix, bodyPrefix, streamName, bodySuffix) \ -TINYFORMAT_WRAP_FORMAT_N(16, returnType, funcName, funcDeclSuffix, bodyPrefix, streamName, bodySuffix) \ - +// Added for Bitcoin Core +template +std::string format(const std::string &fmt, const Args&... args) +{ + std::ostringstream oss; + format(oss, fmt.c_str(), args...); + return oss.str(); +} } // namespace tinyformat diff --git a/src/txmempool.h b/src/txmempool.h index a6901fde6..e6fd8e60b 100644 --- a/src/txmempool.h +++ b/src/txmempool.h @@ -92,7 +92,7 @@ private: unsigned int nTransactionsUpdated; CBlockPolicyEstimator* minerPolicyEstimator; - uint64_t totalTxSize; //! sum of all mempool tx' byte sizes + uint64_t totalTxSize = 0; //! sum of all mempool tx' byte sizes public: mutable CCriticalSection cs; diff --git a/src/util.cpp b/src/util.cpp index 2e67045f5..98f8c1720 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -107,9 +107,10 @@ bool fPrintToDebugLog = true; bool fDaemon = false; bool fServer = false; string strMiscWarning; -bool fLogTimestamps = false; -bool fLogIPs = false; -volatile bool fReopenDebugLog = false; +bool fLogTimestamps = DEFAULT_LOGTIMESTAMPS; +bool fLogTimeMicros = DEFAULT_LOGTIMEMICROS; +bool fLogIPs = DEFAULT_LOGIPS; +std::atomic fReopenDebugLog(false); CTranslationInterface translationInterface; /** Init OpenSSL library multithreading support */ diff --git a/src/util.h b/src/util.h index 336e2b1b1..ef3a347fa 100644 --- a/src/util.h +++ b/src/util.h @@ -18,6 +18,7 @@ #include "tinyformat.h" #include "utiltime.h" +#include #include #include #include @@ -28,6 +29,10 @@ #include #include +static const bool DEFAULT_LOGTIMEMICROS = false; +static const bool DEFAULT_LOGIPS = false; +static const bool DEFAULT_LOGTIMESTAMPS = true; + /** Signals for translation. */ class CTranslationInterface { @@ -45,7 +50,7 @@ extern bool fServer; extern std::string strMiscWarning; extern bool fLogTimestamps; extern bool fLogIPs; -extern volatile bool fReopenDebugLog; +extern std::atomic fReopenDebugLog; extern CTranslationInterface translationInterface; /** @@ -209,7 +214,7 @@ void RenameThread(const char* name); */ template void TraceThread(const char* name, Callable func) { - std::string s = strprintf("bitcoin-%s", name); + std::string s = strprintf("zcash-%s", name); RenameThread(s.c_str()); try { diff --git a/src/utiltime.cpp b/src/utiltime.cpp index d31628899..a7cdeb114 100644 --- a/src/utiltime.cpp +++ b/src/utiltime.cpp @@ -9,6 +9,7 @@ #include "utiltime.h" +#include #include #include @@ -30,14 +31,14 @@ void SetMockTime(int64_t nMockTimeIn) int64_t GetTimeMillis() { - return (boost::posix_time::microsec_clock::universal_time() - - boost::posix_time::ptime(boost::gregorian::date(1970,1,1))).total_milliseconds(); + return std::chrono::duration_cast( + std::chrono::system_clock::now().time_since_epoch()).count(); } int64_t GetTimeMicros() { - return (boost::posix_time::microsec_clock::universal_time() - - boost::posix_time::ptime(boost::gregorian::date(1970,1,1))).total_microseconds(); + return std::chrono::duration_cast( + std::chrono::system_clock::now().time_since_epoch()).count(); } void MilliSleep(int64_t n) diff --git a/src/wallet/asyncrpcoperation_sendmany.cpp b/src/wallet/asyncrpcoperation_sendmany.cpp index e4dfef5a0..f72badc60 100644 --- a/src/wallet/asyncrpcoperation_sendmany.cpp +++ b/src/wallet/asyncrpcoperation_sendmany.cpp @@ -29,6 +29,23 @@ using namespace libzcash; +int find_output(Object obj, int n) { + Value outputMapValue = find_value(obj, "outputmap"); + if (outputMapValue.type() != array_type) { + throw JSONRPCError(RPC_WALLET_ERROR, "Missing outputmap for JoinSplit operation"); + } + + Array outputMap = outputMapValue.get_array(); + assert(outputMap.size() == ZC_NUM_JS_OUTPUTS); + for (size_t i = 0; i < outputMap.size(); i++) { + if (outputMap[i] == n) { + return i; + } + } + + throw std::logic_error("n is not present in outputmap"); +} + AsyncRPCOperation_sendmany::AsyncRPCOperation_sendmany( std::string fromAddress, std::vector tOutputs, @@ -179,12 +196,15 @@ bool AsyncRPCOperation_sendmany::main_impl() { CAmount sendAmount = z_outputs_total + t_outputs_total; CAmount targetAmount = sendAmount + minersFee; + assert(!isfromtaddr_ || z_inputs_total == 0); + assert(!isfromzaddr_ || t_inputs_total == 0); + if (isfromtaddr_ && (t_inputs_total < targetAmount)) { - throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, strprintf("Insufficient transparent funds, have %ld, need %ld plus fee %ld", t_inputs_total, t_outputs_total, minersFee)); + throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, strprintf("Insufficient transparent funds, have %ld, need %ld", t_inputs_total, targetAmount)); } if (isfromzaddr_ && (z_inputs_total < targetAmount)) { - throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, strprintf("Insufficient protected funds, have %ld, need %ld plus fee %ld", z_inputs_total, z_outputs_total, minersFee)); + throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, strprintf("Insufficient protected funds, have %ld, need %ld", z_inputs_total, targetAmount)); } // If from address is a taddr, select UTXOs to spend @@ -284,8 +304,9 @@ bool AsyncRPCOperation_sendmany::main_impl() { * -> zaddrs * * Note: Consensus rule states that coinbase utxos can only be sent to a zaddr. - * Any change over and above the amount specified by the user will be sent - * to the same zaddr the user is sending funds to. + * Local wallet rule does not allow any change when sending coinbase utxos + * since there is currently no way to specify a change address and we don't + * want users accidentally sending excess funds to a recipient. */ if (isfromtaddr_) { add_taddr_outputs_to_tx(); @@ -294,25 +315,13 @@ bool AsyncRPCOperation_sendmany::main_impl() { CAmount fundsSpent = t_outputs_total + minersFee + z_outputs_total; CAmount change = funds - fundsSpent; - // If there is a single zaddr and there are coinbase utxos, change goes to the zaddr. if (change > 0) { - if (isSingleZaddrOutput && selectedUTXOCoinbase) { - std::string address = std::get<0>(zOutputsDeque.front()); - SendManyRecipient smr(address, change, std::string()); - zOutputsDeque.push_back(smr); - - LogPrint("zrpc", "%s: change from coinbase utxo is also sent to the recipient (amount=%s)\n", - getId().substr(0, 10), - FormatMoney(change, false) - ); - - } else if (!isSingleZaddrOutput && selectedUTXOCoinbase) { - // This should not happen and is not allowed - assert(false); + if (selectedUTXOCoinbase) { + assert(isSingleZaddrOutput); + throw JSONRPCError(RPC_WALLET_ERROR, strprintf( + "Change %ld not allowed. When protecting coinbase funds, the wallet does not allow any change as there is currently no way to specify a change address in z_sendmany.", change)); } else { - // If there is a single zaddr and no coinbase utxos, just use a regular output for change. add_taddr_change_output_to_tx(change); - LogPrint("zrpc", "%s: transparent change in transaction output (amount=%s)\n", getId().substr(0, 10), FormatMoney(change, false) @@ -372,6 +381,7 @@ bool AsyncRPCOperation_sendmany::main_impl() { */ Object obj; CAmount jsChange = 0; // this is updated after each joinsplit + int changeOutputIndex = -1; // this is updated after each joinsplit if jsChange > 0 bool minersFeeProcessed = false; if (t_outputs_total > 0) { @@ -429,6 +439,10 @@ bool AsyncRPCOperation_sendmany::main_impl() { } obj = perform_joinsplit(info, outPoints); + + if (jsChange > 0) { + changeOutputIndex = find_output(obj, 1); + } } } @@ -442,9 +456,6 @@ bool AsyncRPCOperation_sendmany::main_impl() { // Keep track of treestate within this transaction boost::unordered_map intermediates; std::vector previousCommitments; - - // NOTE: Randomization of input and output order could break this in future - const int changeOutputIndex = 1; while (zOutputsDeque.size() > 0) { AsyncJoinSplitInfo info; @@ -483,7 +494,6 @@ bool AsyncRPCOperation_sendmany::main_impl() { throw JSONRPCError(RPC_WALLET_ERROR, "Could not find previous JoinSplit anchor"); } - // NOTE: We assume the last commitment, output 1, is the change we want for (const uint256& commitment : prevJoinSplit.commitments) { tree.append(commitment); previousCommitments.push_back(commitment); @@ -645,6 +655,10 @@ bool AsyncRPCOperation_sendmany::main_impl() { } obj = perform_joinsplit(info, witnesses, jsAnchor); + + if (jsChange > 0) { + changeOutputIndex = find_output(obj, 1); + } } } @@ -758,7 +772,8 @@ bool AsyncRPCOperation_sendmany::find_unspent_notes() { for (CNotePlaintextEntry & entry : entries) { z_inputs_.push_back(SendManyInputJSOP(entry.jsop, entry.plaintext.note(frompaymentaddress_), CAmount(entry.plaintext.value))); std::string data(entry.plaintext.memo.begin(), entry.plaintext.memo.end()); - LogPrint("zrpc", "%s: found unspent note (txid=%s, vjoinsplit=%d, ciphertext=%d, amount=%s, memo=%s)\n", + if (LogAcceptCategory("zrpcunsafe")) { + LogPrint("zrpcunsafe", "%s: found unspent note (txid=%s, vjoinsplit=%d, ciphertext=%d, amount=%s, memo=%s)\n", getId().substr(0, 10), entry.jsop.hash.ToString().substr(0, 10), entry.jsop.js, @@ -766,6 +781,15 @@ bool AsyncRPCOperation_sendmany::find_unspent_notes() { FormatMoney(entry.plaintext.value, false), HexStr(data).substr(0, 10) ); + } else { + LogPrint("zrpc", "%s: found unspent note (txid=%s, vjoinsplit=%d, ciphertext=%d, amount=%s)\n", + getId().substr(0, 10), + entry.jsop.hash.ToString().substr(0, 10), + entry.jsop.js, + int(entry.jsop.n), // uint8_t + FormatMoney(entry.plaintext.value, false) + ); + } } if (z_inputs_.size() == 0) { @@ -845,11 +869,20 @@ Object AsyncRPCOperation_sendmany::perform_joinsplit( ); // Generate the proof, this can take over a minute. - JSDescription jsdesc(*pzcashParams, + boost::array inputs + {info.vjsin[0], info.vjsin[1]}; + boost::array outputs + {info.vjsout[0], info.vjsout[1]}; + boost::array inputMap; + boost::array outputMap; + JSDescription jsdesc = JSDescription::Randomized( + *pzcashParams, joinSplitPubKey_, anchor, - {info.vjsin[0], info.vjsin[1]}, - {info.vjsout[0], info.vjsout[1]}, + inputs, + outputs, + inputMap, + outputMap, info.vpub_old, info.vpub_new, !this->testmode); @@ -910,10 +943,21 @@ Object AsyncRPCOperation_sendmany::perform_joinsplit( encryptedNote2 = HexStr(ss2.begin(), ss2.end()); } + Array arrInputMap; + Array arrOutputMap; + for (size_t i = 0; i < ZC_NUM_JS_INPUTS; i++) { + arrInputMap.push_back(inputMap[i]); + } + for (size_t i = 0; i < ZC_NUM_JS_OUTPUTS; i++) { + arrOutputMap.push_back(outputMap[i]); + } + Object obj; obj.push_back(Pair("encryptednote1", encryptedNote1)); obj.push_back(Pair("encryptednote2", encryptedNote2)); obj.push_back(Pair("rawtxn", HexStr(ss.begin(), ss.end()))); + obj.push_back(Pair("inputmap", arrInputMap)); + obj.push_back(Pair("outputmap", arrOutputMap)); return obj; } diff --git a/src/wallet/gtest/test_wallet.cpp b/src/wallet/gtest/test_wallet.cpp index c1bf5d34c..a1452e879 100644 --- a/src/wallet/gtest/test_wallet.cpp +++ b/src/wallet/gtest/test_wallet.cpp @@ -11,9 +11,11 @@ #include "zcash/Note.hpp" #include "zcash/NoteEncryption.hpp" +#include + using ::testing::Return; -ZCJoinSplit* params = ZCJoinSplit::Unopened(); +extern ZCJoinSplit* params; ACTION(ThrowLogicError) { throw std::logic_error("Boom"); @@ -178,6 +180,13 @@ CWalletTx GetValidSpend(const libzcash::SpendingKey& sk, return wtx; } +TEST(wallet_tests, setup_datadir_location_run_as_first_test) { + // Get temporary and unique path for file. + boost::filesystem::path pathTemp = boost::filesystem::temp_directory_path() / boost::filesystem::unique_path(); + boost::filesystem::create_directories(pathTemp); + mapArgs["-datadir"] = pathTemp.string(); +} + TEST(wallet_tests, note_data_serialisation) { auto sk = libzcash::SpendingKey::random(); auto wtx = GetValidReceive(sk, 10, true); @@ -734,6 +743,14 @@ TEST(wallet_tests, cached_witnesses_chain_tip) { wallet.GetNoteWitnesses(notes, witnesses, anchor4); EXPECT_TRUE((bool) witnesses[0]); EXPECT_EQ(anchor2, anchor4); + + // Incrementing with the same block again should not change the cache + uint256 anchor5; + wallet.IncrementNoteWitnesses(&index2, &block2, tree); + std::vector> witnesses5; + wallet.GetNoteWitnesses(notes, witnesses5, anchor5); + EXPECT_EQ(witnesses, witnesses5); + EXPECT_EQ(anchor4, anchor5); } } diff --git a/src/wallet/rpcdump.cpp b/src/wallet/rpcdump.cpp index e4840301e..789bd4537 100644 --- a/src/wallet/rpcdump.cpp +++ b/src/wallet/rpcdump.cpp @@ -81,10 +81,10 @@ Value importprivkey(const Array& params, bool fHelp) if (fHelp || params.size() < 1 || params.size() > 3) throw runtime_error( - "importprivkey \"bitcoinprivkey\" ( \"label\" rescan )\n" + "importprivkey \"zcashprivkey\" ( \"label\" rescan )\n" "\nAdds a private key (as returned by dumpprivkey) to your wallet.\n" "\nArguments:\n" - "1. \"bitcoinprivkey\" (string, required) The private key (see dumpprivkey)\n" + "1. \"zcashprivkey\" (string, required) The private key (see dumpprivkey)\n" "2. \"label\" (string, optional, default=\"\") An optional label\n" "3. rescan (boolean, optional, default=true) Rescan the wallet for transactions\n" "\nNote: This call can take minutes to complete if rescan is true.\n" @@ -182,7 +182,7 @@ Value importaddress(const Array& params, bool fHelp) std::vector data(ParseHex(params[0].get_str())); script = CScript(data.begin(), data.end()); } else { - throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid Bitcoin address or script"); + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid Zcash address or script"); } string strLabel = ""; @@ -321,7 +321,7 @@ Value importwallet_impl(const Array& params, bool fHelp, bool fImportZKeys) } catch (const std::runtime_error &e) { LogPrint("zrpc","Importing detected an error: %s\n", e.what()); - // Not a valid spending key, so carry on and see if it's a Bitcoin style address. + // Not a valid spending key, so carry on and see if it's a Zcash style address. } } @@ -388,11 +388,11 @@ Value dumpprivkey(const Array& params, bool fHelp) if (fHelp || params.size() != 1) throw runtime_error( - "dumpprivkey \"bitcoinaddress\"\n" - "\nReveals the private key corresponding to 'bitcoinaddress'.\n" + "dumpprivkey \"zcashaddress\"\n" + "\nReveals the private key corresponding to 'zcashaddress'.\n" "Then the importprivkey can be used with this output\n" "\nArguments:\n" - "1. \"bitcoinaddress\" (string, required) The bitcoin address for the private key\n" + "1. \"zcashaddress\" (string, required) The zcash address for the private key\n" "\nResult:\n" "\"key\" (string) The private key\n" "\nExamples:\n" @@ -408,7 +408,7 @@ Value dumpprivkey(const Array& params, bool fHelp) string strAddress = params[0].get_str(); CBitcoinAddress address; if (!address.SetString(strAddress)) - throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid Bitcoin address"); + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid Zcash address"); CKeyID keyID; if (!address.GetKeyID(keyID)) throw JSONRPCError(RPC_TYPE_ERROR, "Address does not refer to a key"); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index e934bfa66..be53660f6 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -114,11 +114,11 @@ Value getnewaddress(const Array& params, bool fHelp) if (fHelp || params.size() > 1) throw runtime_error( "getnewaddress ( \"account\" )\n" - "\nReturns a new Bitcoin address for receiving payments.\n" + "\nReturns a new Zcash address for receiving payments.\n" "\nArguments:\n" "1. \"account\" (string, optional) DEPRECATED. If provided, it MUST be set to the empty string \"\" to represent the default account. Passing any other string will result in an error.\n" "\nResult:\n" - "\"bitcoinaddress\" (string) The new bitcoin address\n" + "\"zcashaddress\" (string) The new zcash address\n" "\nExamples:\n" + HelpExampleCli("getnewaddress", "") + HelpExampleRpc("getnewaddress", "") @@ -191,11 +191,11 @@ Value getaccountaddress(const Array& params, bool fHelp) if (fHelp || params.size() != 1) throw runtime_error( "getaccountaddress \"account\"\n" - "\nDEPRECATED. Returns the current Bitcoin address for receiving payments to this account.\n" + "\nDEPRECATED. Returns the current Zcash address for receiving payments to this account.\n" "\nArguments:\n" "1. \"account\" (string, required) MUST be set to the empty string \"\" to represent the default account. Passing any other string will result in an error.\n" "\nResult:\n" - "\"bitcoinaddress\" (string) The account bitcoin address\n" + "\"zcashaddress\" (string) The account zcash address\n" "\nExamples:\n" + HelpExampleCli("getaccountaddress", "") + HelpExampleCli("getaccountaddress", "\"\"") @@ -223,7 +223,7 @@ Value getrawchangeaddress(const Array& params, bool fHelp) if (fHelp || params.size() > 1) throw runtime_error( "getrawchangeaddress\n" - "\nReturns a new Bitcoin address, for receiving change.\n" + "\nReturns a new Zcash address, for receiving change.\n" "This is for use with raw transactions, NOT normal use.\n" "\nResult:\n" "\"address\" (string) The address\n" @@ -257,10 +257,10 @@ Value setaccount(const Array& params, bool fHelp) if (fHelp || params.size() < 1 || params.size() > 2) throw runtime_error( - "setaccount \"bitcoinaddress\" \"account\"\n" + "setaccount \"zcashaddress\" \"account\"\n" "\nDEPRECATED. Sets the account associated with the given address.\n" "\nArguments:\n" - "1. \"bitcoinaddress\" (string, required) The bitcoin address to be associated with an account.\n" + "1. \"zcashaddress\" (string, required) The zcash address to be associated with an account.\n" "2. \"account\" (string, required) MUST be set to the empty string \"\" to represent the default account. Passing any other string will result in an error.\n" "\nExamples:\n" + HelpExampleCli("setaccount", "\"1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ\" \"tabby\"") @@ -271,7 +271,7 @@ Value setaccount(const Array& params, bool fHelp) CBitcoinAddress address(params[0].get_str()); if (!address.IsValid()) - throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid Bitcoin address"); + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid Zcash address"); string strAccount; if (params.size() > 1) @@ -303,10 +303,10 @@ Value getaccount(const Array& params, bool fHelp) if (fHelp || params.size() != 1) throw runtime_error( - "getaccount \"bitcoinaddress\"\n" + "getaccount \"zcashaddress\"\n" "\nDEPRECATED. Returns the account associated with the given address.\n" "\nArguments:\n" - "1. \"bitcoinaddress\" (string, required) The bitcoin address for account lookup.\n" + "1. \"zcashaddress\" (string, required) The zcash address for account lookup.\n" "\nResult:\n" "\"accountname\" (string) the account address\n" "\nExamples:\n" @@ -318,7 +318,7 @@ Value getaccount(const Array& params, bool fHelp) CBitcoinAddress address(params[0].get_str()); if (!address.IsValid()) - throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid Bitcoin address"); + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid Zcash address"); string strAccount; map::iterator mi = pwalletMain->mapAddressBook.find(address.Get()); @@ -341,7 +341,7 @@ Value getaddressesbyaccount(const Array& params, bool fHelp) "1. \"account\" (string, required) MUST be set to the empty string \"\" to represent the default account. Passing any other string will result in an error.\n" "\nResult:\n" "[ (json array of string)\n" - " \"bitcoinaddress\" (string) a bitcoin address associated with the given account\n" + " \"zcashaddress\" (string) a zcash address associated with the given account\n" " ,...\n" "]\n" "\nExamples:\n" @@ -376,7 +376,7 @@ static void SendMoney(const CTxDestination &address, CAmount nValue, bool fSubtr if (nValue > curBalance) throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, "Insufficient funds"); - // Parse Bitcoin address + // Parse Zcash address CScript scriptPubKey = GetScriptForDestination(address); // Create and send the transaction @@ -417,11 +417,11 @@ Value sendtoaddress(const Array& params, bool fHelp) if (fHelp || params.size() < 2 || params.size() > 5) throw runtime_error( - "sendtoaddress \"bitcoinaddress\" amount ( \"comment\" \"comment-to\" subtractfeefromamount )\n" + "sendtoaddress \"zcashaddress\" amount ( \"comment\" \"comment-to\" subtractfeefromamount )\n" "\nSend an amount to a given address. The amount is a real and is rounded to the nearest 0.00000001\n" + HelpRequiringPassphrase() + "\nArguments:\n" - "1. \"bitcoinaddress\" (string, required) The bitcoin address to send to.\n" + "1. \"zcashaddress\" (string, required) The zcash address to send to.\n" "2. \"amount\" (numeric, required) The amount in btc to send. eg 0.1\n" "3. \"comment\" (string, optional) A comment used to store what the transaction is for. \n" " This is not part of the transaction, just kept in your wallet.\n" @@ -429,7 +429,7 @@ Value sendtoaddress(const Array& params, bool fHelp) " to which you're sending the transaction. This is not part of the \n" " transaction, just kept in your wallet.\n" "5. subtractfeefromamount (boolean, optional, default=false) The fee will be deducted from the amount being sent.\n" - " The recipient will receive less bitcoins than you enter in the amount field.\n" + " The recipient will receive less zcash than you enter in the amount field.\n" "\nResult:\n" "\"transactionid\" (string) The transaction id.\n" "\nExamples:\n" @@ -443,7 +443,7 @@ Value sendtoaddress(const Array& params, bool fHelp) CBitcoinAddress address(params[0].get_str()); if (!address.IsValid()) - throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid Bitcoin address"); + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid Zcash address"); // Amount CAmount nAmount = AmountFromValue(params[1]); @@ -519,7 +519,7 @@ Value listaddressgroupings(const Array& params, bool fHelp) "[\n" " [\n" " [\n" - " \"bitcoinaddress\", (string) The bitcoin address\n" + " \"zcashaddress\", (string) The zcash address\n" " amount, (numeric) The amount in btc\n" " \"account\" (string, optional) The account (DEPRECATED)\n" " ]\n" @@ -562,11 +562,11 @@ Value signmessage(const Array& params, bool fHelp) if (fHelp || params.size() != 2) throw runtime_error( - "signmessage \"bitcoinaddress\" \"message\"\n" + "signmessage \"zcashaddress\" \"message\"\n" "\nSign a message with the private key of an address" + HelpRequiringPassphrase() + "\n" "\nArguments:\n" - "1. \"bitcoinaddress\" (string, required) The bitcoin address to use for the private key.\n" + "1. \"zcashaddress\" (string, required) The zcash address to use for the private key.\n" "2. \"message\" (string, required) The message to create a signature of.\n" "\nResult:\n" "\"signature\" (string) The signature of the message encoded in base 64\n" @@ -618,10 +618,10 @@ Value getreceivedbyaddress(const Array& params, bool fHelp) if (fHelp || params.size() < 1 || params.size() > 2) throw runtime_error( - "getreceivedbyaddress \"bitcoinaddress\" ( minconf )\n" - "\nReturns the total amount received by the given bitcoinaddress in transactions with at least minconf confirmations.\n" + "getreceivedbyaddress \"zcashaddress\" ( minconf )\n" + "\nReturns the total amount received by the given zcashaddress in transactions with at least minconf confirmations.\n" "\nArguments:\n" - "1. \"bitcoinaddress\" (string, required) The bitcoin address for transactions.\n" + "1. \"zcashaddress\" (string, required) The zcash address for transactions.\n" "2. minconf (numeric, optional, default=1) Only include transactions confirmed at least this many times.\n" "\nResult:\n" "amount (numeric) The total amount in btc received at this address.\n" @@ -641,7 +641,7 @@ Value getreceivedbyaddress(const Array& params, bool fHelp) // Bitcoin address CBitcoinAddress address = CBitcoinAddress(params[0].get_str()); if (!address.IsValid()) - throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid Bitcoin address"); + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid Zcash address"); CScript scriptPubKey = GetScriptForDestination(address.Get()); if (!IsMine(*pwalletMain,scriptPubKey)) return (double)0.0; @@ -923,13 +923,13 @@ Value sendfrom(const Array& params, bool fHelp) if (fHelp || params.size() < 3 || params.size() > 6) throw runtime_error( - "sendfrom \"fromaccount\" \"tobitcoinaddress\" amount ( minconf \"comment\" \"comment-to\" )\n" - "\nDEPRECATED (use sendtoaddress). Sent an amount from an account to a bitcoin address.\n" + "sendfrom \"fromaccount\" \"tozcashaddress\" amount ( minconf \"comment\" \"comment-to\" )\n" + "\nDEPRECATED (use sendtoaddress). Sent an amount from an account to a zcash address.\n" "The amount is a real and is rounded to the nearest 0.00000001." + HelpRequiringPassphrase() + "\n" "\nArguments:\n" "1. \"fromaccount\" (string, required) MUST be set to the empty string \"\" to represent the default account. Passing any other string will result in an error.\n" - "2. \"tobitcoinaddress\" (string, required) The bitcoin address to send funds to.\n" + "2. \"tozcashaddress\" (string, required) The zcash address to send funds to.\n" "3. amount (numeric, required) The amount in btc. (transaction fee is added on top).\n" "4. minconf (numeric, optional, default=1) Only use funds with at least this many confirmations.\n" "5. \"comment\" (string, optional) A comment used to store what the transaction is for. \n" @@ -953,7 +953,7 @@ Value sendfrom(const Array& params, bool fHelp) string strAccount = AccountFromValue(params[0]); CBitcoinAddress address(params[1].get_str()); if (!address.IsValid()) - throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid Bitcoin address"); + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid Zcash address"); CAmount nAmount = AmountFromValue(params[2]); int nMinDepth = 1; if (params.size() > 3) @@ -993,14 +993,14 @@ Value sendmany(const Array& params, bool fHelp) "1. \"fromaccount\" (string, required) MUST be set to the empty string \"\" to represent the default account. Passing any other string will result in an error.\n" "2. \"amounts\" (string, required) A json object with addresses and amounts\n" " {\n" - " \"address\":amount (numeric) The bitcoin address is the key, the numeric amount in btc is the value\n" + " \"address\":amount (numeric) The zcash address is the key, the numeric amount in btc is the value\n" " ,...\n" " }\n" "3. minconf (numeric, optional, default=1) Only use the balance confirmed at least this many times.\n" "4. \"comment\" (string, optional) A comment\n" "5. subtractfeefromamount (string, optional) A json array with addresses.\n" " The fee will be equally deducted from the amount of each selected address.\n" - " Those recipients will receive less bitcoins than you enter in their corresponding amount field.\n" + " Those recipients will receive less zcashs than you enter in their corresponding amount field.\n" " If no addresses are specified here, the sender pays the fee.\n" " [\n" " \"address\" (string) Subtract fee from this address\n" @@ -1045,7 +1045,7 @@ Value sendmany(const Array& params, bool fHelp) { CBitcoinAddress address(s.name_); if (!address.IsValid()) - throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, string("Invalid Bitcoin address: ")+s.name_); + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, string("Invalid Zcash address: ")+s.name_); if (setAddress.count(address)) throw JSONRPCError(RPC_INVALID_PARAMETER, string("Invalid parameter, duplicated address: ")+s.name_); @@ -1097,20 +1097,20 @@ Value addmultisigaddress(const Array& params, bool fHelp) { string msg = "addmultisigaddress nrequired [\"key\",...] ( \"account\" )\n" "\nAdd a nrequired-to-sign multisignature address to the wallet.\n" - "Each key is a Bitcoin address or hex-encoded public key.\n" + "Each key is a Zcash address or hex-encoded public key.\n" "If 'account' is specified (DEPRECATED), assign address to that account.\n" "\nArguments:\n" "1. nrequired (numeric, required) The number of required signatures out of the n keys or addresses.\n" - "2. \"keysobject\" (string, required) A json array of bitcoin addresses or hex-encoded public keys\n" + "2. \"keysobject\" (string, required) A json array of zcash addresses or hex-encoded public keys\n" " [\n" - " \"address\" (string) bitcoin address or hex-encoded public key\n" + " \"address\" (string) zcash address or hex-encoded public key\n" " ...,\n" " ]\n" "3. \"account\" (string, optional) DEPRECATED. If provided, MUST be set to the empty string \"\" to represent the default account. Passing any other string will result in an error.\n" "\nResult:\n" - "\"bitcoinaddress\" (string) A bitcoin address associated with the keys.\n" + "\"zcashaddress\" (string) A zcash address associated with the keys.\n" "\nExamples:\n" "\nAdd a multisig address from 2 addresses\n" @@ -1455,7 +1455,7 @@ Value listtransactions(const Array& params, bool fHelp) " {\n" " \"account\":\"accountname\", (string) DEPRECATED. The account name associated with the transaction. \n" " It will be \"\" for the default account.\n" - " \"address\":\"bitcoinaddress\", (string) The bitcoin address of the transaction. Not present for \n" + " \"address\":\"zcashaddress\", (string) The zcash address of the transaction. Not present for \n" " move transactions (category = move).\n" " \"category\":\"send|receive|move\", (string) The transaction category. 'move' is a local (off blockchain)\n" " transaction between accounts, and not associated with an address,\n" @@ -1647,7 +1647,7 @@ Value listsinceblock(const Array& params, bool fHelp) "{\n" " \"transactions\": [\n" " \"account\":\"accountname\", (string) DEPRECATED. The account name associated with the transaction. Will be \"\" for the default account.\n" - " \"address\":\"bitcoinaddress\", (string) The bitcoin address of the transaction. Not present for move transactions (category = move).\n" + " \"address\":\"zcashaddress\", (string) The zcash address of the transaction. Not present for move transactions (category = move).\n" " \"category\":\"send|receive\", (string) The transaction category. 'send' has negative amounts, 'receive' has positive amounts.\n" " \"amount\": x.xxx, (numeric) The amount in btc. This is negative for the 'send' category, and for the 'move' category for moves \n" " outbound. It is positive for the 'receive' category, and for the 'move' category for inbound funds.\n" @@ -1746,7 +1746,7 @@ Value gettransaction(const Array& params, bool fHelp) " \"details\" : [\n" " {\n" " \"account\" : \"accountname\", (string) DEPRECATED. The account name involved in the transaction, can be \"\" for the default account.\n" - " \"address\" : \"bitcoinaddress\", (string) The bitcoin address involved in the transaction\n" + " \"address\" : \"zcashaddress\", (string) The zcash address involved in the transaction\n" " \"category\" : \"send|receive\", (string) The category, either 'send' or 'receive'\n" " \"amount\" : x.xxx (numeric) The amount in btc\n" " \"vout\" : n, (numeric) the vout value\n" @@ -1889,7 +1889,7 @@ Value walletpassphrase(const Array& params, bool fHelp) throw runtime_error( "walletpassphrase \"passphrase\" timeout\n" "\nStores the wallet decryption key in memory for 'timeout' seconds.\n" - "This is needed prior to performing transactions related to private keys such as sending bitcoins\n" + "This is needed prior to performing transactions related to private keys such as sending zcash\n" "\nArguments:\n" "1. \"passphrase\" (string, required) The wallet passphrase\n" "2. timeout (numeric, required) The time to keep the decryption key in seconds.\n" @@ -2031,10 +2031,18 @@ Value encryptwallet(const Array& params, bool fHelp) { if (!EnsureWalletIsAvailable(fHelp)) return Value::null; - + + auto fEnableWalletEncryption = GetBoolArg("-developerencryptwallet", false); + + std::string strWalletEncryptionDisabledMsg = ""; + if (!fEnableWalletEncryption) { + strWalletEncryptionDisabledMsg = "\nWARNING: Wallet encryption is DISABLED. This call always fails.\n"; + } + if (!pwalletMain->IsCrypted() && (fHelp || params.size() != 1)) throw runtime_error( "encryptwallet \"passphrase\"\n" + + strWalletEncryptionDisabledMsg + "\nEncrypts the wallet with 'passphrase'. This is for first time encryption.\n" "After this, any calls that interact with private keys such as sending or signing \n" "will require the passphrase to be set prior the making these calls.\n" @@ -2046,10 +2054,10 @@ Value encryptwallet(const Array& params, bool fHelp) "\nExamples:\n" "\nEncrypt you wallet\n" + HelpExampleCli("encryptwallet", "\"my pass phrase\"") + - "\nNow set the passphrase to use the wallet, such as for signing or sending bitcoin\n" + "\nNow set the passphrase to use the wallet, such as for signing or sending zcash\n" + HelpExampleCli("walletpassphrase", "\"my pass phrase\"") + "\nNow we can so something like sign\n" - + HelpExampleCli("signmessage", "\"bitcoinaddress\" \"test message\"") + + + HelpExampleCli("signmessage", "\"zcashaddress\" \"test message\"") + "\nNow lock the wallet again by removing the passphrase\n" + HelpExampleCli("walletlock", "") + "\nAs a json rpc call\n" @@ -2060,6 +2068,9 @@ Value encryptwallet(const Array& params, bool fHelp) if (fHelp) return true; + if (!fEnableWalletEncryption) { + throw JSONRPCError(RPC_WALLET_ENCRYPTION_FAILED, "Error: wallet encryption is disabled."); + } if (pwalletMain->IsCrypted()) throw JSONRPCError(RPC_WALLET_WRONG_ENC_STATE, "Error: running with an encrypted wallet, but encryptwallet was called."); @@ -2081,7 +2092,7 @@ Value encryptwallet(const Array& params, bool fHelp) // slack space in .dat files; that is bad if the old data is // unencrypted private keys. So: StartShutdown(); - return "wallet encrypted; Bitcoin server stopping, restart to run with encrypted wallet. The keypool has been flushed, you need to make a new backup."; + return "wallet encrypted; Zcash server stopping, restart to run with encrypted wallet. The keypool has been flushed, you need to make a new backup."; } Value lockunspent(const Array& params, bool fHelp) @@ -2094,7 +2105,7 @@ Value lockunspent(const Array& params, bool fHelp) "lockunspent unlock [{\"txid\":\"txid\",\"vout\":n},...]\n" "\nUpdates list of temporarily unspendable outputs.\n" "Temporarily lock (unlock=false) or unlock (unlock=true) specified transaction outputs.\n" - "A locked transaction output will not be chosen by automatic coin selection, when spending bitcoins.\n" + "A locked transaction output will not be chosen by automatic coin selection, when spending zcash.\n" "Locks are stored in memory only. Nodes start with zero locked outputs, and the locked output list\n" "is always cleared (by virtue of process exit) when a node stops or fails.\n" "Also see the listunspent call\n" @@ -2258,8 +2269,8 @@ Value getwalletinfo(const Array& params, bool fHelp) "\nResult:\n" "{\n" " \"walletversion\": xxxxx, (numeric) the wallet version\n" - " \"balance\": xxxxxxx, (numeric) the total confirmed bitcoin balance of the wallet\n" - " \"unconfirmed_balance\": xxx, (numeric) the total unconfirmed bitcoin balance of the wallet\n" + " \"balance\": xxxxxxx, (numeric) the total confirmed zcash balance of the wallet\n" + " \"unconfirmed_balance\": xxx, (numeric) the total unconfirmed zcash balance of the wallet\n" " \"immature_balance\": xxxxxx, (numeric) the total immature balance of the wallet\n" " \"txcount\": xxxxxxx, (numeric) the total number of transactions in the wallet\n" " \"keypoololdest\": xxxxxx, (numeric) the timestamp (seconds since GMT epoch) of the oldest pre-generated key in the key pool\n" @@ -2329,9 +2340,9 @@ Value listunspent(const Array& params, bool fHelp) "\nArguments:\n" "1. minconf (numeric, optional, default=1) The minimum confirmations to filter\n" "2. maxconf (numeric, optional, default=9999999) The maximum confirmations to filter\n" - "3. \"addresses\" (string) A json array of bitcoin addresses to filter\n" + "3. \"addresses\" (string) A json array of zcash addresses to filter\n" " [\n" - " \"address\" (string) bitcoin address\n" + " \"address\" (string) zcash address\n" " ,...\n" " ]\n" "\nResult\n" @@ -2339,7 +2350,7 @@ Value listunspent(const Array& params, bool fHelp) " {\n" " \"txid\" : \"txid\", (string) the transaction id \n" " \"vout\" : n, (numeric) the vout value\n" - " \"address\" : \"address\", (string) the bitcoin address\n" + " \"address\" : \"address\", (string) the zcash address\n" " \"account\" : \"account\", (string) DEPRECATED. The associated account, or \"\" for the default account\n" " \"scriptPubKey\" : \"key\", (string) the script key\n" " \"amount\" : x.xxx, (numeric) the transaction amount in btc\n" @@ -2370,7 +2381,7 @@ Value listunspent(const Array& params, bool fHelp) BOOST_FOREACH(Value& input, inputs) { CBitcoinAddress address(input.get_str()); if (!address.IsValid()) - throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, string("Invalid Bitcoin address: ")+input.get_str()); + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, string("Invalid Zcash address: ")+input.get_str()); if (setAddress.count(address)) throw JSONRPCError(RPC_INVALID_PARAMETER, string("Invalid parameter, duplicated address: ")+input.get_str()); setAddress.insert(address); @@ -3230,6 +3241,7 @@ Value z_sendmany(const Array& params, bool fHelp) "z_sendmany \"fromaddress\" [{\"address\":... ,\"amount\":...},...] ( minconf )\n" "\nSend multiple times. Amounts are double-precision floating point numbers." "\nChange from a taddr flows to a new taddr address, while change from zaddr returns to itself." + "\nWhen sending coinbase UTXOs to a zaddr, change is not alllowed. The entire value of the UTXO(s) must be consumed." + HelpRequiringPassphrase() + "\n" "\nArguments:\n" "1. \"fromaddress\" (string, required) The taddr or zaddr to send the funds from.\n" @@ -3287,8 +3299,6 @@ Value z_sendmany(const Array& params, bool fHelp) throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, expected object"); const Object& o = output.get_obj(); - RPCTypeCheck(o, boost::assign::map_list_of("address", str_type)("amount", real_type)); - // sanity check, report error if unknown key-value pairs for (const Pair& p : o) { std::string s = p.name_; diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index ee58ed703..41eb352ab 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -699,7 +699,23 @@ void CWallet::IncrementNoteWitnesses(const CBlockIndex* pindex, JSOutPoint jsoutpt {hash, i, j}; if (mapWallet[hash].mapNoteData.count(jsoutpt)) { CNoteData* nd = &(mapWallet[hash].mapNoteData[jsoutpt]); - assert(nd->witnesses.size() == 0); + if (nd->witnesses.size() > 0) { + // We think this can happen because we write out the + // witness cache state after every block increment or + // decrement, but the block index itself is written in + // batches. So if the node crashes in between these two + // operations, it is possible for IncrementNoteWitnesses + // to be called again on previously-cached blocks. This + // doesn't affect existing cached notes because of the + // CNoteData::witnessHeight checks. See #1378 for details. + LogPrintf("Inconsistent witness cache state found for %s\n- Cache size: %d\n- Top (height %d): %s\n- New (height %d): %s\n", + jsoutpt.ToString(), nd->witnesses.size(), + nd->witnessHeight, + nd->witnesses.front().root().GetHex(), + pindex->nHeight, + tree.witness().root().GetHex()); + nd->witnesses.clear(); + } nd->witnesses.push_front(tree.witness()); // Set height to one less than pindex so it gets incremented nd->witnessHeight = pindex->nHeight - 1; diff --git a/src/wallet/walletdb.cpp b/src/wallet/walletdb.cpp index 5c7138a61..d4966b186 100644 --- a/src/wallet/walletdb.cpp +++ b/src/wallet/walletdb.cpp @@ -885,7 +885,7 @@ DBErrors CWalletDB::ZapWalletTx(CWallet* pwallet, vector& vWtx) void ThreadFlushWalletDB(const string& strFile) { // Make this thread recognisable as the wallet flushing thread - RenameThread("bitcoin-wallet"); + RenameThread("zcash-wallet"); static bool fOneThread; if (fOneThread) diff --git a/src/zcash/IncrementalMerkleTree.hpp b/src/zcash/IncrementalMerkleTree.hpp index 1d023168a..cd21bf651 100644 --- a/src/zcash/IncrementalMerkleTree.hpp +++ b/src/zcash/IncrementalMerkleTree.hpp @@ -163,7 +163,7 @@ private: IncrementalMerkleTree tree; std::vector filled; boost::optional> cursor; - size_t cursor_depth; + size_t cursor_depth = 0; std::deque partial_path() const; IncrementalWitness(IncrementalMerkleTree tree) : tree(tree) {} }; diff --git a/src/zcash/Note.hpp b/src/zcash/Note.hpp index 8cf53e5b4..460e68f9d 100644 --- a/src/zcash/Note.hpp +++ b/src/zcash/Note.hpp @@ -26,7 +26,7 @@ public: class NotePlaintext { public: - uint64_t value; + uint64_t value = 0; uint256 rho; uint256 r; boost::array memo; diff --git a/src/zcbenchmarks.cpp b/src/zcbenchmarks.cpp index 6ea99993c..1d60fdde7 100644 --- a/src/zcbenchmarks.cpp +++ b/src/zcbenchmarks.cpp @@ -52,8 +52,8 @@ double benchmark_sleep() double benchmark_parameter_loading() { // FIXME: this is duplicated with the actual loading code - boost::filesystem::path pk_path = ZC_GetParamsDir() / "beta2-proving.key"; - boost::filesystem::path vk_path = ZC_GetParamsDir() / "beta2-verifying.key"; + boost::filesystem::path pk_path = ZC_GetParamsDir() / "sprout-proving.key"; + boost::filesystem::path vk_path = ZC_GetParamsDir() / "sprout-verifying.key"; struct timeval tv_start; timer_start(tv_start); diff --git a/zcutil/build-debian-package.sh b/zcutil/build-debian-package.sh index 07c0e0e23..5691f2372 100755 --- a/zcutil/build-debian-package.sh +++ b/zcutil/build-debian-package.sh @@ -1,6 +1,6 @@ #!/bin/bash ## Usage: -## ./build_DEBIAN_package.sh +## ./zcutil/build-debian-package.sh set -e set -x @@ -8,6 +8,7 @@ set -x BUILD_PATH="/tmp/zcbuild" PACKAGE_NAME="zcash" SRC_PATH=`pwd` +SRC_DEB=$SRC_PATH/contrib/DEBIAN umask 022 @@ -21,15 +22,41 @@ BUILD_DIR="$BUILD_PATH/$PACKAGE_NAME-$PACKAGE_VERSION-amd64" if [ -d $BUILD_DIR ]; then rm -R $BUILD_DIR fi -mkdir -p $BUILD_DIR/DEBIAN $BUILD_DIR/usr/bin -cp -r $SRC_PATH/contrib/DEBIAN/* $BUILD_DIR/DEBIAN/ -cp $SRC_PATH/src/zcashd $BUILD_DIR/usr/bin/ -cp $SRC_PATH/src/zcash-cli $BUILD_DIR/usr/bin/ -cp $SRC_PATH/zcutil/fetch-params.sh $BUILD_DIR/usr/bin/zcash-fetch-params +DEB_BIN=$BUILD_DIR/usr/bin +DEB_DOC=$BUILD_DIR/usr/share/doc/$PACKAGE_NAME +DEB_MAN=$BUILD_DIR/usr/share/man/man1 +mkdir -p $BUILD_DIR/DEBIAN $DEB_BIN $DEB_DOC $DEB_MAN +chmod 0755 -R $BUILD_DIR/* -# Create the deb package -dpkg-deb --build $BUILD_DIR +# Copy control file +cp $SRC_DEB/control $BUILD_DIR/DEBIAN +# Package maintainer scripts (currently empty) +#cp $SRC_DEB/postinst $BUILD_DIR/DEBIAN +#cp $SRC_DEB/postrm $BUILD_DIR/DEBIAN +#cp $SRC_DEB/preinst $BUILD_DIR/DEBIAN +#cp $SRC_DEB/prerm $BUILD_DIR/DEBIAN +# Copy binaries +cp $SRC_PATH/src/zcashd $DEB_BIN +cp $SRC_PATH/src/zcash-cli $DEB_BIN +cp $SRC_PATH/zcutil/fetch-params.sh $DEB_BIN/zcash-fetch-params +# Copy docs +cp $SRC_PATH/doc/release-notes/release-notes-1.0.0.md $DEB_DOC/changelog +cp $SRC_DEB/changelog $DEB_DOC/changelog.Debian +cp $SRC_DEB/copyright $DEB_DOC +cp -r $SRC_DEB/examples $DEB_DOC +# Copy manpages +cp $SRC_DEB/manpages/zcashd.1 $DEB_MAN +cp $SRC_DEB/manpages/zcash-cli.1 $DEB_MAN +# Gzip files +gzip --best -n $DEB_DOC/changelog +gzip --best -n $DEB_DOC/changelog.Debian +gzip --best -n $DEB_MAN/zcashd.1 +gzip --best -n $DEB_MAN/zcash-cli.1 + +# Create the Debian package +fakeroot dpkg-deb --build $BUILD_DIR cp $BUILD_PATH/$PACKAGE_NAME-$PACKAGE_VERSION-amd64.deb $SRC_PATH - +# Analyze with Lintian, reporting bugs and policy violations +lintian -i $SRC_PATH/$PACKAGE_NAME-$PACKAGE_VERSION-amd64.deb exit 0 diff --git a/zcutil/build.sh b/zcutil/build.sh index e259c02cb..0000c6201 100755 --- a/zcutil/build.sh +++ b/zcutil/build.sh @@ -35,7 +35,7 @@ fi # BUG: parameterize the platform/host directory: PREFIX="$(pwd)/depends/x86_64-unknown-linux-gnu/" -make "$@" -C ./depends/ V=1 NO_QT=1 +HOST=x86_64-unknown-linux-gnu BUILD=x86_64-unknown-linux-gnu make "$@" -C ./depends/ V=1 NO_QT=1 ./autogen.sh -./configure --prefix="${PREFIX}" --with-gui=no "$HARDENING_ARG" "$LCOV_ARG" CXXFLAGS='-fwrapv -fno-strict-aliasing -Werror -g' +./configure --prefix="${PREFIX}" --host=x86_64-unknown-linux-gnu --build=x86_64-unknown-linux-gnu --with-gui=no "$HARDENING_ARG" "$LCOV_ARG" CXXFLAGS='-fwrapv -fno-strict-aliasing -Werror -g' make "$@" V=1 diff --git a/zcutil/fetch-params.sh b/zcutil/fetch-params.sh index bf6a123f1..b344f905e 100755 --- a/zcutil/fetch-params.sh +++ b/zcutil/fetch-params.sh @@ -4,10 +4,13 @@ set -eu PARAMS_DIR="$HOME/.zcash-params" -BETA2_PKEY_NAME='beta2-proving.key' -BETA2_VKEY_NAME='beta2-verifying.key' -BETA2_PKEY_URL="https://z.cash/downloads/$BETA2_PKEY_NAME" -BETA2_VKEY_URL="https://z.cash/downloads/$BETA2_VKEY_NAME" +SPROUT_PKEY_NAME='sprout-proving.key' +SPROUT_VKEY_NAME='sprout-verifying.key' +SPROUT_PKEY_URL="https://z.cash/downloads/$SPROUT_PKEY_NAME" +SPROUT_VKEY_URL="https://z.cash/downloads/$SPROUT_VKEY_NAME" + +SHA256CMD="$(command -v sha256sum || echo shasum)" +SHA256ARGS="$(command -v sha256sum >/dev/null || echo '-a 256')" function fetch_params { local url="$1" @@ -25,7 +28,7 @@ function fetch_params { --retry-connrefused --waitretry=3 --timeout=30 \ "$url" - shasum -a 256 --check <