Serialize effective amount #231
5
.bumpversion.cfg
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
[bumpversion]
|
||||||
|
current_version = 0.3.16
|
||||||
|
commit = True
|
||||||
|
tag = True
|
||||||
|
|
18
.gitignore
vendored
|
@ -1,12 +1,14 @@
|
||||||
|
.idea
|
||||||
|
|
||||||
*.tar.gz
|
*.tar.gz
|
||||||
|
|
||||||
*.exe
|
*.exe
|
||||||
src/bitcoin
|
src/bitcoin
|
||||||
src/bitcoind
|
src/lbrycrdd
|
||||||
src/bitcoin-cli
|
src/lbrycrd-cli
|
||||||
src/bitcoin-tx
|
src/lbrycrd-tx
|
||||||
src/test/test_bitcoin
|
src/test/test_lbrycrd
|
||||||
src/qt/test/test_bitcoin-qt
|
src/qt/test/test_lbrycrd-qt
|
||||||
|
|
||||||
# autoreconf
|
# autoreconf
|
||||||
Makefile.in
|
Makefile.in
|
||||||
|
@ -43,6 +45,8 @@ src/qt/forms/ui_*.h
|
||||||
|
|
||||||
src/qt/test/moc*.cpp
|
src/qt/test/moc*.cpp
|
||||||
|
|
||||||
|
lbrycrd-dependencies/*
|
||||||
|
|
||||||
.deps
|
.deps
|
||||||
.dirstamp
|
.dirstamp
|
||||||
.libs
|
.libs
|
||||||
|
@ -70,10 +74,12 @@ src/qt/test/moc*.cpp
|
||||||
#libtool object files
|
#libtool object files
|
||||||
*.lo
|
*.lo
|
||||||
*.la
|
*.la
|
||||||
|
start_time
|
||||||
|
|
||||||
# Compilation and Qt preprocessor part
|
# Compilation and Qt preprocessor part
|
||||||
*.qm
|
*.qm
|
||||||
Makefile
|
Makefile
|
||||||
|
lbrycrd-qt
|
||||||
bitcoin-qt
|
bitcoin-qt
|
||||||
Bitcoin-Qt.app
|
Bitcoin-Qt.app
|
||||||
|
|
||||||
|
@ -114,3 +120,5 @@ share/BitcoindComparisonTool.jar
|
||||||
/doc/doxygen/
|
/doc/doxygen/
|
||||||
|
|
||||||
libbitcoinconsensus.pc
|
libbitcoinconsensus.pc
|
||||||
|
|
||||||
|
cmake-build-*/
|
||||||
|
|
142
.travis.yml
|
@ -1,85 +1,69 @@
|
||||||
# errata:
|
matrix:
|
||||||
# - A travis bug causes caches to trample eachother when using the same
|
include:
|
||||||
# compiler key (which we don't use anyway). This is worked around for now by
|
- os: linux
|
||||||
# replacing the "compilers" with a build name prefixed by the no-op ":"
|
|
||||||
# command. See: https://github.com/travis-ci/travis-ci/issues/4393
|
|
||||||
# - sudo/dist/group are set so as to get Blue Box VMs, necessary for [loopback]
|
|
||||||
# IPv6 support
|
|
||||||
|
|
||||||
sudo: required
|
sudo: required
|
||||||
dist: precise
|
dist: trusty
|
||||||
group: legacy
|
language: c
|
||||||
|
env: TARGET=linux
|
||||||
os: linux
|
- os: linux
|
||||||
language: cpp
|
sudo: required
|
||||||
compiler: gcc
|
dist: trusty
|
||||||
env:
|
language: c
|
||||||
global:
|
env: TARGET=windows
|
||||||
- MAKEJOBS=-j3
|
- os: osx
|
||||||
- RUN_TESTS=false
|
language: c
|
||||||
- CHECK_DOC=0
|
osx_image: xcode7.3
|
||||||
- BOOST_TEST_RANDOM=1$TRAVIS_BUILD_ID
|
env: TARGET=osx
|
||||||
- CCACHE_SIZE=100M
|
|
||||||
- CCACHE_TEMPDIR=/tmp/.ccache-temp
|
|
||||||
- CCACHE_COMPRESS=1
|
|
||||||
- BASE_OUTDIR=$TRAVIS_BUILD_DIR/out
|
|
||||||
- SDK_URL=https://bitcoincore.org/depends-sources/sdks
|
|
||||||
- PYTHON_DEBUG=1
|
|
||||||
- WINEDEBUG=fixme-all
|
|
||||||
cache:
|
cache:
|
||||||
apt: true
|
apt: true
|
||||||
|
ccache: true
|
||||||
directories:
|
directories:
|
||||||
|
- build
|
||||||
- depends/built
|
- depends/built
|
||||||
- depends/sdk-sources
|
before_install:
|
||||||
- $HOME/.ccache
|
- date +%s > "${TRAVIS_BUILD_DIR}/start_time"
|
||||||
matrix:
|
- ls -lh build
|
||||||
fast_finish: true
|
- du -h -d 2 build
|
||||||
include:
|
- if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew update; fi
|
||||||
- compiler: ": ARM"
|
- if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew install ccache; fi
|
||||||
env: HOST=arm-linux-gnueabihf PACKAGES="g++-arm-linux-gnueabihf" DEP_OPTS="NO_QT=1" CHECK_DOC=1 GOAL="install" BITCOIN_CONFIG="--enable-glibc-back-compat --enable-reduce-exports"
|
- if [ "$TRAVIS_OS_NAME" == "osx" ]; then export PATH="/usr/local/opt/ccache/libexec:$PATH"; fi
|
||||||
- compiler: ": Win32"
|
install: true
|
||||||
env: HOST=i686-w64-mingw32 PPA="ppa:ubuntu-wine/ppa" PACKAGES="nsis gcc-mingw-w64-i686 g++-mingw-w64-i686 binutils-mingw-w64-i686 mingw-w64-dev wine1.7 bc" RUN_TESTS=true GOAL="deploy" BITCOIN_CONFIG="--enable-gui --enable-reduce-exports" MAKEJOBS="-j2"
|
|
||||||
- compiler: ": 32-bit + dash"
|
|
||||||
env: HOST=i686-pc-linux-gnu PACKAGES="g++-multilib bc python-zmq" PPA="ppa:chris-lea/zeromq" RUN_TESTS=true GOAL="install" BITCOIN_CONFIG="--enable-zmq --enable-glibc-back-compat --enable-reduce-exports LDFLAGS=-static-libstdc++" USE_SHELL="/bin/dash"
|
|
||||||
- compiler: ": Win64"
|
|
||||||
env: HOST=x86_64-w64-mingw32 PPA="ppa:ubuntu-wine/ppa" PACKAGES="nsis gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64 binutils-mingw-w64-x86-64 mingw-w64-dev wine1.7 bc" RUN_TESTS=true GOAL="deploy" BITCOIN_CONFIG="--enable-gui --enable-reduce-exports" MAKEJOBS="-j2"
|
|
||||||
- compiler: ": bitcoind"
|
|
||||||
env: HOST=x86_64-unknown-linux-gnu PACKAGES="bc python-zmq" PPA="ppa:chris-lea/zeromq" DEP_OPTS="NO_QT=1 NO_UPNP=1 DEBUG=1" RUN_TESTS=true GOAL="install" BITCOIN_CONFIG="--enable-zmq --enable-glibc-back-compat --enable-reduce-exports CPPFLAGS=-DDEBUG_LOCKORDER"
|
|
||||||
- compiler: ": No wallet"
|
|
||||||
env: HOST=x86_64-unknown-linux-gnu DEP_OPTS="NO_WALLET=1" RUN_TESTS=true GOAL="install" BITCOIN_CONFIG="--enable-glibc-back-compat --enable-reduce-exports"
|
|
||||||
- compiler: ": Cross-Mac"
|
|
||||||
env: HOST=x86_64-apple-darwin11 PACKAGES="cmake imagemagick libcap-dev librsvg2-bin libz-dev libbz2-dev libtiff-tools python-dev" BITCOIN_CONFIG="--enable-reduce-exports" OSX_SDK=10.9 GOAL="deploy"
|
|
||||||
exclude:
|
|
||||||
- compiler: gcc
|
|
||||||
install:
|
|
||||||
- if [ -n "$PACKAGES" ]; then sudo rm -f /etc/apt/sources.list.d/travis_ci_zeromq3-source.list; fi
|
|
||||||
- if [ -n "$PPA" ]; then travis_retry sudo add-apt-repository "$PPA" -y; fi
|
|
||||||
- if [ -n "$PACKAGES" ]; then travis_retry sudo apt-get update; fi
|
|
||||||
- if [ -n "$PACKAGES" ]; then travis_retry sudo apt-get install --no-install-recommends --no-upgrade -qq $PACKAGES; fi
|
|
||||||
before_script:
|
|
||||||
- unset CC; unset CXX
|
|
||||||
- if [ "$CHECK_DOC" = 1 ]; then contrib/devtools/check-doc.py; fi
|
|
||||||
- mkdir -p depends/SDKs depends/sdk-sources
|
|
||||||
- if [ -n "$OSX_SDK" -a ! -f depends/sdk-sources/MacOSX${OSX_SDK}.sdk.tar.gz ]; then curl --location --fail $SDK_URL/MacOSX${OSX_SDK}.sdk.tar.gz -o depends/sdk-sources/MacOSX${OSX_SDK}.sdk.tar.gz; fi
|
|
||||||
- if [ -n "$OSX_SDK" -a -f depends/sdk-sources/MacOSX${OSX_SDK}.sdk.tar.gz ]; then tar -C depends/SDKs -xf depends/sdk-sources/MacOSX${OSX_SDK}.sdk.tar.gz; fi
|
|
||||||
- make $MAKEJOBS -C depends HOST=$HOST $DEP_OPTS
|
|
||||||
script:
|
script:
|
||||||
- export TRAVIS_COMMIT_LOG=`git log --format=fuller -1`
|
- mkdir -p "dist/${TRAVIS_BRANCH}"
|
||||||
- if [ -n "$USE_SHELL" ]; then export CONFIG_SHELL="$USE_SHELL"; fi
|
- if [[ "${TARGET}" == "osx" ]]; then ./reproducible_build.sh -t -o -c; fi
|
||||||
- OUTDIR=$BASE_OUTDIR/$TRAVIS_PULL_REQUEST/$TRAVIS_JOB_NUMBER-$HOST
|
- if [[ "${TARGET}" == "linux" ]]; then ./reproducible_build.sh -t -o -c -f; fi
|
||||||
- BITCOIN_CONFIG_ALL="--disable-dependency-tracking --prefix=$TRAVIS_BUILD_DIR/depends/$HOST --bindir=$OUTDIR/bin --libdir=$OUTDIR/lib"
|
- if [[ "${TARGET}" == "windows" ]]; then ./packaging/build_windows.sh; fi
|
||||||
- depends/$HOST/native/bin/ccache --max-size=$CCACHE_SIZE
|
- if [[ "${TARGET}" == "osx" ]]; then zip -j "dist/${TRAVIS_BRANCH}/lbrycrd-${TARGET}.zip" src/lbrycrdd src/lbrycrd-cli src/lbrycrd-tx; fi
|
||||||
- if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then export CCACHE_READONLY=1; fi
|
- if [[ "${TARGET}" == "linux" ]]; then zip -j "dist/${TRAVIS_BRANCH}/lbrycrd-${TARGET}.zip" src/lbrycrdd src/lbrycrd-cli src/lbrycrd-tx; fi
|
||||||
- test -n "$USE_SHELL" && eval '"$USE_SHELL" -c "./autogen.sh"' || ./autogen.sh
|
- if [[ "${TARGET}" == "windows" ]]; then zip -j "dist/${TRAVIS_BRANCH}/lbrycrd-${TARGET}.zip" src/lbrycrdd.exe src/lbrycrd-cli.exe src/lbrycrd-tx.exe; fi
|
||||||
- ./configure --cache-file=config.cache $BITCOIN_CONFIG_ALL $BITCOIN_CONFIG || ( cat config.log && false)
|
- if [[ "${TARGET}" == "osx" ]]; then shasum -a 256 dist/${TRAVIS_BRANCH}/lbrycrd-${TARGET}.zip > dist/${TRAVIS_BRANCH}/lbrycrd-${TARGET}-sha256.txt; fi
|
||||||
- make distdir PACKAGE=bitcoin VERSION=$HOST
|
- if [[ "${TARGET}" == "linux" ]]; then sha256sum -b dist/${TRAVIS_BRANCH}/lbrycrd-${TARGET}.zip > dist/${TRAVIS_BRANCH}/lbrycrd-${TARGET}-sha256.txt; fi
|
||||||
- cd bitcoin-$HOST
|
- if [[ "${TARGET}" == "windows" ]]; then sha256sum -b dist/${TRAVIS_BRANCH}/lbrycrd-${TARGET}.zip > dist/${TRAVIS_BRANCH}/lbrycrd-${TARGET}-sha256.txt; fi
|
||||||
- ./configure --cache-file=../config.cache $BITCOIN_CONFIG_ALL $BITCOIN_CONFIG || ( cat config.log && false)
|
- cat dist/${TRAVIS_BRANCH}/lbrycrd-${TARGET}-sha256.txt
|
||||||
- make $MAKEJOBS $GOAL || ( echo "Build failure. Verbose build follows." && make $GOAL V=1 ; false )
|
before_cache:
|
||||||
- export LD_LIBRARY_PATH=$TRAVIS_BUILD_DIR/depends/$HOST/lib
|
- ls -lh build
|
||||||
- if [ "$RUN_TESTS" = "true" ]; then make check; fi
|
- du -h -d 2 build
|
||||||
- if [ "$RUN_TESTS" = "true" ]; then qa/pull-tester/rpc-tests.py --coverage; fi
|
deploy:
|
||||||
after_script:
|
- provider: releases
|
||||||
- echo $TRAVIS_COMMIT_RANGE
|
draft: true
|
||||||
- echo $TRAVIS_COMMIT_LOG
|
file: "dist/${TRAVIS_BRANCH}/lbrycrd-${TARGET}.zip"
|
||||||
- if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then (echo "Upload goes here. Something like: scp -r $BASE_OUTDIR server" || echo "upload failed"); fi
|
name: "${TRAVIS_BRANCH}"
|
||||||
|
skip_cleanup: true
|
||||||
|
target_commitish: $TRAVIS_COMMIT
|
||||||
|
tag_name: $TRAVIS_TAG
|
||||||
|
on:
|
||||||
|
tags: true
|
||||||
|
api_key:
|
||||||
|
secure: "Ni5WZNR5CefWXpyDUQLMQbQ2LH4Iot+0SqIoM9c4maW06al1M8vu57vWuj2cESsW7JsaBehCE45Cwmo5kWyEjAiZY8sIMmvixkMP/8uPWuLgNmnIbm7U+d0j652DmZshDYtt8EomqV2RhAx/rmBnzGkruLOw9WTp9ZdBN3WbTt/IpZ2gMgVbGWYGOx+uRw7/yGw8m4gShQheto/dycbyyR3XV2WP9wuLmNYkcQ6JumSoQdDWXcvVfbCwylGq2sLDKwhvfTr4iwYyYsWdmhfdEQl0WcIv5C8xgdiY2vzhi2LmLqFbS/fvKNC26Tfo4bOHFG/eOnvqc+yyEB8B/xqW9Gs+A0TUh/3N30vHYZGcpiDU35DwAN5bZ1+s+mr/ZrNzBJ5BgT8io3g0Ko8gykbDvFQVpg7kxFsqA1YCikEpG86lVGk6clTa5guJvAHse+DfnbWO1nfDxYQXW0md861m0txk8RpTC/TVNyH/lL/vsS7LB67EHhRdZY+O1+5sUGMdtvvhMoxJYCwQGpLkh43KRsKynkMUR94w2O9hc8cknXdV3wrndVz00XNdcur6y4D7HTll1tBrF68CA2yKUSY5hsjtPmdlN+DW8ou/rJiKOpQZ/Xzp69AQEheOFfDPItxQRYxWj0dMOk8eszf0wFvi1N7J/hT/IHnuX5ITfa/T4NE="
|
||||||
|
- provider: s3
|
||||||
|
access_key_id: AKIAICKFHNTR5RITASAQ
|
||||||
|
secret_access_key:
|
||||||
|
secure: Qfgs8vGnEUvgiZNP2S9zY8qHEzaDOceF/XTv32jRBOISWfTqOTE56DZbOp8WKHPAqn0dx04jKA1NfV9f06sXU1NVbiJ2VYISo6XAk0n3RBJL3/mhNxvut/zM2DHkFPljWTkWEColS0ZyA3m4eUyJvAw/i+mOBT/zDD/oIlS5Uo5l/x3LmF9fYBuei0ucwSQeNOr2wCMIl+pXrIU7B3lEzXh1asayW6A9y7DOqMLnrSQ7TLlSssbnhuhDVpFx0xxX/U2NPraotbGKdo3wwMbms/lluBe60I/LsDNp9/SZXMDXh2YLGUImr97octwpdzIMjF+kU7QAZJzM7grz8PU9+MQh2V5sn6Xsww2x4PdkmHGz/2FMzhrCrlPf5JCaPBH49G+w4/29HYmMrlimOOVx4qXCpQ/XtWWne/d6MF0qqT6JhdPuD9ohmTpxcHRkCe2fxUw6Yn3dj+/+YoCywAcwcBm5jLpAotmWoCmmcnm9rvB7bIuPPZAjJUZViCnyvwY4Tj3Fb+sOuK4b/O5D2+cuS+WgQRkN/RspYlXrXTIh8Efv/yhW5L9WdzG1OExJDw2hX5VTccRRgIKZxZp80U2eYqn2M07+1nU+ShX4kgiSon46k5cfacLgzLKWEyCxWSSTbsYcwRxvDEjtYy4wxAYx8+J3dgQPs/opDXoQTJMjud0=
|
||||||
|
bucket: build.lbry.io
|
||||||
|
upload-dir: lbrycrd
|
||||||
|
acl: public_read
|
||||||
|
local_dir: dist
|
||||||
|
skip_cleanup: true
|
||||||
|
on:
|
||||||
|
repo: lbryio/lbrycrd
|
||||||
|
all_branches: true
|
||||||
|
|
58
CMakeLists.txt
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
cmake_minimum_required(VERSION 3.7)
|
||||||
|
project(lbrycrd_clion) # Do not use for full compile. This is for CLion syntax checking only.
|
||||||
|
|
||||||
|
set (CMAKE_CXX_STANDARD 98) # 03 is not supported by cmake, but this will soon be 11 (after upstream bitcoin merge)
|
||||||
|
# I thought that setting the standard would disable the clang-tidy c++11 tips; nope.
|
||||||
|
|
||||||
|
if(EXISTS "build/boost")
|
||||||
|
set(BOOST_ROOT "build/boost" CACHE PATH "Boost library path")
|
||||||
|
set(Boost_NO_SYSTEM_PATHS on CACHE BOOL "Do not search system for Boost")
|
||||||
|
endif()
|
||||||
|
find_package(Boost REQUIRED COMPONENTS filesystem program_options thread chrono locale)
|
||||||
|
|
||||||
|
file(GLOB sources
|
||||||
|
src/*.h src/*.cpp
|
||||||
|
src/wallet/*.h src/wallet/*.cpp
|
||||||
|
src/support/*.h src/support/*.cpp src/support/allocators/*.h
|
||||||
|
src/script/*.h src/script/*.cpp
|
||||||
|
src/rpc/*.h src/rpc/*.cpp
|
||||||
|
src/primitives/*.h src/primitives/*.cpp
|
||||||
|
src/policy/*.h src/policy/*.cpp
|
||||||
|
src/crypto/*.h src/crypto/*.cpp
|
||||||
|
src/consensus/*.h src/consensus/*.cpp
|
||||||
|
src/compat/*.h src/compat/*.cpp
|
||||||
|
)
|
||||||
|
list(FILTER sources EXCLUDE REGEX "src/bitcoin*.cpp$")
|
||||||
|
|
||||||
|
include_directories(${Boost_INCLUDE_DIRS}
|
||||||
|
build/bdb/include
|
||||||
|
build/libevent/include
|
||||||
|
build/openssl/include
|
||||||
|
src/support/allocators
|
||||||
|
src/support
|
||||||
|
src/rpc
|
||||||
|
src/policy
|
||||||
|
src/wallet src/script
|
||||||
|
src/leveldb/helpers/memenv
|
||||||
|
src/leveldb/include
|
||||||
|
src/config
|
||||||
|
src/crypto
|
||||||
|
src/compat
|
||||||
|
src/obj
|
||||||
|
src/univalue/include
|
||||||
|
src/secp256k1/include
|
||||||
|
src/
|
||||||
|
)
|
||||||
|
|
||||||
|
add_compile_definitions(HAVE_CONFIG_H)
|
||||||
|
|
||||||
|
add_executable(lbrycrd-cli src/bitcoin-cli.cpp ${sources})
|
||||||
|
add_executable(lbrycrd-tx src/bitcoin-tx.cpp ${sources})
|
||||||
|
add_executable(lbrycrdd src/bitcoind.cpp ${sources})
|
||||||
|
|
||||||
|
file(GLOB tests src/test/*.cpp)
|
||||||
|
foreach(test ${tests})
|
||||||
|
get_filename_component(filename ${test} NAME_WE)
|
||||||
|
add_executable(${filename} ${test} ${sources})
|
||||||
|
target_include_directories(${filename} PRIVATE src/test)
|
||||||
|
endforeach(test)
|
5
INSTALL
|
@ -1,5 +0,0 @@
|
||||||
Building Bitcoin
|
|
||||||
|
|
||||||
See doc/build-*.md for instructions on building bitcoind,
|
|
||||||
the intended-for-services, no-graphical-interface, reference
|
|
||||||
implementation of Bitcoin.
|
|
15
LICENSE
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2015-2018 LBRY Inc
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the
|
||||||
|
"Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the
|
||||||
|
following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 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.
|
127
README.md
|
@ -1,82 +1,95 @@
|
||||||
Bitcoin Core integration/staging tree
|
# LBRYcrd - The LBRY blockchain
|
||||||
=====================================
|
|
||||||
|
|
||||||
[![Build Status](https://travis-ci.org/bitcoin/bitcoin.svg?branch=master)](https://travis-ci.org/bitcoin/bitcoin)
|
![alt text](lbrycrdd_daemon_screenshot.png "lbrycrdd daemon screenshot")
|
||||||
|
|
||||||
https://bitcoincore.org
|
LBRYcrd uses a blockchain similar to bitcoin's to implement an index and payment system for content on the LBRY network. It is a fork of bitcoin core.
|
||||||
|
|
||||||
What is Bitcoin?
|
## Installation
|
||||||
----------------
|
|
||||||
|
|
||||||
Bitcoin is an experimental new digital currency that enables instant payments to
|
Latest binaries are available from https://github.com/lbryio/lbrycrd/releases. There is no installation procedure, the binaries run as is.
|
||||||
anyone, anywhere in the world. Bitcoin uses peer-to-peer technology to operate
|
|
||||||
with no central authority: managing transactions and issuing money are carried
|
|
||||||
out collectively by the network. Bitcoin Core is the name of open source
|
|
||||||
software which enables the use of this currency.
|
|
||||||
|
|
||||||
For more information, as well as an immediately useable, binary version of
|
## Usage
|
||||||
the Bitcoin Core software, see https://bitcoin.org/en/download, or read the
|
|
||||||
[original whitepaper](https://bitcoincore.org/bitcoin.pdf).
|
|
||||||
|
|
||||||
License
|
The `lbrycrdd` executable will start a LBRYcrd node and connect you to the LBRYcrd network. Use the `lbrycrd-cli` executable
|
||||||
-------
|
to interact with lbrycrdd through the command line. Help pages for both executable are available through
|
||||||
|
the "--help" flag (e.g. `lbrycrd-cli --help`).
|
||||||
|
|
||||||
Bitcoin Core is released under the terms of the MIT license. See [COPYING](COPYING) for more
|
### Example Usage
|
||||||
information or see https://opensource.org/licenses/MIT.
|
|
||||||
|
|
||||||
Development Process
|
Run `./lbrycrdd -server -daemon` to start lbrycrdd in the background.
|
||||||
-------------------
|
|
||||||
|
Run `./lbrycrd-cli getinfo` to check for some basic informations about your LBRYcrd node.
|
||||||
|
|
||||||
|
Run `./lbrycrd-cli help` to get a list of all commands that you can run. To get help on specific commands run `./lbrycrd-cli [command_name] help`
|
||||||
|
|
||||||
|
### Data directory
|
||||||
|
|
||||||
|
Lbrycrdd will use the below default data directories
|
||||||
|
|
||||||
|
Windows < Vista: C:\Documents and Settings\Username\Application Data\lbrycrd
|
||||||
|
|
||||||
|
Windows >= Vista: C:\Users\Username\AppData\Roaming\lbrycrd
|
||||||
|
|
||||||
|
Mac: ~/Library/Application Support/lbrycrd
|
||||||
|
|
||||||
|
Unix: ~/.lbrycrd
|
||||||
|
|
||||||
|
The data directory contains various things such as your default wallet (wallet.dat), debug logs (debug.log), and blockchain data. You can optionally
|
||||||
|
create a configuration file lbrycrd.conf in the default data directory which will be used by default when running lbrycrdd.
|
||||||
|
For a list of configuration parameters run `./lbrycrdd --help`. Below is a sample lbrycrd.conf to enable JSON RPC server on lbrycrdd.
|
||||||
|
|
||||||
|
```rpcuser=lbry
|
||||||
|
rpcpassword=xyz123456790
|
||||||
|
daemon=1
|
||||||
|
server=1
|
||||||
|
txindex=1
|
||||||
|
```
|
||||||
|
|
||||||
|
## Running from Source
|
||||||
|
|
||||||
|
Run `./reproducible_build.sh -c -t`. This will build the binaries and put them into the `./src` directory.
|
||||||
|
|
||||||
|
If you encounter any errors, please check `doc/build-*.md` for further instructions. If you're still stuck, [create an issue](https://github.com/lbryio/lbrycrd/issues/new) with the output of that command, your system info, and any other information you think might be helpful.
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
Contributions to this project are welcome, encouraged, and compensated. For more details, see [lbry.io/faq/contributing](https://lbry.io/faq/contributing)
|
||||||
|
|
||||||
|
The codebase is in C++03, C++11 is currently not supported but we will be migrating to it in the near future. Recommended GCC version is 4.8 or greater.
|
||||||
|
We follow the same coding guidelines as documented by Bitcoin Core, see [here](/doc/developer-notes.md). To run an automated code formatting check, try:
|
||||||
|
`git diff -U0 master -- '*.h' '*.cpp' | ./contrib/devtools/clang-format-diff.py -p1`. This will check any commits not on master for proper code formatting.
|
||||||
|
We try to avoid altering parts of the code that is inherited from Bitcoin Core unless absolutely necessary. This will make it easier to merge changes from
|
||||||
|
Bitcoin Core. If commits are expected not to be merged upstream (i.e. we broke up a commit from Bitcoin Core in order to use a single feature in it), the commit
|
||||||
|
message must contain the string "NOT FOR UPSTREAM MERGE".
|
||||||
|
|
||||||
The `master` branch is regularly built and tested, but is not guaranteed to be
|
The `master` branch is regularly built and tested, but is not guaranteed to be
|
||||||
completely stable. [Tags](https://github.com/bitcoin/bitcoin/tags) are created
|
completely stable. [Releases](https://github.com/lbryio/lbrycrd/releases) are created
|
||||||
regularly to indicate new official, stable release versions of Bitcoin Core.
|
regularly to indicate new official, stable release versions.
|
||||||
|
|
||||||
The contribution workflow is described in [CONTRIBUTING.md](CONTRIBUTING.md).
|
|
||||||
|
|
||||||
The developer [mailing list](https://lists.linuxfoundation.org/mailman/listinfo/bitcoin-dev)
|
|
||||||
should be used to discuss complicated or controversial changes before working
|
|
||||||
on a patch set.
|
|
||||||
|
|
||||||
Developer IRC can be found on Freenode at #bitcoin-core-dev.
|
|
||||||
|
|
||||||
Testing
|
|
||||||
-------
|
|
||||||
|
|
||||||
Testing and code review is the bottleneck for development; we get more pull
|
Testing and code review is the bottleneck for development; we get more pull
|
||||||
requests than we can review and test on short notice. Please be patient and help out by testing
|
requests than we can review and test on short notice. Please be patient and help out by testing
|
||||||
other people's pull requests, and remember this is a security-critical project where any mistake might cost people
|
other people's pull requests, and remember this is a security-critical project where any mistake might cost people
|
||||||
lots of money.
|
lots of money. Developers are strongly encouraged to write [unit tests](/doc/unit-tests.md) for new code, and to
|
||||||
|
|
||||||
### Automated Testing
|
|
||||||
|
|
||||||
Developers are strongly encouraged to write [unit tests](/doc/unit-tests.md) for new code, and to
|
|
||||||
submit new unit tests for old code. Unit tests can be compiled and run
|
submit new unit tests for old code. Unit tests can be compiled and run
|
||||||
(assuming they weren't disabled in configure) with: `make check`
|
(assuming they weren't disabled in configure) with: `make check`
|
||||||
|
|
||||||
There are also [regression and integration tests](/qa) of the RPC interface, written
|
The Travis CI system makes sure that every pull request is built, and that unit and sanity tests are automatically run.
|
||||||
in Python, that are run automatically on the build server.
|
|
||||||
These tests can be run (if the [test dependencies](/qa) are installed) with: `qa/pull-tester/rpc-tests.py`
|
|
||||||
|
|
||||||
The Travis CI system makes sure that every pull request is built for Windows
|
### Testnet
|
||||||
and Linux, OS X, and that unit and sanity tests are automatically run.
|
|
||||||
|
|
||||||
### Manual Quality Assurance (QA) Testing
|
Testnet is maintained for testing purposes and can be accessed using the command `./lbrycrdd -testnet`. If you would like testnet credits, please contact kay@lbry.io or grin@lbry.io.
|
||||||
|
|
||||||
Changes should be tested by somebody other than the developer who wrote the
|
## License
|
||||||
code. This is especially important for large or high-risk changes. It is useful
|
|
||||||
to add a test plan to the pull request description if testing the changes is
|
|
||||||
not straightforward.
|
|
||||||
|
|
||||||
Translations
|
This project is MIT licensed. For the full license, see [LICENSE](LICENSE).
|
||||||
------------
|
|
||||||
|
|
||||||
Changes to translations as well as new translations can be submitted to
|
## Security
|
||||||
[Bitcoin Core's Transifex page](https://www.transifex.com/projects/p/bitcoin/).
|
|
||||||
|
|
||||||
Translations are periodically pulled from Transifex and merged into the git repository. See the
|
We take security seriously. Please contact security@lbry.io regarding any security issues.
|
||||||
[translation process](doc/translation_process.md) for details on how this works.
|
Our PGP key is [here](https://keybase.io/lbry/key.asc) if you need it.
|
||||||
|
|
||||||
|
## Contact
|
||||||
|
|
||||||
|
The primary contact for this project is [@kaykurokawa](https://github.com/kaykurokawa) (kay@lbry.io)
|
||||||
|
|
||||||
**Important**: We do not accept translation changes as GitHub pull requests because the next
|
|
||||||
pull from Transifex would automatically overwrite them again.
|
|
||||||
|
|
||||||
Translators should also subscribe to the [mailing list](https://groups.google.com/forum/#!forum/bitcoin-translators).
|
|
||||||
|
|
18
configure.ac
|
@ -2,22 +2,22 @@ dnl require autoconf 2.60 (AS_ECHO/AS_ECHO_N)
|
||||||
AC_PREREQ([2.60])
|
AC_PREREQ([2.60])
|
||||||
define(_CLIENT_VERSION_MAJOR, 0)
|
define(_CLIENT_VERSION_MAJOR, 0)
|
||||||
define(_CLIENT_VERSION_MINOR, 12)
|
define(_CLIENT_VERSION_MINOR, 12)
|
||||||
define(_CLIENT_VERSION_REVISION, 99)
|
define(_CLIENT_VERSION_REVISION, 2)
|
||||||
define(_CLIENT_VERSION_BUILD, 0)
|
define(_CLIENT_VERSION_BUILD, 3)
|
||||||
define(_CLIENT_VERSION_IS_RELEASE, false)
|
define(_CLIENT_VERSION_IS_RELEASE, true)
|
||||||
define(_COPYRIGHT_YEAR, 2016)
|
define(_COPYRIGHT_YEAR, 2016)
|
||||||
define(_COPYRIGHT_HOLDERS,[The %s developers])
|
define(_COPYRIGHT_HOLDERS,[The %s developers])
|
||||||
define(_COPYRIGHT_HOLDERS_SUBSTITUTION,[[Bitcoin Core]])
|
define(_COPYRIGHT_HOLDERS_SUBSTITUTION,[[LBRY]])
|
||||||
AC_INIT([Bitcoin Core],[_CLIENT_VERSION_MAJOR._CLIENT_VERSION_MINOR._CLIENT_VERSION_REVISION],[https://github.com/bitcoin/bitcoin/issues],[bitcoin],[https://bitcoincore.org/])
|
AC_INIT([LBRYcrd Core],[_CLIENT_VERSION_MAJOR._CLIENT_VERSION_MINOR._CLIENT_VERSION_REVISION],[https://github.com/lbryio/lbrycrd/issues],[lbrycrd],[https://lbry.io/])
|
||||||
AC_CONFIG_SRCDIR([src/main.cpp])
|
AC_CONFIG_SRCDIR([src/main.cpp])
|
||||||
AC_CONFIG_HEADERS([src/config/bitcoin-config.h])
|
AC_CONFIG_HEADERS([src/config/bitcoin-config.h])
|
||||||
AC_CONFIG_AUX_DIR([build-aux])
|
AC_CONFIG_AUX_DIR([build-aux])
|
||||||
AC_CONFIG_MACRO_DIR([build-aux/m4])
|
AC_CONFIG_MACRO_DIR([build-aux/m4])
|
||||||
|
|
||||||
BITCOIN_DAEMON_NAME=bitcoind
|
BITCOIN_DAEMON_NAME=lbrycrdd
|
||||||
BITCOIN_GUI_NAME=bitcoin-qt
|
BITCOIN_GUI_NAME=lbrycrd-qt
|
||||||
BITCOIN_CLI_NAME=bitcoin-cli
|
BITCOIN_CLI_NAME=lbrycrd-cli
|
||||||
BITCOIN_TX_NAME=bitcoin-tx
|
BITCOIN_TX_NAME=lbrycrd-tx
|
||||||
|
|
||||||
AC_CANONICAL_HOST
|
AC_CANONICAL_HOST
|
||||||
|
|
||||||
|
|
|
@ -12,21 +12,8 @@ import os
|
||||||
import sys
|
import sys
|
||||||
import subprocess
|
import subprocess
|
||||||
|
|
||||||
tested_versions = ['3.6.0', '3.6.1', '3.6.2'] # A set of versions known to produce the same output
|
|
||||||
accepted_file_extensions = ('.h', '.cpp') # Files to format
|
accepted_file_extensions = ('.h', '.cpp') # Files to format
|
||||||
|
|
||||||
def check_clang_format_version(clang_format_exe):
|
|
||||||
try:
|
|
||||||
output = subprocess.check_output([clang_format_exe, '-version'])
|
|
||||||
for ver in tested_versions:
|
|
||||||
if ver in output:
|
|
||||||
print "Detected clang-format version " + ver
|
|
||||||
return
|
|
||||||
raise RuntimeError("Untested version: " + output)
|
|
||||||
except Exception as e:
|
|
||||||
print 'Could not verify version of ' + clang_format_exe + '.'
|
|
||||||
raise e
|
|
||||||
|
|
||||||
def check_command_line_args(argv):
|
def check_command_line_args(argv):
|
||||||
required_args = ['{clang-format-exe}', '{files}']
|
required_args = ['{clang-format-exe}', '{files}']
|
||||||
example_args = ['clang-format-3.x', 'src/main.cpp', 'src/wallet/*']
|
example_args = ['clang-format-3.x', 'src/main.cpp', 'src/wallet/*']
|
||||||
|
@ -46,7 +33,7 @@ def run_clang_format(clang_format_exe, files):
|
||||||
for path, dirs, files in os.walk(target):
|
for path, dirs, files in os.walk(target):
|
||||||
run_clang_format(clang_format_exe, (os.path.join(path, f) for f in files))
|
run_clang_format(clang_format_exe, (os.path.join(path, f) for f in files))
|
||||||
elif target.endswith(accepted_file_extensions):
|
elif target.endswith(accepted_file_extensions):
|
||||||
print "Format " + target
|
print "Formatting " + target
|
||||||
subprocess.check_call([clang_format_exe, '-i', '-style=file', target], stdout=open(os.devnull, 'wb'), stderr=subprocess.STDOUT)
|
subprocess.check_call([clang_format_exe, '-i', '-style=file', target], stdout=open(os.devnull, 'wb'), stderr=subprocess.STDOUT)
|
||||||
else:
|
else:
|
||||||
print "Skip " + target
|
print "Skip " + target
|
||||||
|
@ -55,7 +42,6 @@ def main(argv):
|
||||||
check_command_line_args(argv)
|
check_command_line_args(argv)
|
||||||
clang_format_exe = argv[1]
|
clang_format_exe = argv[1]
|
||||||
files = argv[2:]
|
files = argv[2:]
|
||||||
check_clang_format_version(clang_format_exe)
|
|
||||||
run_clang_format(clang_format_exe, files)
|
run_clang_format(clang_format_exe, files)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
277
contrib/devtools/generate_json_api_jrgen.py
Executable file
|
@ -0,0 +1,277 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import re
|
||||||
|
import subprocess as sp
|
||||||
|
import sys
|
||||||
|
import json
|
||||||
|
import urllib.request as req
|
||||||
|
import jsonschema
|
||||||
|
|
||||||
|
|
||||||
|
re_full = re.compile(r'(?P<name>^.*?$)(?P<desc>.*?)(^Argument.*?$(?P<args>.*?))?(^Result[^\n,]*?:\s*$(?P<resl>.*?))?(^Exampl.*?$(?P<exmp>.*))?', re.DOTALL | re.MULTILINE)
|
||||||
|
re_argline = re.compile(r'^("?)(?P<name>\w.*?)\1(\s*:.+?,?\s*)?\s+\((?P<type>.*?)\)\s*(?P<desc>.*?)\s*$', re.DOTALL)
|
||||||
|
|
||||||
|
|
||||||
|
def get_obj_from_dirty_text(full_object: str):
|
||||||
|
lines = full_object.splitlines()
|
||||||
|
lefts = []
|
||||||
|
i = 0
|
||||||
|
while i < len(lines):
|
||||||
|
idx = lines[i].find('(')
|
||||||
|
left = lines[i][0:idx].strip() if idx >= 0 else lines[i]
|
||||||
|
left = left.rstrip('.') # handling , ...
|
||||||
|
left = left.strip()
|
||||||
|
left = left.rstrip(',')
|
||||||
|
lefts.append(left)
|
||||||
|
while idx >= 0 and i < len(lines) - 1:
|
||||||
|
idx2 = len(re.match(r'^\s*', lines[i + 1]).group())
|
||||||
|
if idx2 > idx:
|
||||||
|
lines[i] += lines.pop(i + 1)[idx2 - 1:]
|
||||||
|
else:
|
||||||
|
break
|
||||||
|
i += 1
|
||||||
|
|
||||||
|
ret = None
|
||||||
|
try:
|
||||||
|
property_stack = []
|
||||||
|
object_stack = []
|
||||||
|
name_stack = []
|
||||||
|
|
||||||
|
last_name = None
|
||||||
|
for i in range(0, len(lines)):
|
||||||
|
left = lefts[i]
|
||||||
|
if not left:
|
||||||
|
continue
|
||||||
|
line = lines[i].strip()
|
||||||
|
|
||||||
|
arg_parsed = re_argline.fullmatch(line)
|
||||||
|
property_refined_type = 'object'
|
||||||
|
if arg_parsed is not None:
|
||||||
|
property_name, property_type, property_desc = arg_parsed.group('name', 'type', 'desc')
|
||||||
|
property_refined_type, property_required, property_child = get_type(property_type, None)
|
||||||
|
|
||||||
|
if property_refined_type is not 'array' and property_refined_type is not 'object':
|
||||||
|
property_stack[-1][property_name] = {
|
||||||
|
'type': property_refined_type,
|
||||||
|
'description': property_desc
|
||||||
|
}
|
||||||
|
else:
|
||||||
|
last_name = property_name
|
||||||
|
elif len(left) > 1:
|
||||||
|
match = re.match(r'^(\[)?"(?P<name>\w.*?)"(\])?.*', left)
|
||||||
|
last_name = match.group('name')
|
||||||
|
if match.group(1) is not None and match.group(3) is not None:
|
||||||
|
left = '['
|
||||||
|
property_refined_type = 'string'
|
||||||
|
if 'string' not in line:
|
||||||
|
raise NotImplementedError('Not implemented: ' + line)
|
||||||
|
|
||||||
|
if left.endswith('['):
|
||||||
|
object_stack.append({'type': 'array', 'items': {'type': property_refined_type}})
|
||||||
|
property_stack.append({})
|
||||||
|
name_stack.append(last_name)
|
||||||
|
elif left.endswith('{'):
|
||||||
|
object_stack.append({'type': 'object'})
|
||||||
|
property_stack.append({})
|
||||||
|
name_stack.append(last_name)
|
||||||
|
elif (left.endswith(']') and '[' not in left) or (left.endswith('}') and '{' not in left):
|
||||||
|
obj = object_stack.pop()
|
||||||
|
prop = property_stack.pop()
|
||||||
|
name = name_stack.pop()
|
||||||
|
if len(prop) > 0:
|
||||||
|
if 'items' in obj:
|
||||||
|
obj['items']['properties'] = prop
|
||||||
|
else:
|
||||||
|
obj['properties'] = prop
|
||||||
|
if len(property_stack) > 0:
|
||||||
|
if 'items' in object_stack[-1]:
|
||||||
|
object_stack[-1]['items']['type'] = obj['type']
|
||||||
|
if len(prop) > 0:
|
||||||
|
object_stack[-1]['items']['properties'] = prop
|
||||||
|
else:
|
||||||
|
if name is None:
|
||||||
|
raise RuntimeError('Not expected')
|
||||||
|
property_stack[-1][name] = obj
|
||||||
|
else:
|
||||||
|
ret = obj
|
||||||
|
if ret is not None:
|
||||||
|
if i + 1 < len(lines) - 1:
|
||||||
|
print('Ignoring this data (below the parsed object): ' + "\n".join(lines[i+1:]), file=sys.stderr)
|
||||||
|
return ret
|
||||||
|
except Exception as e:
|
||||||
|
print('Exception: ' + str(e), file=sys.stderr)
|
||||||
|
print('Unable to cope with: ' + '\n'.join(lines), file=sys.stderr)
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def get_type(arg_type: str, full_line: str):
|
||||||
|
if arg_type is None:
|
||||||
|
return 'string', True, None
|
||||||
|
|
||||||
|
required = 'required' in arg_type or 'optional' not in arg_type
|
||||||
|
|
||||||
|
arg_type = arg_type.lower()
|
||||||
|
if 'array' in arg_type:
|
||||||
|
return 'array', required, None
|
||||||
|
if 'numeric' in arg_type:
|
||||||
|
return 'number', required, None
|
||||||
|
if 'bool' in arg_type:
|
||||||
|
return 'boolean', required, None
|
||||||
|
if 'string' in arg_type:
|
||||||
|
return 'string', required, None
|
||||||
|
if 'object' in arg_type:
|
||||||
|
properties = get_obj_from_dirty_text(full_line) if full_line is not None else None
|
||||||
|
return 'object', required, properties
|
||||||
|
|
||||||
|
print('Unable to derive type from: ' + arg_type, file=sys.stderr)
|
||||||
|
return None, False, None
|
||||||
|
|
||||||
|
|
||||||
|
def get_default(arg_refined_type: str, arg_type: str):
|
||||||
|
if 'default=' in arg_type:
|
||||||
|
if 'number' in arg_refined_type:
|
||||||
|
return int(re.match('.*default=([^,)]+)', arg_type).group(1))
|
||||||
|
if 'string' in arg_refined_type:
|
||||||
|
return re.match('.*default=([^,)]+)', arg_type).group(1)
|
||||||
|
if 'boolean' in arg_refined_type:
|
||||||
|
if 'default=true' in arg_type:
|
||||||
|
return True
|
||||||
|
if 'default=false' in arg_type:
|
||||||
|
return False
|
||||||
|
raise NotImplementedError('Not implemented: ' + arg_type)
|
||||||
|
if 'array' in arg_type:
|
||||||
|
raise NotImplementedError('Not implemented: ' + arg_type)
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def parse_single_argument(line: str):
|
||||||
|
if line:
|
||||||
|
line = line.strip()
|
||||||
|
if not line or line.startswith('None'):
|
||||||
|
return None, None, False
|
||||||
|
|
||||||
|
arg_parsed = re_argline.fullmatch(line)
|
||||||
|
if arg_parsed is None:
|
||||||
|
if line.startswith('{') or line.startswith('['):
|
||||||
|
return get_obj_from_dirty_text(line), None, True
|
||||||
|
else:
|
||||||
|
print("Unparsable argument: " + line, file=sys.stderr)
|
||||||
|
descriptor = {
|
||||||
|
'type': 'array' if line.startswith('[') else 'object',
|
||||||
|
'description': line,
|
||||||
|
}
|
||||||
|
return descriptor, None, True
|
||||||
|
|
||||||
|
arg_name, arg_type, arg_desc = arg_parsed.group('name', 'type', 'desc')
|
||||||
|
if not arg_type:
|
||||||
|
raise NotImplementedError('Not implemented: ' + arg_type)
|
||||||
|
arg_refined_type, arg_required, arg_properties = get_type(arg_type, arg_desc)
|
||||||
|
|
||||||
|
if arg_properties is not None:
|
||||||
|
return arg_properties, arg_name, arg_required
|
||||||
|
|
||||||
|
arg_refined_default = get_default(arg_refined_type, arg_type)
|
||||||
|
arg_desc = re.sub('\s+', ' ', arg_desc.strip()) \
|
||||||
|
if arg_desc and arg_refined_type is not 'object' and arg_refined_type is not 'array' \
|
||||||
|
else arg_desc.strip() if arg_desc else ''
|
||||||
|
|
||||||
|
descriptor = {
|
||||||
|
'type': arg_refined_type,
|
||||||
|
'description': arg_desc,
|
||||||
|
}
|
||||||
|
if arg_refined_default is not None:
|
||||||
|
descriptor['default'] = arg_refined_default
|
||||||
|
return descriptor, arg_name, arg_required
|
||||||
|
|
||||||
|
|
||||||
|
def parse_params(args: str):
|
||||||
|
arguments = {}
|
||||||
|
requireds = []
|
||||||
|
if args:
|
||||||
|
for line in re.split('\s*\d+\.\s+', args, re.DOTALL):
|
||||||
|
descriptor, name, required = parse_single_argument(line)
|
||||||
|
if descriptor is None:
|
||||||
|
continue
|
||||||
|
if required:
|
||||||
|
requireds.append(name)
|
||||||
|
arguments[name] = descriptor
|
||||||
|
return arguments, requireds
|
||||||
|
|
||||||
|
|
||||||
|
def get_api(section_name: str, command: str, command_help: str):
|
||||||
|
|
||||||
|
parsed = re_full.fullmatch(command_help)
|
||||||
|
if parsed is None:
|
||||||
|
raise RuntimeError('Unable to resolve help format for ' + command)
|
||||||
|
|
||||||
|
name, desc, args, resl, exmp = parsed.group('name', 'desc', 'args', 'resl', 'exmp')
|
||||||
|
|
||||||
|
properties, required = parse_params(args)
|
||||||
|
result_descriptor, result_name, result_required = parse_single_argument(resl)
|
||||||
|
|
||||||
|
desc = re.sub('\s+', ' ', desc.strip()) if desc else name
|
||||||
|
example_array = exmp.splitlines() if exmp else []
|
||||||
|
|
||||||
|
ret = {
|
||||||
|
'summary': desc,
|
||||||
|
'description': example_array,
|
||||||
|
'tags': [section_name],
|
||||||
|
'params': {
|
||||||
|
'type': 'object',
|
||||||
|
'properties': properties,
|
||||||
|
'required': required
|
||||||
|
},
|
||||||
|
}
|
||||||
|
if result_descriptor is not None:
|
||||||
|
ret['result'] = result_descriptor
|
||||||
|
return ret
|
||||||
|
|
||||||
|
|
||||||
|
def write_api():
|
||||||
|
if len(sys.argv) < 2:
|
||||||
|
print("Missing required argument: <path to CLI tool>", file=sys.stderr)
|
||||||
|
sys.exit(1)
|
||||||
|
cli_tool = sys.argv[1]
|
||||||
|
result = sp.run([cli_tool, "help"], stdout=sp.PIPE, universal_newlines=True)
|
||||||
|
commands = result.stdout
|
||||||
|
sections = re.split('^==\s*(.*?)\s*==$', commands, flags=re.MULTILINE)
|
||||||
|
methods = {}
|
||||||
|
for section in sections:
|
||||||
|
if not section:
|
||||||
|
continue
|
||||||
|
lines = section.splitlines()
|
||||||
|
if len(lines) == 1:
|
||||||
|
section_name = lines[0]
|
||||||
|
continue
|
||||||
|
for command in sorted(lines[1:]):
|
||||||
|
if not command:
|
||||||
|
continue
|
||||||
|
command = command.split(' ')[0]
|
||||||
|
result = sp.run([cli_tool, "help", command], stdout=sp.PIPE, universal_newlines=True)
|
||||||
|
methods[command] = get_api(section_name, command, result.stdout)
|
||||||
|
|
||||||
|
version = sp.run([cli_tool, "--version"], stdout=sp.PIPE, universal_newlines=True)
|
||||||
|
wrapper = {
|
||||||
|
'$schema': 'https://rawgit.com/mzernetsch/jrgen/master/jrgen-spec.schema.json',
|
||||||
|
'jrgen': '1.1',
|
||||||
|
'jsonrpc': '1.0', # see https://github.com/bitcoin/bitcoin/pull/12435
|
||||||
|
'info': {
|
||||||
|
'title': 'lbrycrd RPC API',
|
||||||
|
'version': version.stdout.strip(),
|
||||||
|
'description': []
|
||||||
|
},
|
||||||
|
'definitions': {}, # for items used in $ref further down
|
||||||
|
'methods': methods,
|
||||||
|
}
|
||||||
|
|
||||||
|
schema = req.urlopen(wrapper['$schema']).read().decode('utf-8')
|
||||||
|
try:
|
||||||
|
jsonschema.validate(wrapper, schema)
|
||||||
|
except Exception as e:
|
||||||
|
print('From schema validation: ' + str(e), file=sys.stderr)
|
||||||
|
|
||||||
|
print(json.dumps(wrapper, indent=4))
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
write_api()
|
106
contrib/devtools/generate_json_api_v1.py
Executable file
|
@ -0,0 +1,106 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import re
|
||||||
|
import subprocess as sp
|
||||||
|
import sys
|
||||||
|
import json
|
||||||
|
|
||||||
|
re_full = re.compile(r'(?P<name>^.*?$)(?P<desc>.*?)(^Argument.*?$(?P<args>.*?))?(^Result[^\n]*?:\s*$(?P<resl>.*?))?(^Exampl.*?$(?P<exmp>.*))?', re.DOTALL | re.MULTILINE)
|
||||||
|
re_argline = re.compile(r'^("?)(?P<name>.*?)\1\s+\((?P<type>.*?)\)\s*(?P<desc>.*)$', re.DOTALL)
|
||||||
|
|
||||||
|
|
||||||
|
def get_type(arg_type, full_line):
|
||||||
|
if arg_type is None:
|
||||||
|
return 'string'
|
||||||
|
|
||||||
|
arg_type = arg_type.lower()
|
||||||
|
if 'numeric' in arg_type:
|
||||||
|
return 'number'
|
||||||
|
if 'bool' in arg_type:
|
||||||
|
return 'boolean'
|
||||||
|
if 'string' in arg_type:
|
||||||
|
return 'string'
|
||||||
|
if 'object' in arg_type:
|
||||||
|
return 'object'
|
||||||
|
|
||||||
|
raise Exception('Not implemented: ' + arg_type)
|
||||||
|
|
||||||
|
|
||||||
|
def parse_params(args):
|
||||||
|
arguments = []
|
||||||
|
if args:
|
||||||
|
for line in re.split('\s*\d+\.\s+', args, re.DOTALL):
|
||||||
|
if not line or not line.strip() or line.strip().startswith('None'):
|
||||||
|
continue
|
||||||
|
arg_parsed = re_argline.fullmatch(line)
|
||||||
|
if arg_parsed is None:
|
||||||
|
raise Exception("Unparsable argument: " + line)
|
||||||
|
arg_name, arg_type, arg_desc = arg_parsed.group('name', 'type', 'desc')
|
||||||
|
if not arg_type:
|
||||||
|
raise Exception('Not implemented: ' + arg_type)
|
||||||
|
arg_required = 'required' in arg_type or 'optional' not in arg_type
|
||||||
|
arg_refined_type = get_type(arg_type, line)
|
||||||
|
arg_desc = re.sub('\s+', ' ', arg_desc.strip()) if arg_desc else []
|
||||||
|
arguments.append({
|
||||||
|
'name': arg_name,
|
||||||
|
'type': arg_refined_type,
|
||||||
|
'description': arg_desc,
|
||||||
|
'is_required': arg_required
|
||||||
|
})
|
||||||
|
return arguments
|
||||||
|
|
||||||
|
|
||||||
|
def get_api(section_name, command, command_help):
|
||||||
|
|
||||||
|
parsed = re_full.fullmatch(command_help)
|
||||||
|
if parsed is None:
|
||||||
|
raise Exception('Unable to resolve help format for ' + command)
|
||||||
|
|
||||||
|
name, desc, args, resl, exmp = parsed.group('name', 'desc', 'args', 'resl', 'exmp')
|
||||||
|
|
||||||
|
arguments = parse_params(args)
|
||||||
|
|
||||||
|
cmd_desc = re.sub('\s+', ' ', desc.strip()) if desc else ''
|
||||||
|
if exmp and '--skip_examples' not in sys.argv:
|
||||||
|
cmd_desc += '\nExamples:\n' + exmp.strip()
|
||||||
|
cmd_resl = resl.strip() if resl else None
|
||||||
|
|
||||||
|
ret = {
|
||||||
|
'name': command,
|
||||||
|
'namespace': section_name,
|
||||||
|
'description': cmd_desc,
|
||||||
|
'arguments': arguments,
|
||||||
|
}
|
||||||
|
if cmd_resl is not None:
|
||||||
|
ret['returns'] = cmd_resl
|
||||||
|
return ret
|
||||||
|
|
||||||
|
|
||||||
|
def write_api():
|
||||||
|
if len(sys.argv) < 2:
|
||||||
|
print("Missing required argument: <path to CLI tool>", file=sys.stderr)
|
||||||
|
sys.exit(1)
|
||||||
|
cli_tool = sys.argv[1]
|
||||||
|
result = sp.run([cli_tool, "help"], stdout=sp.PIPE, universal_newlines=True)
|
||||||
|
commands = result.stdout
|
||||||
|
sections = re.split('^==\s*(.*?)\s*==$', commands, flags=re.MULTILINE)
|
||||||
|
apis = []
|
||||||
|
for section in sections:
|
||||||
|
if not section:
|
||||||
|
continue
|
||||||
|
lines = section.splitlines()
|
||||||
|
if len(lines) == 1:
|
||||||
|
section_name = lines[0]
|
||||||
|
continue
|
||||||
|
for command in sorted(lines[1:]):
|
||||||
|
if not command:
|
||||||
|
continue
|
||||||
|
command = command.split(' ')[0]
|
||||||
|
result = sp.run([cli_tool, "help", command], stdout=sp.PIPE, universal_newlines=True)
|
||||||
|
apis.append(get_api(section_name, command, result.stdout))
|
||||||
|
|
||||||
|
print(json.dumps(apis, indent=4))
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
write_api()
|
5118
contrib/devtools/generated/api_jrgen.json
Normal file
1853
contrib/devtools/generated/api_v1.json
Normal file
|
@ -1,937 +1,2 @@
|
||||||
5.2.145.201:8333
|
138.68.198.142:9246
|
||||||
5.22.142.214:8333
|
138.197.224.252:9246
|
||||||
5.53.172.197:8333
|
|
||||||
5.189.161.164:8333
|
|
||||||
5.230.140.166:8333
|
|
||||||
5.231.3.130:8333
|
|
||||||
5.255.80.103:8333
|
|
||||||
14.202.230.49:8333
|
|
||||||
18.85.11.130:8333
|
|
||||||
23.91.97.25:8333
|
|
||||||
23.94.100.122:8333
|
|
||||||
23.95.99.132:8333
|
|
||||||
24.115.8.206:8333
|
|
||||||
24.127.128.191:8333
|
|
||||||
24.154.178.25:8333
|
|
||||||
24.207.103.43:8333
|
|
||||||
24.207.104.105:8333
|
|
||||||
24.210.230.150:8333
|
|
||||||
24.224.18.84:8333
|
|
||||||
24.246.168.106:8333
|
|
||||||
27.254.64.47:8333
|
|
||||||
31.6.71.123:8333
|
|
||||||
31.6.71.124:8333
|
|
||||||
31.14.134.13:8333
|
|
||||||
31.30.36.220:8333
|
|
||||||
31.164.6.104:8333
|
|
||||||
31.170.106.203:8333
|
|
||||||
31.185.134.201:8333
|
|
||||||
31.204.128.99:8333
|
|
||||||
31.204.128.219:8333
|
|
||||||
37.1.219.88:8333
|
|
||||||
37.97.132.109:8333
|
|
||||||
37.120.160.55:8333
|
|
||||||
37.120.169.123:8333
|
|
||||||
37.139.32.46:8333
|
|
||||||
37.221.163.218:8333
|
|
||||||
38.130.192.72:8333
|
|
||||||
41.75.96.80:8333
|
|
||||||
45.3.0.49:8333
|
|
||||||
45.33.72.185:8333
|
|
||||||
45.33.96.129:8333
|
|
||||||
45.56.4.63:8333
|
|
||||||
45.79.0.127:8333
|
|
||||||
45.79.80.102:8333
|
|
||||||
45.79.97.30:8333
|
|
||||||
45.79.132.219:8333
|
|
||||||
46.21.97.135:8333
|
|
||||||
46.28.205.67:8333
|
|
||||||
46.28.206.188:8333
|
|
||||||
46.29.20.209:8333
|
|
||||||
46.50.234.179:8333
|
|
||||||
46.101.160.168:8333
|
|
||||||
46.166.161.35:8333
|
|
||||||
46.166.161.103:8333
|
|
||||||
46.182.132.100:8333
|
|
||||||
46.218.227.92:8333
|
|
||||||
46.226.109.20:8333
|
|
||||||
46.227.66.132:8333
|
|
||||||
46.227.66.138:8333
|
|
||||||
46.229.165.154:8333
|
|
||||||
46.229.165.155:8333
|
|
||||||
46.229.238.187:8333
|
|
||||||
46.234.104.48:8333
|
|
||||||
46.239.107.74:8333
|
|
||||||
46.244.0.138:8333
|
|
||||||
46.254.72.195:8333
|
|
||||||
50.5.13.44:8333
|
|
||||||
50.7.37.114:8333
|
|
||||||
50.30.37.103:8333
|
|
||||||
50.39.105.60:8333
|
|
||||||
50.106.40.231:8333
|
|
||||||
52.29.0.37:8333
|
|
||||||
52.76.192.246:8333
|
|
||||||
54.152.192.179:8333
|
|
||||||
54.169.64.174:8333
|
|
||||||
54.175.160.22:8333
|
|
||||||
54.199.128.0:8333
|
|
||||||
58.96.171.129:8333
|
|
||||||
58.161.238.57:8333
|
|
||||||
60.251.195.221:8333
|
|
||||||
61.35.225.19:8333
|
|
||||||
62.43.130.178:8333
|
|
||||||
62.65.39.12:8333
|
|
||||||
62.107.200.30:8333
|
|
||||||
62.133.194.2:8333
|
|
||||||
62.181.238.186:8333
|
|
||||||
62.183.22.50:8333
|
|
||||||
62.210.85.120:8333
|
|
||||||
62.210.162.89:8333
|
|
||||||
62.238.34.125:8333
|
|
||||||
64.25.171.73:8333
|
|
||||||
64.27.166.30:8333
|
|
||||||
64.53.137.101:8333
|
|
||||||
64.71.72.44:8333
|
|
||||||
64.83.225.146:8333
|
|
||||||
64.121.3.163:8333
|
|
||||||
64.203.102.86:8333
|
|
||||||
65.94.131.59:8333
|
|
||||||
65.188.136.233:8333
|
|
||||||
66.11.162.218:8333
|
|
||||||
66.23.228.133:8333
|
|
||||||
66.90.137.89:8333
|
|
||||||
66.114.33.49:8333
|
|
||||||
66.150.105.77:8333
|
|
||||||
66.172.10.4:8333
|
|
||||||
66.194.38.250:8333
|
|
||||||
66.194.38.253:8333
|
|
||||||
66.194.38.254:8333
|
|
||||||
66.231.97.172:8333
|
|
||||||
66.240.237.155:8333
|
|
||||||
67.159.13.34:8333
|
|
||||||
67.205.74.206:8333
|
|
||||||
67.221.193.55:8333
|
|
||||||
67.227.72.17:8333
|
|
||||||
68.65.120.53:8333
|
|
||||||
68.65.205.226:9000
|
|
||||||
68.144.4.34:8333
|
|
||||||
69.39.49.199:8333
|
|
||||||
69.50.171.205:8333
|
|
||||||
69.65.41.21:8333
|
|
||||||
69.113.98.61:8333
|
|
||||||
69.119.97.39:8333
|
|
||||||
69.146.70.124:8333
|
|
||||||
69.193.71.2:8333
|
|
||||||
70.46.10.237:8333
|
|
||||||
70.80.200.187:8333
|
|
||||||
70.185.97.117:8333
|
|
||||||
71.254.160.25:8333
|
|
||||||
72.28.203.5:8333
|
|
||||||
72.52.130.110:8333
|
|
||||||
72.83.194.122:8333
|
|
||||||
72.128.32.167:8333
|
|
||||||
72.179.136.80:8333
|
|
||||||
72.235.38.70:8333
|
|
||||||
74.50.44.193:8333
|
|
||||||
74.72.60.83:8333
|
|
||||||
74.80.234.116:8333
|
|
||||||
74.207.233.193:8333
|
|
||||||
75.112.233.128:8333
|
|
||||||
75.118.166.197:8333
|
|
||||||
75.140.0.241:8333
|
|
||||||
75.159.240.66:8333
|
|
||||||
75.174.5.26:8333
|
|
||||||
76.72.160.252:8333
|
|
||||||
76.72.160.254:8333
|
|
||||||
76.74.170.112:8333
|
|
||||||
76.79.201.54:8333
|
|
||||||
76.175.166.164:8333
|
|
||||||
76.179.105.27:8333
|
|
||||||
77.68.37.200:8333
|
|
||||||
77.234.49.196:8333
|
|
||||||
77.247.229.93:8333
|
|
||||||
78.24.72.78:8333
|
|
||||||
78.47.32.147:8333
|
|
||||||
78.84.100.95:8333
|
|
||||||
78.121.69.23:8333
|
|
||||||
78.129.167.5:8333
|
|
||||||
78.193.96.155:8333
|
|
||||||
79.19.37.179:8333
|
|
||||||
79.132.230.144:8333
|
|
||||||
79.133.43.63:8333
|
|
||||||
79.134.201.66:8333
|
|
||||||
79.169.35.235:8333
|
|
||||||
80.57.227.14:8333
|
|
||||||
80.64.65.87:8333
|
|
||||||
80.86.92.70:8333
|
|
||||||
80.100.203.151:8333
|
|
||||||
80.101.32.121:8333
|
|
||||||
80.161.178.73:8333
|
|
||||||
80.240.129.170:8333
|
|
||||||
81.7.11.50:8333
|
|
||||||
81.7.11.55:8333
|
|
||||||
81.17.17.40:9333
|
|
||||||
81.30.39.83:8333
|
|
||||||
81.90.36.7:9444
|
|
||||||
81.136.224.77:8333
|
|
||||||
81.162.231.211:8333
|
|
||||||
81.184.0.143:8333
|
|
||||||
81.198.128.86:8333
|
|
||||||
82.11.33.229:8333
|
|
||||||
82.79.128.134:8333
|
|
||||||
82.118.233.111:8333
|
|
||||||
82.135.139.30:8333
|
|
||||||
82.199.102.10:8333
|
|
||||||
82.221.106.17:8333
|
|
||||||
82.221.108.21:8333
|
|
||||||
82.221.108.27:8333
|
|
||||||
83.137.41.3:8333
|
|
||||||
83.142.197.168:8333
|
|
||||||
83.143.130.19:8333
|
|
||||||
83.150.9.196:8333
|
|
||||||
83.183.17.191:8333
|
|
||||||
83.227.173.83:8333
|
|
||||||
83.230.5.15:8333
|
|
||||||
83.233.105.151:443
|
|
||||||
83.246.75.8:8333
|
|
||||||
83.250.133.158:8333
|
|
||||||
83.255.66.118:8334
|
|
||||||
84.24.69.59:8333
|
|
||||||
84.42.193.6:8333
|
|
||||||
84.45.98.87:8333
|
|
||||||
84.54.128.11:8333
|
|
||||||
84.212.200.24:8333
|
|
||||||
84.215.198.109:8333
|
|
||||||
84.230.4.177:8333
|
|
||||||
85.95.228.83:8333
|
|
||||||
85.95.228.123:8333
|
|
||||||
85.114.128.134:8333
|
|
||||||
85.214.66.168:8333
|
|
||||||
85.214.147.162:8333
|
|
||||||
85.243.168.4:8333
|
|
||||||
86.1.0.18:8333
|
|
||||||
87.79.77.106:8333
|
|
||||||
87.91.156.110:8333
|
|
||||||
87.236.196.222:8333
|
|
||||||
88.85.75.152:8333
|
|
||||||
88.87.1.230:8333
|
|
||||||
88.87.92.102:8333
|
|
||||||
88.89.69.202:8333
|
|
||||||
88.97.72.229:8333
|
|
||||||
88.164.117.99:8333
|
|
||||||
88.198.32.131:8333
|
|
||||||
88.202.230.87:8333
|
|
||||||
88.214.193.154:8343
|
|
||||||
88.214.194.226:8343
|
|
||||||
89.10.155.88:8333
|
|
||||||
89.46.101.44:8333
|
|
||||||
89.163.224.212:8333
|
|
||||||
89.174.248.20:8333
|
|
||||||
89.202.231.198:8333
|
|
||||||
89.212.75.6:8333
|
|
||||||
90.149.38.172:8333
|
|
||||||
90.169.106.139:8333
|
|
||||||
91.64.101.150:8333
|
|
||||||
91.65.196.179:8333
|
|
||||||
91.121.80.17:8333
|
|
||||||
91.126.77.77:8333
|
|
||||||
91.145.76.156:8333
|
|
||||||
91.152.150.35:8333
|
|
||||||
91.192.137.17:8333
|
|
||||||
91.196.170.110:8333
|
|
||||||
91.197.44.133:8333
|
|
||||||
91.207.68.144:8333
|
|
||||||
91.210.105.28:8333
|
|
||||||
91.211.102.101:8333
|
|
||||||
91.211.106.34:8333
|
|
||||||
91.214.200.205:8333
|
|
||||||
91.220.43.146:8333
|
|
||||||
91.222.71.89:8333
|
|
||||||
91.224.140.242:8333
|
|
||||||
91.229.76.14:8333
|
|
||||||
92.27.7.209:8333
|
|
||||||
92.51.167.88:8333
|
|
||||||
92.247.229.163:8333
|
|
||||||
93.84.114.106:8333
|
|
||||||
93.113.36.172:8333
|
|
||||||
93.188.224.253:8333
|
|
||||||
94.75.239.69:8333
|
|
||||||
94.190.227.112:8333
|
|
||||||
94.214.2.74:8333
|
|
||||||
94.224.162.65:8333
|
|
||||||
94.236.198.253:8333
|
|
||||||
94.242.229.158:8333
|
|
||||||
95.84.138.99:8333
|
|
||||||
95.95.168.87:8333
|
|
||||||
95.110.234.93:8333
|
|
||||||
95.130.9.200:8333
|
|
||||||
95.165.168.168:8333
|
|
||||||
95.170.235.254:8333
|
|
||||||
95.211.130.154:8333
|
|
||||||
96.46.68.104:8333
|
|
||||||
96.127.202.148:8333
|
|
||||||
97.76.171.35:8333
|
|
||||||
98.160.160.67:8333
|
|
||||||
99.126.197.187:8333
|
|
||||||
99.198.173.1:8333
|
|
||||||
101.100.174.138:8333
|
|
||||||
101.164.201.208:8333
|
|
||||||
103.224.165.48:8333
|
|
||||||
104.128.225.223:8333
|
|
||||||
104.128.228.252:8333
|
|
||||||
104.131.192.94:8333
|
|
||||||
104.155.45.201:8334
|
|
||||||
104.194.28.195:8663
|
|
||||||
104.211.1.27:8333
|
|
||||||
104.221.38.177:8333
|
|
||||||
104.236.9.79:8333
|
|
||||||
104.236.129.178:8333
|
|
||||||
104.236.186.249:8333
|
|
||||||
104.236.194.15:8333
|
|
||||||
104.238.128.214:8333
|
|
||||||
104.238.130.182:8333
|
|
||||||
106.38.234.84:8333
|
|
||||||
106.185.36.204:8333
|
|
||||||
106.185.38.67:8333
|
|
||||||
107.6.4.145:8333
|
|
||||||
107.150.2.6:8333
|
|
||||||
107.150.40.234:8333
|
|
||||||
107.170.13.184:8333
|
|
||||||
107.181.250.216:8333
|
|
||||||
107.191.101.111:8333
|
|
||||||
107.191.106.115:8333
|
|
||||||
108.59.12.163:8333
|
|
||||||
108.161.129.247:8333
|
|
||||||
109.193.160.140:8333
|
|
||||||
109.197.13.54:8333
|
|
||||||
109.230.7.248:8333
|
|
||||||
109.234.106.191:8333
|
|
||||||
109.236.137.80:8333
|
|
||||||
109.251.161.121:8333
|
|
||||||
112.65.231.226:8333
|
|
||||||
115.70.166.57:8333
|
|
||||||
115.159.42.80:8333
|
|
||||||
117.18.73.34:8333
|
|
||||||
118.67.201.40:8333
|
|
||||||
118.100.86.246:8333
|
|
||||||
118.110.104.152:8333
|
|
||||||
119.224.64.141:8333
|
|
||||||
120.55.193.136:8333
|
|
||||||
122.106.169.178:8333
|
|
||||||
123.203.174.15:8333
|
|
||||||
123.255.232.94:8333
|
|
||||||
124.148.165.165:8333
|
|
||||||
124.232.141.31:8333
|
|
||||||
128.30.92.69:8333
|
|
||||||
128.39.141.182:8333
|
|
||||||
128.84.167.20:8333
|
|
||||||
128.111.73.10:8333
|
|
||||||
128.127.38.195:8333
|
|
||||||
128.140.224.162:8333
|
|
||||||
128.199.101.104:8333
|
|
||||||
128.233.224.35:8333
|
|
||||||
128.253.3.193:20020
|
|
||||||
130.180.228.138:8333
|
|
||||||
130.185.144.213:8333
|
|
||||||
130.255.73.207:8333
|
|
||||||
133.218.233.11:8333
|
|
||||||
134.249.128.23:8333
|
|
||||||
136.159.234.234:8333
|
|
||||||
137.116.160.176:8333
|
|
||||||
139.162.2.145:8333
|
|
||||||
139.162.23.117:8333
|
|
||||||
141.134.69.253:8333
|
|
||||||
141.255.162.215:8333
|
|
||||||
144.122.163.187:8333
|
|
||||||
145.131.3.54:8333
|
|
||||||
145.255.4.94:8333
|
|
||||||
146.0.32.101:8337
|
|
||||||
147.83.72.91:8333
|
|
||||||
148.103.28.68:8333
|
|
||||||
149.5.32.102:8333
|
|
||||||
149.210.164.195:8333
|
|
||||||
150.101.163.241:8333
|
|
||||||
151.236.11.189:8333
|
|
||||||
152.3.136.56:8333
|
|
||||||
154.20.208.25:8333
|
|
||||||
158.181.104.149:8333
|
|
||||||
159.253.96.226:8333
|
|
||||||
160.36.130.180:8333
|
|
||||||
162.209.1.233:8333
|
|
||||||
162.209.4.125:8333
|
|
||||||
162.209.106.123:8333
|
|
||||||
162.210.198.184:8333
|
|
||||||
162.248.99.164:53011
|
|
||||||
162.248.102.117:8333
|
|
||||||
162.251.108.53:8333
|
|
||||||
163.44.2.48:8333
|
|
||||||
163.158.36.17:8333
|
|
||||||
166.230.71.67:8333
|
|
||||||
167.160.36.62:8333
|
|
||||||
167.160.169.92:8333
|
|
||||||
168.93.129.220:8333
|
|
||||||
169.55.99.84:8333
|
|
||||||
169.228.66.43:8333
|
|
||||||
172.9.169.242:8333
|
|
||||||
173.32.11.194:8333
|
|
||||||
173.230.228.136:8333
|
|
||||||
173.246.107.34:8333
|
|
||||||
173.254.235.34:8333
|
|
||||||
174.0.128.222:8333
|
|
||||||
174.25.130.148:8333
|
|
||||||
174.50.64.101:8333
|
|
||||||
175.140.232.141:8333
|
|
||||||
176.36.37.62:8333
|
|
||||||
176.46.9.96:8333
|
|
||||||
176.124.110.27:8333
|
|
||||||
177.39.16.102:8333
|
|
||||||
178.17.173.2:8333
|
|
||||||
178.62.5.248:8333
|
|
||||||
178.62.70.16:8333
|
|
||||||
178.62.203.185:8333
|
|
||||||
178.79.160.118:8333
|
|
||||||
178.169.206.244:8333
|
|
||||||
178.193.234.62:8333
|
|
||||||
178.199.96.108:8333
|
|
||||||
178.254.18.96:8333
|
|
||||||
178.254.34.161:8333
|
|
||||||
178.255.41.123:8333
|
|
||||||
180.210.34.58:9801
|
|
||||||
182.92.226.212:8333
|
|
||||||
182.171.246.142:8333
|
|
||||||
184.23.8.9:8333
|
|
||||||
184.58.162.35:8333
|
|
||||||
184.154.9.170:8333
|
|
||||||
185.8.238.165:8333
|
|
||||||
185.24.97.11:8333
|
|
||||||
185.31.137.139:8333
|
|
||||||
185.38.44.64:8333
|
|
||||||
185.53.128.180:8333
|
|
||||||
185.53.129.244:8333
|
|
||||||
185.77.129.119:8333
|
|
||||||
185.77.129.156:8333
|
|
||||||
185.82.203.92:8333
|
|
||||||
188.20.97.18:8333
|
|
||||||
188.126.8.14:8333
|
|
||||||
188.138.33.239:8333
|
|
||||||
188.155.136.70:8333
|
|
||||||
188.166.229.112:8333
|
|
||||||
188.182.108.129:8333
|
|
||||||
188.226.225.174:8010
|
|
||||||
188.242.171.8:8333
|
|
||||||
188.243.4.139:8333
|
|
||||||
190.10.9.234:8333
|
|
||||||
190.10.10.147:8333
|
|
||||||
190.81.160.184:8333
|
|
||||||
190.85.201.37:8333
|
|
||||||
192.34.227.230:8333
|
|
||||||
192.77.189.200:8333
|
|
||||||
192.124.224.7:8333
|
|
||||||
192.146.137.1:8333
|
|
||||||
192.203.228.71:8333
|
|
||||||
192.206.202.20:8333
|
|
||||||
193.0.109.3:8333
|
|
||||||
193.41.229.130:8333
|
|
||||||
193.41.229.156:8333
|
|
||||||
193.49.43.219:8333
|
|
||||||
193.147.71.120:8333
|
|
||||||
193.179.65.233:8333
|
|
||||||
193.183.99.46:8333
|
|
||||||
193.192.37.135:8333
|
|
||||||
193.234.224.195:8333
|
|
||||||
194.58.108.213:8333
|
|
||||||
194.187.96.2:8333
|
|
||||||
194.255.31.59:8333
|
|
||||||
195.36.6.101:8333
|
|
||||||
195.58.238.243:8333
|
|
||||||
195.197.175.190:8333
|
|
||||||
195.239.1.66:8333
|
|
||||||
198.48.196.230:8333
|
|
||||||
198.50.192.160:8333
|
|
||||||
198.57.210.27:8333
|
|
||||||
198.84.195.179:8333
|
|
||||||
198.167.140.8:8333
|
|
||||||
198.204.224.106:8333
|
|
||||||
199.127.226.245:8333
|
|
||||||
199.201.110.8:8333
|
|
||||||
199.233.234.90:8333
|
|
||||||
200.116.98.185:8333
|
|
||||||
202.60.70.18:8333
|
|
||||||
203.151.140.14:8333
|
|
||||||
204.112.203.52:8333
|
|
||||||
205.200.247.149:8333
|
|
||||||
207.226.141.253:8333
|
|
||||||
207.255.42.202:8333
|
|
||||||
208.53.164.19:8333
|
|
||||||
208.66.68.127:8333
|
|
||||||
208.66.68.130:8333
|
|
||||||
208.71.171.232:8341
|
|
||||||
208.76.200.200:8333
|
|
||||||
208.82.98.189:8333
|
|
||||||
208.85.193.31:8333
|
|
||||||
208.111.48.41:8333
|
|
||||||
208.111.48.45:8333
|
|
||||||
209.34.232.72:8333
|
|
||||||
209.81.9.223:8333
|
|
||||||
209.90.224.2:8333
|
|
||||||
209.90.224.4:8333
|
|
||||||
209.126.98.174:8333
|
|
||||||
209.136.72.69:8333
|
|
||||||
209.195.4.74:8333
|
|
||||||
209.197.13.62:8333
|
|
||||||
211.72.227.8:8333
|
|
||||||
212.51.144.42:8333
|
|
||||||
212.71.233.127:8333
|
|
||||||
212.126.14.122:8333
|
|
||||||
212.159.44.50:8333
|
|
||||||
213.5.36.58:8333
|
|
||||||
213.57.33.10:8333
|
|
||||||
213.66.205.194:8333
|
|
||||||
213.136.73.125:8333
|
|
||||||
213.155.3.216:8333
|
|
||||||
213.155.7.24:8333
|
|
||||||
213.167.17.6:8333
|
|
||||||
213.223.138.13:8333
|
|
||||||
216.15.78.182:8333
|
|
||||||
216.38.129.164:8333
|
|
||||||
216.48.168.8:8333
|
|
||||||
216.169.141.169:8333
|
|
||||||
216.245.206.181:8333
|
|
||||||
216.249.204.161:8333
|
|
||||||
216.250.138.230:8333
|
|
||||||
217.11.225.189:8333
|
|
||||||
217.12.34.158:8333
|
|
||||||
217.12.202.33:8333
|
|
||||||
217.20.171.43:8333
|
|
||||||
217.23.1.126:8333
|
|
||||||
217.23.11.138:8333
|
|
||||||
217.111.66.79:8333
|
|
||||||
217.155.202.191:8333
|
|
||||||
217.158.9.102:8333
|
|
||||||
217.172.32.18:20993
|
|
||||||
220.245.196.37:8333
|
|
||||||
[2001:1291:2bf:1::100]:8333
|
|
||||||
[2001:1620:f00:282::2]:8333
|
|
||||||
[2001:1620:f00:8282::1]:8333
|
|
||||||
[2001:19f0:5000:8de8:5400:ff:fe12:55e4]:8333
|
|
||||||
[2001:19f0:6c00:9103:5400:ff:fe10:a8d3]:8333
|
|
||||||
[2001:1b60:3:172:142b:6dff:fe7a:117]:8333
|
|
||||||
[2001:410:a000:4050:8463:90b0:fffb:4e58]:8333
|
|
||||||
[2001:4128:6135:2010:21e:bff:fee8:a3c0]:8333
|
|
||||||
[2001:41d0:1008:761::17c]:8333
|
|
||||||
[2001:41d0:1:45d8::1]:8333
|
|
||||||
[2001:41d0:1:6cd3::]:8333
|
|
||||||
[2001:41d0:1:8b26::1]:8333
|
|
||||||
[2001:41d0:1:afda::]:8200
|
|
||||||
[2001:41d0:1:b26b::1]:8333
|
|
||||||
[2001:41d0:1:c139::1]:8333
|
|
||||||
[2001:41d0:1:c8d7::1]:8333
|
|
||||||
[2001:41d0:1:f59f::33]:8333
|
|
||||||
[2001:41d0:1:f7cc::1]:8333
|
|
||||||
[2001:41d0:2:1021::1]:8333
|
|
||||||
[2001:41d0:2:37c3::]:8200
|
|
||||||
[2001:41d0:2:4797:2323:2323:2323:2323]:8333
|
|
||||||
[2001:41d0:2:53df::]:8333
|
|
||||||
[2001:41d0:2:9c94::1]:8333
|
|
||||||
[2001:41d0:2:9d3e::1]:8333
|
|
||||||
[2001:41d0:2:a24f::]:8333
|
|
||||||
[2001:41d0:2:a35a::]:8333
|
|
||||||
[2001:41d0:2:b2b8::]:8333
|
|
||||||
[2001:41d0:2:c1d9::]:8333
|
|
||||||
[2001:41d0:2:c6e::]:8333
|
|
||||||
[2001:41d0:2:c9bf::]:8333
|
|
||||||
[2001:41d0:2:f1a5::]:8333
|
|
||||||
[2001:41d0:52:a00::105f]:8333
|
|
||||||
[2001:41d0:52:cff::6f5]:8333
|
|
||||||
[2001:41d0:52:d00::6e2]:8333
|
|
||||||
[2001:41d0:8:3e75::1]:8333
|
|
||||||
[2001:41d0:8:62ab::1]:8333
|
|
||||||
[2001:41d0:8:6728::]:8333
|
|
||||||
[2001:41d0:8:b30a::1]:8333
|
|
||||||
[2001:41d0:8:bc26::1]:8333
|
|
||||||
[2001:41d0:8:be9a::1]:8333
|
|
||||||
[2001:41d0:8:d984::]:8333
|
|
||||||
[2001:41d0:8:eb8b::]:8333
|
|
||||||
[2001:41d0:a:13a2::1]:8333
|
|
||||||
[2001:41d0:a:2b18::1]:8333
|
|
||||||
[2001:41d0:a:2d14::]:8333
|
|
||||||
[2001:41d0:a:4558::1df2:76d3]:8333
|
|
||||||
[2001:41d0:a:4aaa::]:8333
|
|
||||||
[2001:41d0:a:635b::1]:8333
|
|
||||||
[2001:41d0:a:63d8::1]:8333
|
|
||||||
[2001:41d0:a:6c29::1]:8333
|
|
||||||
[2001:41d0:a:f9cd::1]:8333
|
|
||||||
[2001:41d0:d:20a4::]:8333
|
|
||||||
[2001:41d0:e:26b::1]:8333
|
|
||||||
[2001:41d0:fc8c:a200:7a24:afff:fe9d:c69b]:8333
|
|
||||||
[2001:41f0:61::7]:8333
|
|
||||||
[2001:41f0::2]:8333
|
|
||||||
[2001:44b8:41bd:6101:148e:4022:4950:e861]:8333
|
|
||||||
[2001:470:1:2f9:0:1:107a:a301]:8333
|
|
||||||
[2001:470:1f0b:ad6::2]:8333
|
|
||||||
[2001:470:1f11:12d5::ae1:5611]:8333
|
|
||||||
[2001:470:1f14:7d::2]:8333
|
|
||||||
[2001:470:27:ce::2]:8333
|
|
||||||
[2001:470:41:6::2]:8333
|
|
||||||
[2001:470:507d:0:6ab5:99ff:fe73:ac18]:8333
|
|
||||||
[2001:470:583e::2a]:8333
|
|
||||||
[2001:470:5f:5f::232]:8333
|
|
||||||
[2001:470:66:119::2]:8333
|
|
||||||
[2001:470:6c4f::cafe]:8333
|
|
||||||
[2001:470:6f:327:913b:7fe:8545:a4f5]:8333
|
|
||||||
[2001:470:7dda:1::1]:8333
|
|
||||||
[2001:470:95c1::2]:8333
|
|
||||||
[2001:470:b1d0:ffff::1000]:8333
|
|
||||||
[2001:470:d00d:0:3664:a9ff:fe9a:5150]:8333
|
|
||||||
[2001:470:fab7:1::1]:8333
|
|
||||||
[2001:4800:7819:104:be76:4eff:fe05:c828]:8333
|
|
||||||
[2001:4800:7819:104:be76:4eff:fe05:c9a0]:8333
|
|
||||||
[2001:4801:7819:74:b745:b9d5:ff10:a61a]:8333
|
|
||||||
[2001:4801:7819:74:b745:b9d5:ff10:aaec]:8333
|
|
||||||
[2001:4801:7828:104:be76:4eff:fe10:1325]:8333
|
|
||||||
[2001:4802:7800:1:be76:4eff:fe20:f023]:8333
|
|
||||||
[2001:4802:7800:2:30d7:1775:ff20:1858]:8333
|
|
||||||
[2001:4802:7800:2:be76:4eff:fe20:6c26]:8333
|
|
||||||
[2001:4802:7802:101:be76:4eff:fe20:256]:8333
|
|
||||||
[2001:4802:7802:103:be76:4eff:fe20:2de8]:8333
|
|
||||||
[2001:4830:1100:2e8::2]:8333
|
|
||||||
[2001:4b98:dc2:41:216:3eff:fe56:f659]:8333
|
|
||||||
[2001:4ba0:fffa:5d::93]:8333
|
|
||||||
[2001:4ba0:ffff:1be:1:1005:0:1]:8333
|
|
||||||
[2001:4dd0:ff00:867f::3]:8333
|
|
||||||
[2001:4dd0:ff00:9a67::9]:8333
|
|
||||||
[2001:5c0:1400:b::3cc7]:8333
|
|
||||||
[2001:610:1b19::3]:8333
|
|
||||||
[2001:610:600:a41::2]:8333
|
|
||||||
[2001:67c:26b4::]:8333
|
|
||||||
[2001:8d8:840:500::39:1ae]:8333
|
|
||||||
[2001:8d8:965:4a00::10:9343]:8333
|
|
||||||
[2001:980:4650:1:2e0:53ff:fe13:2449]:8333
|
|
||||||
[2001:981:46:1:ba27:ebff:fe5b:edee]:8333
|
|
||||||
[2001:9c8:53e9:369a:226:2dff:fe1b:7472]:8333
|
|
||||||
[2001:9d8:cafe:3::87]:8333
|
|
||||||
[2001:b10:11:21:3e07:54ff:fe48:7248]:8333
|
|
||||||
[2001:ba8:1f1:f34c::2]:8333
|
|
||||||
[2001:bc8:2310:100::1]:8333
|
|
||||||
[2001:bc8:3427:101:7a4f:8be:2611:6e79]:8333
|
|
||||||
[2001:bc8:3505:200::1]:8333
|
|
||||||
[2001:cc0:a004::30:1d]:8333
|
|
||||||
[2001:e42:102:1209:153:121:76:171]:8333
|
|
||||||
[2002:17ea:14eb::17ea:14eb]:8333
|
|
||||||
[2002:2f8:2bc5::2f8:2bc5]:8333
|
|
||||||
[2002:4047:482c::4047:482c]:8333
|
|
||||||
[2002:45c3:8cca::45c3:8cca]:8333
|
|
||||||
[2002:46bb:8a41:0:226:b0ff:feed:5f12]:8888
|
|
||||||
[2002:46bb:8c3c:0:8d55:8fbb:15fa:f4e0]:8765
|
|
||||||
[2002:4c48:a0fe::4c48:a0fe]:8333
|
|
||||||
[2002:4d44:25c8::4d44:25c8]:8333
|
|
||||||
[2002:505f:aaa2::505f:aaa2]:8333
|
|
||||||
[2002:5bc1:799d::5bc1:799d]:8333
|
|
||||||
[2002:6dec:5472::6dec:5472]:8333
|
|
||||||
[2002:8c6d:6521:9617:12bf:48ff:fed8:1724]:8333
|
|
||||||
[2002:ac52:94e2::ac52:94e2]:8333
|
|
||||||
[2002:af7e:3eca::af7e:3eca]:8333
|
|
||||||
[2002:b009:20c5::b009:20c5]:8333
|
|
||||||
[2002:c06f:39a0::c06f:39a0]:8333
|
|
||||||
[2002:c23a:738a::c23a:738a]:8333
|
|
||||||
[2002:c70f:7442::c70f:7442]:8333
|
|
||||||
[2002:cec5:be4f::cec5:be4f]:8333
|
|
||||||
[2002:d149:9e3a::d149:9e3a]:8333
|
|
||||||
[2002:d917:ca5::d917:ca5]:8333
|
|
||||||
[2400:8900::f03c:91ff:fe50:153f]:8333
|
|
||||||
[2400:8900::f03c:91ff:fe6e:823e]:8333
|
|
||||||
[2400:8900::f03c:91ff:fea8:1934]:8333
|
|
||||||
[2400:8901::f03c:91ff:fe26:c4d6]:8333
|
|
||||||
[2400:8901::f03c:91ff:fec8:4280]:8333
|
|
||||||
[2400:8901::f03c:91ff:fec8:660f]:8333
|
|
||||||
[2401:1800:7800:102:be76:4eff:fe1c:559]:8333
|
|
||||||
[2401:1800:7800:102:be76:4eff:fe1c:a7d]:8333
|
|
||||||
[2405:aa00:2::40]:8333
|
|
||||||
[2600:3c00::f03c:91ff:fe18:59b2]:8333
|
|
||||||
[2600:3c00::f03c:91ff:fe26:bfb6]:8333
|
|
||||||
[2600:3c00::f03c:91ff:fe33:88e3]:8333
|
|
||||||
[2600:3c00::f03c:91ff:fe6e:7297]:8333
|
|
||||||
[2600:3c00::f03c:91ff:fe84:8a6e]:8333
|
|
||||||
[2600:3c01::f03c:91ff:fe18:6adf]:8333
|
|
||||||
[2600:3c01::f03c:91ff:fe26:c4b8]:8333
|
|
||||||
[2600:3c01::f03c:91ff:fe3b:1f76]:8333
|
|
||||||
[2600:3c01::f03c:91ff:fe50:5e06]:8333
|
|
||||||
[2600:3c01::f03c:91ff:fe61:289b]:8333
|
|
||||||
[2600:3c01::f03c:91ff:fe69:89e9]:8333
|
|
||||||
[2600:3c01::f03c:91ff:fe84:ac15]:8333
|
|
||||||
[2600:3c01::f03c:91ff:fe98:68bb]:8333
|
|
||||||
[2600:3c02::f03c:91ff:fe26:713]:8333
|
|
||||||
[2600:3c02::f03c:91ff:fe26:c49e]:8333
|
|
||||||
[2600:3c02::f03c:91ff:fe84:97d8]:8333
|
|
||||||
[2600:3c02::f03c:91ff:fec8:8feb]:8333
|
|
||||||
[2600:3c03::f03c:91ff:fe18:da80]:8333
|
|
||||||
[2600:3c03::f03c:91ff:fe26:c49b]:8333
|
|
||||||
[2600:3c03::f03c:91ff:fe50:5fa7]:8333
|
|
||||||
[2600:3c03::f03c:91ff:fe67:d2e]:8333
|
|
||||||
[2600:3c03::f03c:91ff:fe6e:1803]:8333
|
|
||||||
[2600:3c03::f03c:91ff:fec8:4bbe]:8333
|
|
||||||
[2600:3c03::f03c:91ff:fee4:4e16]:8333
|
|
||||||
[2601:18d:8300:58a6::2e4]:8333
|
|
||||||
[2601:240:4600:40c0:250:56ff:fea4:6305]:8333
|
|
||||||
[2601:581:c200:a719:542c:9cd5:4852:f7d9]:8333
|
|
||||||
[2601:647:4900:85f1:ca2a:14ff:fe51:bb35]:8333
|
|
||||||
[2601:c2:c002:b300:54a0:15b5:19f7:530d]:8333
|
|
||||||
[2602:306:ccff:ad7f:b116:52be:64ba:db3a]:8333
|
|
||||||
[2602:ae:1982:9400:846:f78c:fec:4d57]:8333
|
|
||||||
[2602:ffc5:1f::1f:2d61]:8333
|
|
||||||
[2602:ffc5:1f::1f:9211]:8333
|
|
||||||
[2602:ffc5::75d5:c1c3]:8333
|
|
||||||
[2602:ffc5::ffc5:b844]:8333
|
|
||||||
[2602:ffe8:100:2::457:936b]:8333
|
|
||||||
[2602:ffe8:100:2::9d20:2e3c]:8333
|
|
||||||
[2602:ffea:1001:72b::578b]:8333
|
|
||||||
[2602:ffea:a::24c4:d9fd]:8333
|
|
||||||
[2604:0:c1:100:1ec1:deff:fe54:2235]:8333
|
|
||||||
[2604:180:1:1af::42a9]:8333
|
|
||||||
[2604:180:3:702::c9de]:8333
|
|
||||||
[2604:4080:1114:0:3285:a9ff:fe93:850c]:8333
|
|
||||||
[2604:6000:ffc0:3c:64a3:94d0:4f1d:1da8]:8333
|
|
||||||
[2605:6000:f380:9a01:ba09:8aff:fed4:3511]:8333
|
|
||||||
[2605:6001:e00f:7b00:c587:6d91:6eff:eeba]:8333
|
|
||||||
[2605:f700:c0:1::25c3:2a3e]:8333
|
|
||||||
[2606:6000:a441:9903:5054:ff:fe78:66ff]:8333
|
|
||||||
[2607:5300:100:200::1c83]:9334
|
|
||||||
[2607:5300:10::a1]:8333
|
|
||||||
[2607:5300:60:1c2f::1]:8333
|
|
||||||
[2607:5300:60:2b90::1]:8333
|
|
||||||
[2607:5300:60:3320::1]:8333
|
|
||||||
[2607:5300:60:385::1]:8333
|
|
||||||
[2607:5300:60:4a85::]:8333
|
|
||||||
[2607:5300:60:65e4::]:8333
|
|
||||||
[2607:5300:60:6918::]:8333
|
|
||||||
[2607:5300:60:711a:78::a7b5]:8333
|
|
||||||
[2607:5300:60:714::1]:8333
|
|
||||||
[2607:5300:60:870::1]:8333
|
|
||||||
[2607:5300:60:952e:3733::1414]:8333
|
|
||||||
[2607:f1c0:848:1000::48:943c]:8333
|
|
||||||
[2607:f2e0:f:5df::2]:8333
|
|
||||||
[2607:f748:1200:f8:21e:67ff:fe99:8f07]:8333
|
|
||||||
[2607:f948:0:1::7]:8333
|
|
||||||
[2607:ff68:100:36::131]:8333
|
|
||||||
[2803:6900:1::117]:8333
|
|
||||||
[2a00:1098:0:80:1000:25:0:1]:8333
|
|
||||||
[2a00:1178:2:43:5054:ff:fe84:f86f]:8333
|
|
||||||
[2a00:1178:2:43:5054:ff:fee7:2eb6]:8333
|
|
||||||
[2a00:1178:2:43:8983:cc27:d72:d97a]:8333
|
|
||||||
[2a00:1328:e100:cc42:230:48ff:fe92:55c]:8333
|
|
||||||
[2a00:14f0:e000:80d2:cd1a::1]:8333
|
|
||||||
[2a00:1630:2:1802:188:122:91:11]:8333
|
|
||||||
[2a00:18e0:0:1800::1]:8333
|
|
||||||
[2a00:18e0:0:dcc5:109:234:106:191]:8333
|
|
||||||
[2a00:1a28:1157:87::94c7]:8333
|
|
||||||
[2a00:1ca8:37::a5fc:40d1]:8333
|
|
||||||
[2a00:1ca8:37::ab6d:ce2c]:8333
|
|
||||||
[2a00:7143:100:0:216:3eff:fe2e:74a3]:8333
|
|
||||||
[2a00:7143:100:0:216:3eff:fed3:5c21]:8333
|
|
||||||
[2a00:7c80:0:45::123]:8333
|
|
||||||
[2a00:dcc0:eda:98:183:193:c382:6bdb]:8333
|
|
||||||
[2a00:dcc0:eda:98:183:193:f72e:d943]:8333
|
|
||||||
[2a00:f820:17::4af:1]:8333
|
|
||||||
[2a00:f940:2:1:2::101d]:8333
|
|
||||||
[2a00:f940:2:1:2::6ac]:8333
|
|
||||||
[2a01:1b0:7999:402::131]:8333
|
|
||||||
[2a01:238:42dd:f900:7a6c:2bc6:4041:c43]:8333
|
|
||||||
[2a01:238:4313:6300:2189:1c97:696b:5ea]:8333
|
|
||||||
[2a01:488:66:1000:5c33:91f9:0:1]:8333
|
|
||||||
[2a01:488:66:1000:b01c:178d:0:1]:8333
|
|
||||||
[2a01:4f8:100:34ce::2]:8333
|
|
||||||
[2a01:4f8:100:34e4::2]:8333
|
|
||||||
[2a01:4f8:100:44e7::2]:8333
|
|
||||||
[2a01:4f8:100:510e::2]:8333
|
|
||||||
[2a01:4f8:100:5128::2]:8333
|
|
||||||
[2a01:4f8:110:5105::2]:8333
|
|
||||||
[2a01:4f8:110:516c::2]:8333
|
|
||||||
[2a01:4f8:120:43e4::2]:8333
|
|
||||||
[2a01:4f8:120:62e6::2]:8333
|
|
||||||
[2a01:4f8:120:702e::2]:8333
|
|
||||||
[2a01:4f8:120:8203::2]:8333
|
|
||||||
[2a01:4f8:121:234d::2]:8333
|
|
||||||
[2a01:4f8:121:261::2]:8333
|
|
||||||
[2a01:4f8:130:11ea::2]:8333
|
|
||||||
[2a01:4f8:130:3332::2]:8333
|
|
||||||
[2a01:4f8:130:40ab::2]:8333
|
|
||||||
[2a01:4f8:130:632c::2]:8333
|
|
||||||
[2a01:4f8:130:6366::2]:8333
|
|
||||||
[2a01:4f8:130:934f::2]:8333
|
|
||||||
[2a01:4f8:131:33ad:fea1::666]:8333
|
|
||||||
[2a01:4f8:140:2195::2]:8333
|
|
||||||
[2a01:4f8:140:6333::2]:8333
|
|
||||||
[2a01:4f8:140:930d::2]:8333
|
|
||||||
[2a01:4f8:140:93b0::2]:8333
|
|
||||||
[2a01:4f8:141:1167::2]:8333
|
|
||||||
[2a01:4f8:141:186::2]:8333
|
|
||||||
[2a01:4f8:141:53f0::2]:8333
|
|
||||||
[2a01:4f8:150:336a::2]:8333
|
|
||||||
[2a01:4f8:150:72ee::4202]:8333
|
|
||||||
[2a01:4f8:150:8324::2]:9001
|
|
||||||
[2a01:4f8:151:21ca::2]:8333
|
|
||||||
[2a01:4f8:151:41c2:0:5404:a67e:f250]:8333
|
|
||||||
[2a01:4f8:151:5128::2]:8333
|
|
||||||
[2a01:4f8:151:52c6::154]:8333
|
|
||||||
[2a01:4f8:151:6347::2]:9001
|
|
||||||
[2a01:4f8:160:5136::2]:8333
|
|
||||||
[2a01:4f8:160:72c5::2858:e1c5]:8333
|
|
||||||
[2a01:4f8:160:72c5::593b:60d5]:8333
|
|
||||||
[2a01:4f8:160:814f::2]:8333
|
|
||||||
[2a01:4f8:161:13d0::2]:8333
|
|
||||||
[2a01:4f8:161:228f::2]:8333
|
|
||||||
[2a01:4f8:161:51c4::2]:8333
|
|
||||||
[2a01:4f8:161:60a7::2]:8333
|
|
||||||
[2a01:4f8:161:7026::2]:8333
|
|
||||||
[2a01:4f8:161:9184::2]:8333
|
|
||||||
[2a01:4f8:162:2108::2]:8333
|
|
||||||
[2a01:4f8:162:218c::2]:8333
|
|
||||||
[2a01:4f8:162:4443::2]:8333
|
|
||||||
[2a01:4f8:162:51a3::2]:8333
|
|
||||||
[2a01:4f8:171:b93::2]:8333
|
|
||||||
[2a01:4f8:190:1483::1]:8333
|
|
||||||
[2a01:4f8:190:4495::2]:8333
|
|
||||||
[2a01:4f8:190:64c9::2]:8333
|
|
||||||
[2a01:4f8:190:91ce::2]:8333
|
|
||||||
[2a01:4f8:191:2194::83]:8333
|
|
||||||
[2a01:4f8:191:40e8::2]:8333
|
|
||||||
[2a01:4f8:191:44b4::2]:8333
|
|
||||||
[2a01:4f8:191:8242::2]:8333
|
|
||||||
[2a01:4f8:191:83a2::2]:8333
|
|
||||||
[2a01:4f8:192:11b2::2]:8333
|
|
||||||
[2a01:4f8:192:216c::2]:8333
|
|
||||||
[2a01:4f8:192:22b3::2]:8333
|
|
||||||
[2a01:4f8:192:440b::2]:8333
|
|
||||||
[2a01:4f8:192:db::2]:8333
|
|
||||||
[2a01:4f8:200:1012::2]:8333
|
|
||||||
[2a01:4f8:200:23d1::dead:beef]:8333
|
|
||||||
[2a01:4f8:200:506d::2]:8333
|
|
||||||
[2a01:4f8:200:51f0::2]:8333
|
|
||||||
[2a01:4f8:200:5389::2]:8333
|
|
||||||
[2a01:4f8:200:53e3::2]:8333
|
|
||||||
[2a01:4f8:200:6344::2]:8333
|
|
||||||
[2a01:4f8:200:6396::2]:8333
|
|
||||||
[2a01:4f8:200:63af::119]:8333
|
|
||||||
[2a01:4f8:200:71e3:78b4:f3ff:fead:e8cf]:8333
|
|
||||||
[2a01:4f8:201:214c::2]:8333
|
|
||||||
[2a01:4f8:201:233:1::3]:8333
|
|
||||||
[2a01:4f8:201:3e3::2]:8333
|
|
||||||
[2a01:4f8:201:6011::4]:8333
|
|
||||||
[2a01:4f8:201:60d5::2]:8333
|
|
||||||
[2a01:4f8:202:265::2]:8333
|
|
||||||
[2a01:4f8:202:3115::2]:8333
|
|
||||||
[2a01:4f8:202:31e3::2]:8333
|
|
||||||
[2a01:4f8:202:31ef::2]:8333
|
|
||||||
[2a01:4f8:202:3392::2]:8333
|
|
||||||
[2a01:4f8:202:53c3::2]:8333
|
|
||||||
[2a01:4f8:202:63f4::2]:8333
|
|
||||||
[2a01:4f8:202:7227::2]:8333
|
|
||||||
[2a01:4f8:210:2227::2]:8333
|
|
||||||
[2a01:4f8:210:24aa::2]:8333
|
|
||||||
[2a01:4f8:211:14cf::2]:8333
|
|
||||||
[2a01:4f8:211:181b::2]:8333
|
|
||||||
[2a01:4f8:212:289e::2]:8333
|
|
||||||
[2a01:4f8:212:33db::2]:18333
|
|
||||||
[2a01:4f8:a0:112f::2]:8333
|
|
||||||
[2a01:4f8:a0:3174::2]:8333
|
|
||||||
[2a01:4f8:a0:328c::2]:8333
|
|
||||||
[2a01:4f8:a0:5243::2]:8333
|
|
||||||
[2a01:4f8:c17:19b9::2]:8333
|
|
||||||
[2a01:4f8:c17:1a41::2]:8333
|
|
||||||
[2a01:4f8:c17:1a92::2]:8333
|
|
||||||
[2a01:4f8:c17:273::2]:8333
|
|
||||||
[2a01:4f8:c17:435::2]:8333
|
|
||||||
[2a01:4f8:c17:755::2]:8333
|
|
||||||
[2a01:4f8:c17:b54::2]:8333
|
|
||||||
[2a01:4f8:d16:9384::2]:8333
|
|
||||||
[2a01:608:ffff:a009:8bf5:879d:e51a:f837]:8333
|
|
||||||
[2a01:680:10:10:f2de:f1ff:fec9:dc0]:8333
|
|
||||||
[2a01:7c8:aaac:1f6:5054:ff:fe30:e585]:8333
|
|
||||||
[2a01:7c8:aaac:20b:5054:ff:fe24:435e]:8333
|
|
||||||
[2a01:7c8:aaac:43d:5054:ff:fe4e:3dd4]:8333
|
|
||||||
[2a01:7c8:aaad:256::1]:8333
|
|
||||||
[2a01:7c8:aab6:ea:5054:ff:feff:eac3]:8333
|
|
||||||
[2a01:7c8:aab9:5a:5054:ff:fe89:7b26]:8333
|
|
||||||
[2a01:7c8:aabc:2c8:5054:ff:fe35:6581]:8333
|
|
||||||
[2a01:7e00::f03c:91ff:fe18:301e]:8333
|
|
||||||
[2a01:7e00::f03c:91ff:fe18:3942]:8333
|
|
||||||
[2a01:7e00::f03c:91ff:fe26:8c87]:8333
|
|
||||||
[2a01:7e00::f03c:91ff:fe50:6206]:8333
|
|
||||||
[2a01:7e00::f03c:91ff:fe67:559d]:8333
|
|
||||||
[2a01:7e00::f03c:91ff:fe84:434f]:8333
|
|
||||||
[2a01:7e00::f03c:91ff:fe89:1143]:8333
|
|
||||||
[2a01:7e00::f03c:91ff:fe98:2505]:8333
|
|
||||||
[2a01:7e00::f03c:91ff:fedb:352e]:8333
|
|
||||||
[2a01:7e01::f03c:91ff:fec8:d7b5]:8333
|
|
||||||
[2a01:e34:ee33:1640:c504:f677:b28a:ba42]:8333
|
|
||||||
[2a01:e35:2e7e:bc0:e079:f55e:cef3:b5d7]:8333
|
|
||||||
[2a01:e35:2ee5:610:21f:d0ff:fe4e:7460]:8333
|
|
||||||
[2a01:e35:8a3f:47c0:c617:feff:fe3c:9fbd]:8333
|
|
||||||
[2a01:e35:8aca:6a0:211:aff:fe5e:295e]:8333
|
|
||||||
[2a02:180:a:18:81:7:11:50]:8333
|
|
||||||
[2a02:1810:1d87:6a00:5604:a6ff:fe60:d87d]:8333
|
|
||||||
[2a02:2168:1144:5c01:d63d:7eff:fedd:4f8e]:8333
|
|
||||||
[2a02:2498:6d7b:7001:b508:b39d:2cea:5b7a]:8333
|
|
||||||
[2a02:2528:503:2::15]:8333
|
|
||||||
[2a02:2528:fa:1a56:216:44ff:fe6a:d112]:8333
|
|
||||||
[2a02:27f8:2012:0:e9f7:268f:c441:6129]:8333
|
|
||||||
[2a02:348:86:3011::1]:8333
|
|
||||||
[2a02:4780:1:1::1:8a01]:8333
|
|
||||||
[2a02:578:5002:116::2]:8333
|
|
||||||
[2a02:6080::1:190b:69e3]:8333
|
|
||||||
[2a02:6080::1:e893:d9d6]:8333
|
|
||||||
[2a02:770:4000::139]:8333
|
|
||||||
[2a02:7aa0:1201::deb3:81a2]:8333
|
|
||||||
[2a02:8010:b001::5860:59b5]:8333
|
|
||||||
[2a02:810d:21c0:f00:a248:1cff:feb8:5348]:8333
|
|
||||||
[2a02:a50::21b:24ff:fe93:4e39]:8333
|
|
||||||
[2a02:a80:0:1200::2]:8333
|
|
||||||
[2a02:c200:0:10:2:1:5830:1]:8333
|
|
||||||
[2a02:c200:0:10:2:5:4692:1]:8333
|
|
||||||
[2a02:c200:0:10:3:0:7158:1]:8333
|
|
||||||
[2a02:c200:0:10::2244:1]:8333
|
|
||||||
[2a02:c200:1:10:2:3:3339:1]:8333
|
|
||||||
[2a02:c200:1:10:2:3:7844:1]:8333
|
|
||||||
[2a02:c200:1:10:2:5:6288:1]:8333
|
|
||||||
[2a02:c200:1:10:3:0:5912:1]:8333
|
|
||||||
[2a03:4000:2:496::8]:8333
|
|
||||||
[2a03:4000:6:8009::1]:8333
|
|
||||||
[2a03:4000:6:8063::bcd0]:8333
|
|
||||||
[2a03:4900:fffc:b::2]:8333
|
|
||||||
[2a03:b0c0:1:d0::d:5001]:8333
|
|
||||||
[2a03:f80:ed15:149:154:155:235:1]:8333
|
|
||||||
[2a03:f80:ed15:149:154:155:241:1]:8333
|
|
||||||
[2a03:f80:ed16:ca7:ea75:b12d:2af:9e2a]:8333
|
|
||||||
[2a04:1980:3100:1aab:290:faff:fe70:a3d8]:8333
|
|
||||||
[2a04:1980:3100:1aab:e61d:2dff:fe29:f590]:8333
|
|
||||||
[2a04:2f80:6:200::89]:8333
|
|
||||||
[2a04:ac00:1:4a0b:5054:ff:fe00:5af5]:8333
|
|
||||||
[2a04:ad80:0:68::35da]:8333
|
|
||||||
3ffk7iumtx3cegbi.onion:8333
|
|
||||||
3nmbbakinewlgdln.onion:8333
|
|
||||||
4j77gihpokxu2kj4.onion:8333
|
|
||||||
546esc6botbjfbxb.onion:8333
|
|
||||||
5at7sq5nm76xijkd.onion:8333
|
|
||||||
77mx2jsxaoyesz2p.onion:8333
|
|
||||||
7g7j54btiaxhtsiy.onion:8333
|
|
||||||
a6obdgzn67l7exu3.onion:8333
|
|
||||||
ab64h7olpl7qpxci.onion:8333
|
|
||||||
am2a4rahltfuxz6l.onion:8333
|
|
||||||
azuxls4ihrr2mep7.onion:8333
|
|
||||||
bitcoin7bi4op7wb.onion:8333
|
|
||||||
bitcoinostk4e4re.onion:8333
|
|
||||||
bk7yp6epnmcllq72.onion:8333
|
|
||||||
bmutjfrj5btseddb.onion:8333
|
|
||||||
ceeji4qpfs3ms3zc.onion:8333
|
|
||||||
clexmzqio7yhdao4.onion:8333
|
|
||||||
gb5ypqt63du3wfhn.onion:8333
|
|
||||||
h2vlpudzphzqxutd.onion:8333
|
|
||||||
n42h7r6oumcfsbrs.onion:4176
|
|
||||||
ncwk3lutemffcpc4.onion:8333
|
|
||||||
okdzjarwekbshnof.onion:8333
|
|
||||||
pjghcivzkoersesd.onion:8333
|
|
||||||
rw7ocjltix26mefn.onion:8333
|
|
||||||
uws7itep7o3yinxo.onion:8333
|
|
||||||
vk3qjdehyy4dwcxw.onion:8333
|
|
||||||
vqpye2k5rcqvj5mq.onion:8333
|
|
||||||
wpi7rpvhnndl52ee.onion:8333
|
|
||||||
|
|
|
@ -1,11 +1,13 @@
|
||||||
# List of fixed seed nodes for testnet
|
# List of fixed seed nodes for testnet
|
||||||
|
|
||||||
# Onion nodes
|
159.203.154.219:19246
|
||||||
thfsmmn2jbitcoin.onion
|
|
||||||
it2pj4f7657g3rhi.onion
|
# Onion nodes
|
||||||
nkf5e6b7pl4jfd4a.onion
|
#thfsmmn2jbitcoin.onion
|
||||||
4zhkir2ofl7orfom.onion
|
#it2pj4f7657g3rhi.onion
|
||||||
t6xj6wilh4ytvcs7.onion
|
#nkf5e6b7pl4jfd4a.onion
|
||||||
i6y6ivorwakd7nw3.onion
|
#4zhkir2ofl7orfom.onion
|
||||||
ubqj4rsu3nqtxmtp.onion
|
#t6xj6wilh4ytvcs7.onion
|
||||||
|
#i6y6ivorwakd7nw3.onion
|
||||||
|
#ubqj4rsu3nqtxmtp.onion
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,7 @@ if ! $VALID; then
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
if $VALID && $REVSIG; then
|
if $VALID && $REVSIG; then
|
||||||
echo "$INPUT" | gpg --trust-model always "$@" | grep "\[GNUPG:\] \(NEWSIG\|SIG_ID\|VALIDSIG\)" 2>/dev/null
|
echo "$INPUT" | gpg --trust-model always "$@" | grep "^\[GNUPG:\] \(NEWSIG\|SIG_ID\|VALIDSIG\)" 2>/dev/null
|
||||||
echo "$GOODREVSIG"
|
echo "$GOODREVSIG"
|
||||||
else
|
else
|
||||||
echo "$INPUT" | gpg --trust-model always "$@" 2>/dev/null
|
echo "$INPUT" | gpg --trust-model always "$@" 2>/dev/null
|
||||||
|
|
|
@ -95,6 +95,7 @@ wallet_packages_$(NO_WALLET) = $(wallet_packages)
|
||||||
upnp_packages_$(NO_UPNP) = $(upnp_packages)
|
upnp_packages_$(NO_UPNP) = $(upnp_packages)
|
||||||
|
|
||||||
packages += $($(host_arch)_$(host_os)_packages) $($(host_os)_packages) $(qt_packages_) $(wallet_packages_) $(upnp_packages_)
|
packages += $($(host_arch)_$(host_os)_packages) $($(host_os)_packages) $(qt_packages_) $(wallet_packages_) $(upnp_packages_)
|
||||||
|
$(info $$packages is [${packages}])
|
||||||
native_packages += $($(host_arch)_$(host_os)_native_packages) $($(host_os)_native_packages) $(qt_native_packages_)
|
native_packages += $($(host_arch)_$(host_os)_native_packages) $($(host_os)_native_packages) $(qt_native_packages_)
|
||||||
all_packages = $(packages) $(native_packages)
|
all_packages = $(packages) $(native_packages)
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,16 @@ Mac OS X Build Instructions and Notes
|
||||||
====================================
|
====================================
|
||||||
This guide will show you how to build Bitcoin Core for OS X.
|
This guide will show you how to build Bitcoin Core for OS X.
|
||||||
|
|
||||||
|
|
||||||
|
TRY THIS FIRST
|
||||||
|
-----
|
||||||
|
|
||||||
|
Run `./reproducible_build.sh -c -t` in the Terminal. This should build the binaries and put them into the `./src` directory.
|
||||||
|
|
||||||
|
If that errors, please report the issue. See below for other ways of building the binaries.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
Notes
|
Notes
|
||||||
-----
|
-----
|
||||||
|
|
||||||
|
|
|
@ -1,39 +1,116 @@
|
||||||
Developer Notes
|
Developer Notes
|
||||||
===============
|
===============
|
||||||
|
|
||||||
|
<!-- markdown-toc start -->
|
||||||
|
**Table of Contents**
|
||||||
|
|
||||||
|
- [Developer Notes](#developer-notes)
|
||||||
|
- [Coding Style](#coding-style)
|
||||||
|
- [Doxygen comments](#doxygen-comments)
|
||||||
|
- [Development tips and tricks](#development-tips-and-tricks)
|
||||||
|
- [Compiling for debugging](#compiling-for-debugging)
|
||||||
|
- [Compiling for gprof profiling](#compiling-for-gprof-profiling)
|
||||||
|
- [debug.log](#debuglog)
|
||||||
|
- [Testnet and Regtest modes](#testnet-and-regtest-modes)
|
||||||
|
- [DEBUG_LOCKORDER](#debug_lockorder)
|
||||||
|
- [Valgrind suppressions file](#valgrind-suppressions-file)
|
||||||
|
- [Compiling for test coverage](#compiling-for-test-coverage)
|
||||||
|
- [Locking/mutex usage notes](#lockingmutex-usage-notes)
|
||||||
|
- [Threads](#threads)
|
||||||
|
- [Ignoring IDE/editor files](#ignoring-ideeditor-files)
|
||||||
|
- [Development guidelines](#development-guidelines)
|
||||||
|
- [General Bitcoin Core](#general-bitcoin-core)
|
||||||
|
- [Wallet](#wallet)
|
||||||
|
- [General C++](#general-c)
|
||||||
|
- [C++ data structures](#c-data-structures)
|
||||||
|
- [Strings and formatting](#strings-and-formatting)
|
||||||
|
- [Variable names](#variable-names)
|
||||||
|
- [Threads and synchronization](#threads-and-synchronization)
|
||||||
|
- [Source code organization](#source-code-organization)
|
||||||
|
- [GUI](#gui)
|
||||||
|
- [Subtrees](#subtrees)
|
||||||
|
- [Git and GitHub tips](#git-and-github-tips)
|
||||||
|
- [Scripted diffs](#scripted-diffs)
|
||||||
|
- [RPC interface guidelines](#rpc-interface-guidelines)
|
||||||
|
|
||||||
|
<!-- markdown-toc end -->
|
||||||
|
|
||||||
|
Coding Style
|
||||||
|
---------------
|
||||||
|
|
||||||
Various coding styles have been used during the history of the codebase,
|
Various coding styles have been used during the history of the codebase,
|
||||||
and the result is not very consistent. However, we're now trying to converge to
|
and the result is not very consistent. However, we're now trying to converge to
|
||||||
a single style, so please use it in new code. Old code will be converted
|
a single style, which is specified below. When writing patches, favor the new
|
||||||
gradually.
|
style over attempting to mimic the surrounding style, except for move-only
|
||||||
- Basic rules specified in src/.clang-format. Use a recent clang-format-3.5 to format automatically.
|
commits.
|
||||||
- Braces on new lines for namespaces, classes, functions, methods.
|
|
||||||
|
Do not submit patches solely to modify the style of existing code.
|
||||||
|
|
||||||
|
- **Indentation and whitespace rules** as specified in
|
||||||
|
[src/.clang-format](/src/.clang-format). You can use the provided
|
||||||
|
[clang-format-diff script](/contrib/devtools/README.md#clang-format-diffpy)
|
||||||
|
tool to clean up patches automatically before submission.
|
||||||
|
- Braces on new lines for classes, functions, methods.
|
||||||
- Braces on the same line for everything else.
|
- Braces on the same line for everything else.
|
||||||
- 4 space indentation (no tabs) for every block except namespaces.
|
- 4 space indentation (no tabs) for every block except namespaces.
|
||||||
- No indentation for public/protected/private or for namespaces.
|
- No indentation for `public`/`protected`/`private` or for `namespace`.
|
||||||
- No extra spaces inside parenthesis; don't do ( this )
|
- No extra spaces inside parenthesis; don't do ( this )
|
||||||
- No space after function names; one space after if, for and while.
|
- No space after function names; one space after `if`, `for` and `while`.
|
||||||
|
- If an `if` only has a single-statement `then`-clause, it can appear
|
||||||
|
on the same line as the `if`, without braces. In every other case,
|
||||||
|
braces are required, and the `then` and `else` clauses must appear
|
||||||
|
correctly indented on a new line.
|
||||||
|
|
||||||
|
- **Symbol naming conventions**. These are preferred in new code, but are not
|
||||||
|
required when doing so would need changes to significant pieces of existing
|
||||||
|
code.
|
||||||
|
- Variable and namespace names are all lowercase, and may use `_` to
|
||||||
|
separate words (snake_case).
|
||||||
|
- Class member variables have a `m_` prefix.
|
||||||
|
- Global variables have a `g_` prefix.
|
||||||
|
- Constant names are all uppercase, and use `_` to separate words.
|
||||||
|
- Class names, function names and method names are UpperCamelCase
|
||||||
|
(PascalCase). Do not prefix class names with `C`.
|
||||||
|
- Test suite naming convention: The Boost test suite in file
|
||||||
|
`src/test/foo_tests.cpp` should be named `foo_tests`. Test suite names
|
||||||
|
must be unique.
|
||||||
|
|
||||||
|
- **Miscellaneous**
|
||||||
|
- `++i` is preferred over `i++`.
|
||||||
|
- `nullptr` is preferred over `NULL` or `(void*)0`.
|
||||||
|
- `static_assert` is preferred over `assert` where possible. Generally; compile-time checking is preferred over run-time checking.
|
||||||
|
- `enum class` is preferred over `enum` where possible. Scoped enumerations avoid two potential pitfalls/problems with traditional C++ enumerations: implicit conversions to int, and name clashes due to enumerators being exported to the surrounding scope.
|
||||||
|
|
||||||
Block style example:
|
Block style example:
|
||||||
```c++
|
```c++
|
||||||
namespace foo
|
int g_count = 0;
|
||||||
{
|
|
||||||
|
namespace foo {
|
||||||
class Class
|
class Class
|
||||||
{
|
{
|
||||||
bool Function(char* psz, int n)
|
std::string m_name;
|
||||||
|
|
||||||
|
public:
|
||||||
|
bool Function(const std::string& s, int n)
|
||||||
{
|
{
|
||||||
// Comment summarising what this section of code does
|
// Comment summarising what this section of code does
|
||||||
for (int i = 0; i < n; i++) {
|
for (int i = 0; i < n; ++i) {
|
||||||
|
int total_sum = 0;
|
||||||
// When something fails, return early
|
// When something fails, return early
|
||||||
if (!Something())
|
if (!Something()) return false;
|
||||||
return false;
|
|
||||||
...
|
...
|
||||||
|
if (SomethingElse(i)) {
|
||||||
|
total_sum += ComputeSomething(g_count);
|
||||||
|
} else {
|
||||||
|
DoSomething(m_name, total_sum);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Success return is usually at the end
|
// Success return is usually at the end
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} // namespace foo
|
||||||
```
|
```
|
||||||
|
|
||||||
Doxygen comments
|
Doxygen comments
|
||||||
|
@ -95,57 +172,146 @@ Not OK (used plenty in the current source, but not picked up):
|
||||||
A full list of comment syntaxes picked up by doxygen can be found at http://www.stack.nl/~dimitri/doxygen/manual/docblocks.html,
|
A full list of comment syntaxes picked up by doxygen can be found at http://www.stack.nl/~dimitri/doxygen/manual/docblocks.html,
|
||||||
but if possible use one of the above styles.
|
but if possible use one of the above styles.
|
||||||
|
|
||||||
|
Documentation can be generated with `make docs` and cleaned up with `make clean-docs`.
|
||||||
|
|
||||||
Development tips and tricks
|
Development tips and tricks
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
||||||
**compiling for debugging**
|
### Compiling for debugging
|
||||||
|
|
||||||
Run configure with the --enable-debug option, then make. Or run configure with
|
Run configure with `--enable-debug` to add additional compiler flags that
|
||||||
CXXFLAGS="-g -ggdb -O0" or whatever debug flags you need.
|
produce better debugging builds.
|
||||||
|
|
||||||
**debug.log**
|
### Compiling for gprof profiling
|
||||||
|
|
||||||
|
Run configure with the `--enable-gprof` option, then make.
|
||||||
|
|
||||||
|
### debug.log
|
||||||
|
|
||||||
If the code is behaving strangely, take a look in the debug.log file in the data directory;
|
If the code is behaving strangely, take a look in the debug.log file in the data directory;
|
||||||
error and debugging messages are written there.
|
error and debugging messages are written there.
|
||||||
|
|
||||||
The -debug=... command-line option controls debugging; running with just -debug or -debug=1 will turn
|
The `-debug=...` command-line option controls debugging; running with just `-debug` or `-debug=1` will turn
|
||||||
on all categories (and give you a very large debug.log file).
|
on all categories (and give you a very large debug.log file).
|
||||||
|
|
||||||
The Qt code routes qDebug() output to debug.log under category "qt": run with -debug=qt
|
The Qt code routes `qDebug()` output to debug.log under category "qt": run with `-debug=qt`
|
||||||
to see it.
|
to see it.
|
||||||
|
|
||||||
**testnet and regtest modes**
|
### 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 bitcoins" on the test network, if you
|
||||||
are testing multi-machine code that needs to operate across the internet.
|
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.
|
If you are testing something that can run on one machine, run with the `-regtest` option.
|
||||||
In regression test mode, blocks can be created on-demand; see qa/rpc-tests/ for tests
|
In regression test mode, blocks can be created on-demand; see [test/functional/](/test/functional) for tests
|
||||||
that run in -regtest mode.
|
that run in `-regtest` mode.
|
||||||
|
|
||||||
**DEBUG_LOCKORDER**
|
### DEBUG_LOCKORDER
|
||||||
|
|
||||||
Bitcoin Core is a multithreaded application, and deadlocks or other multithreading bugs
|
Bitcoin Core is a multi-threaded application, and deadlocks or other
|
||||||
can be very difficult to track down. Compiling with -DDEBUG_LOCKORDER (configure
|
multi-threading bugs can be very difficult to track down. The `--enable-debug`
|
||||||
CXXFLAGS="-DDEBUG_LOCKORDER -g") inserts run-time checks to keep track of which locks
|
configure option adds `-DDEBUG_LOCKORDER` to the compiler flags. This inserts
|
||||||
are held, and adds warnings to the debug.log file if inconsistencies are detected.
|
run-time checks to keep track of which locks are held, and adds warnings to the
|
||||||
|
debug.log file if inconsistencies are detected.
|
||||||
|
|
||||||
|
### Valgrind suppressions file
|
||||||
|
|
||||||
|
Valgrind is a programming tool for memory debugging, memory leak detection, and
|
||||||
|
profiling. The repo contains a Valgrind suppressions file
|
||||||
|
([`valgrind.supp`](https://github.com/bitcoin/bitcoin/blob/master/contrib/valgrind.supp))
|
||||||
|
which includes known Valgrind warnings in our dependencies that cannot be fixed
|
||||||
|
in-tree. Example use:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ valgrind --suppressions=contrib/valgrind.supp src/test/test_bitcoin
|
||||||
|
$ valgrind --suppressions=contrib/valgrind.supp --leak-check=full \
|
||||||
|
--show-leak-kinds=all src/test/test_bitcoin --log_level=test_suite
|
||||||
|
$ valgrind -v --leak-check=full src/bitcoind -printtoconsole
|
||||||
|
```
|
||||||
|
|
||||||
|
### Compiling for test coverage
|
||||||
|
|
||||||
|
LCOV can be used to generate a test coverage report based upon `make check`
|
||||||
|
execution. LCOV must be installed on your system (e.g. the `lcov` package
|
||||||
|
on Debian/Ubuntu).
|
||||||
|
|
||||||
|
To enable LCOV report generation during test runs:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
./configure --enable-lcov
|
||||||
|
make
|
||||||
|
make cov
|
||||||
|
|
||||||
|
# A coverage report will now be accessible at `./test_bitcoin.coverage/index.html`.
|
||||||
|
```
|
||||||
|
|
||||||
|
**Sanitizers**
|
||||||
|
|
||||||
|
Bitcoin can be compiled with various "sanitizers" enabled, which add
|
||||||
|
instrumentation for issues regarding things like memory safety, thread race
|
||||||
|
conditions, or undefined behavior. This is controlled with the
|
||||||
|
`--with-sanitizers` configure flag, which should be a comma separated list of
|
||||||
|
sanitizers to enable. The sanitizer list should correspond to supported
|
||||||
|
`-fsanitize=` options in your compiler. These sanitizers have runtime overhead,
|
||||||
|
so they are most useful when testing changes or producing debugging builds.
|
||||||
|
|
||||||
|
Some examples:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Enable both the address sanitizer and the undefined behavior sanitizer
|
||||||
|
./configure --with-sanitizers=address,undefined
|
||||||
|
|
||||||
|
# Enable the thread sanitizer
|
||||||
|
./configure --with-sanitizers=thread
|
||||||
|
```
|
||||||
|
|
||||||
|
If you are compiling with GCC you will typically need to install corresponding
|
||||||
|
"san" libraries to actually compile with these flags, e.g. libasan for the
|
||||||
|
address sanitizer, libtsan for the thread sanitizer, and libubsan for the
|
||||||
|
undefined sanitizer. If you are missing required libraries, the configure script
|
||||||
|
will fail with a linker error when testing the sanitizer flags.
|
||||||
|
|
||||||
|
The test suite should pass cleanly with the `thread` and `undefined` sanitizers,
|
||||||
|
but there are a number of known problems when using the `address` sanitizer. The
|
||||||
|
address sanitizer is known to fail in
|
||||||
|
[sha256_sse4::Transform](/src/crypto/sha256_sse4.cpp) which makes it unusable
|
||||||
|
unless you also use `--disable-asm` when running configure. We would like to fix
|
||||||
|
sanitizer issues, so please send pull requests if you can fix any errors found
|
||||||
|
by the address sanitizer (or any other sanitizer).
|
||||||
|
|
||||||
|
Not all sanitizer options can be enabled at the same time, e.g. trying to build
|
||||||
|
with `--with-sanitizers=address,thread` will fail in the configure script as
|
||||||
|
these sanitizers are mutually incompatible. Refer to your compiler manual to
|
||||||
|
learn more about these options and which sanitizers are supported by your
|
||||||
|
compiler.
|
||||||
|
|
||||||
|
Additional resources:
|
||||||
|
|
||||||
|
* [AddressSanitizer](https://clang.llvm.org/docs/AddressSanitizer.html)
|
||||||
|
* [LeakSanitizer](https://clang.llvm.org/docs/LeakSanitizer.html)
|
||||||
|
* [MemorySanitizer](https://clang.llvm.org/docs/MemorySanitizer.html)
|
||||||
|
* [ThreadSanitizer](https://clang.llvm.org/docs/ThreadSanitizer.html)
|
||||||
|
* [UndefinedBehaviorSanitizer](https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html)
|
||||||
|
* [GCC Instrumentation Options](https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html)
|
||||||
|
* [Google Sanitizers Wiki](https://github.com/google/sanitizers/wiki)
|
||||||
|
* [Issue #12691: Enable -fsanitize flags in Travis](https://github.com/bitcoin/bitcoin/issues/12691)
|
||||||
|
|
||||||
Locking/mutex usage notes
|
Locking/mutex usage notes
|
||||||
-------------------------
|
-------------------------
|
||||||
|
|
||||||
The code is multi-threaded, and uses mutexes and the
|
The code is multi-threaded, and uses mutexes and the
|
||||||
LOCK/TRY_LOCK macros to protect data structures.
|
`LOCK` and `TRY_LOCK` macros to protect data structures.
|
||||||
|
|
||||||
Deadlocks due to inconsistent lock ordering (thread 1 locks cs_main
|
Deadlocks due to inconsistent lock ordering (thread 1 locks `cs_main` and then
|
||||||
and then cs_wallet, while thread 2 locks them in the opposite order:
|
`cs_wallet`, while thread 2 locks them in the opposite order: result, deadlock
|
||||||
result, deadlock as each waits for the other to release its lock) are
|
as each waits for the other to release its lock) are a problem. Compile with
|
||||||
a problem. Compile with -DDEBUG_LOCKORDER to get lock order
|
`-DDEBUG_LOCKORDER` (or use `--enable-debug`) to get lock order inconsistencies
|
||||||
inconsistencies reported in the debug.log file.
|
reported in the debug.log file.
|
||||||
|
|
||||||
Re-architecting the core code so there are better-defined interfaces
|
Re-architecting the core code so there are better-defined interfaces
|
||||||
between the various components is a goal, with any necessary locking
|
between the various components is a goal, with any necessary locking
|
||||||
done by the components (e.g. see the self-contained CKeyStore class
|
done by the components (e.g. see the self-contained `CBasicKeyStore` class
|
||||||
and its cs_KeyStore lock for example).
|
and its `cs_KeyStore` lock for example).
|
||||||
|
|
||||||
Threads
|
Threads
|
||||||
-------
|
-------
|
||||||
|
@ -170,12 +336,8 @@ Threads
|
||||||
|
|
||||||
- DumpAddresses : Dumps IP addresses of nodes to peers.dat.
|
- DumpAddresses : Dumps IP addresses of nodes to peers.dat.
|
||||||
|
|
||||||
- ThreadFlushWalletDB : Close the wallet.dat file if it hasn't been used in 500ms.
|
|
||||||
|
|
||||||
- ThreadRPCServer : Remote procedure call handler, listens on port 8332 for connections and services them.
|
- ThreadRPCServer : Remote procedure call handler, listens on port 8332 for connections and services them.
|
||||||
|
|
||||||
- BitcoinMiner : Generates bitcoins (if wallet is enabled).
|
|
||||||
|
|
||||||
- Shutdown : Does an orderly shutdown of everything.
|
- Shutdown : Does an orderly shutdown of everything.
|
||||||
|
|
||||||
Ignoring IDE/editor files
|
Ignoring IDE/editor files
|
||||||
|
@ -240,7 +402,7 @@ Wallet
|
||||||
|
|
||||||
- *Rationale*: In RPC code that conditionally uses the wallet (such as
|
- *Rationale*: In RPC code that conditionally uses the wallet (such as
|
||||||
`validateaddress`) it is easy to forget that global pointer `pwalletMain`
|
`validateaddress`) it is easy to forget that global pointer `pwalletMain`
|
||||||
can be NULL. See `qa/rpc-tests/disablewallet.py` for functional tests
|
can be nullptr. See `test/functional/disablewallet.py` for functional tests
|
||||||
exercising the API with `-disablewallet`
|
exercising the API with `-disablewallet`
|
||||||
|
|
||||||
- Include `db_cxx.h` (BerkeleyDB header) only when `ENABLE_WALLET` is set
|
- Include `db_cxx.h` (BerkeleyDB header) only when `ENABLE_WALLET` is set
|
||||||
|
@ -252,7 +414,7 @@ General C++
|
||||||
|
|
||||||
- Assertions should not have side-effects
|
- Assertions should not have side-effects
|
||||||
|
|
||||||
- *Rationale*: Even though the source code is set to to refuse to compile
|
- *Rationale*: Even though the source code is set to refuse to compile
|
||||||
with assertions disabled, having side-effects in assertions is unexpected and
|
with assertions disabled, having side-effects in assertions is unexpected and
|
||||||
makes the code harder to understand
|
makes the code harder to understand
|
||||||
|
|
||||||
|
@ -263,7 +425,7 @@ General C++
|
||||||
the `.h` to the `.cpp` should not result in build errors
|
the `.h` to the `.cpp` should not result in build errors
|
||||||
|
|
||||||
- Use the RAII (Resource Acquisition Is Initialization) paradigm where possible. For example by using
|
- Use the RAII (Resource Acquisition Is Initialization) paradigm where possible. For example by using
|
||||||
`scoped_pointer` for allocations in a function.
|
`unique_ptr` for allocations in a function.
|
||||||
|
|
||||||
- *Rationale*: This avoids memory and resource leaks, and ensures exception safety
|
- *Rationale*: This avoids memory and resource leaks, and ensures exception safety
|
||||||
|
|
||||||
|
@ -282,19 +444,33 @@ C++ data structures
|
||||||
- *Rationale*: Behavior is undefined. In C++ parlor this means "may reformat
|
- *Rationale*: Behavior is undefined. In C++ parlor this means "may reformat
|
||||||
the universe", in practice this has resulted in at least one hard-to-debug crash bug
|
the universe", in practice this has resulted in at least one hard-to-debug crash bug
|
||||||
|
|
||||||
- Watch out for vector out-of-bounds exceptions. `&vch[0]` is illegal for an
|
- Watch out for out-of-bounds vector access. `&vch[vch.size()]` is illegal,
|
||||||
empty vector, `&vch[vch.size()]` is always illegal. Use `begin_ptr(vch)` and
|
including `&vch[0]` for an empty vector. Use `vch.data()` and `vch.data() +
|
||||||
`end_ptr(vch)` to get the begin and end pointer instead (defined in
|
vch.size()` instead.
|
||||||
`serialize.h`)
|
|
||||||
|
|
||||||
- Vector bounds checking is only enabled in debug mode. Do not rely on it
|
- Vector bounds checking is only enabled in debug mode. Do not rely on it
|
||||||
|
|
||||||
- Make sure that constructors initialize all fields. If this is skipped for a
|
- Initialize all non-static class members where they are defined.
|
||||||
good reason (i.e., optimization on the critical path), add an explicit
|
If this is skipped for a good reason (i.e., optimization on the critical
|
||||||
comment about this
|
path), add an explicit comment about this
|
||||||
|
|
||||||
- *Rationale*: Ensure determinism by avoiding accidental use of uninitialized
|
- *Rationale*: Ensure determinism by avoiding accidental use of uninitialized
|
||||||
values. Also, static analyzers balk about this.
|
values. Also, static analyzers balk about this.
|
||||||
|
Initializing the members in the declaration makes it easy to
|
||||||
|
spot uninitialized ones.
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
class A
|
||||||
|
{
|
||||||
|
uint32_t m_count{0};
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- By default, declare single-argument constructors `explicit`.
|
||||||
|
|
||||||
|
- *Rationale*: This is a precaution to avoid unintended conversions that might
|
||||||
|
arise when single-argument constructors are used as implicit conversion
|
||||||
|
functions.
|
||||||
|
|
||||||
- Use explicitly signed or unsigned `char`s, or even better `uint8_t` and
|
- Use explicitly signed or unsigned `char`s, or even better `uint8_t` and
|
||||||
`int8_t`. Do not use bare `char` unless it is to pass to a third-party API.
|
`int8_t`. Do not use bare `char` unless it is to pass to a third-party API.
|
||||||
|
@ -321,14 +497,67 @@ Strings and formatting
|
||||||
buffer overflows and surprises with `\0` characters. Also some C string manipulations
|
buffer overflows and surprises with `\0` characters. Also some C string manipulations
|
||||||
tend to act differently depending on platform, or even the user locale
|
tend to act differently depending on platform, or even the user locale
|
||||||
|
|
||||||
- Use `ParseInt32`, `ParseInt64`, `ParseDouble` from `utilstrencodings.h` for number parsing
|
- Use `ParseInt32`, `ParseInt64`, `ParseUInt32`, `ParseUInt64`, `ParseDouble` from `utilstrencodings.h` for number parsing
|
||||||
|
|
||||||
- *Rationale*: These functions do overflow checking, and avoid pesky locale issues
|
- *Rationale*: These functions do overflow checking, and avoid pesky locale issues.
|
||||||
|
|
||||||
|
- Avoid using locale dependent functions if possible. You can use the provided
|
||||||
|
[`lint-locale-dependence.sh`](/contrib/devtools/lint-locale-dependence.sh)
|
||||||
|
to check for accidental use of locale dependent functions.
|
||||||
|
|
||||||
|
- *Rationale*: Unnecessary locale dependence can cause bugs that are very tricky to isolate and fix.
|
||||||
|
|
||||||
|
- These functions are known to be locale dependent:
|
||||||
|
`alphasort`, `asctime`, `asprintf`, `atof`, `atoi`, `atol`, `atoll`, `atoq`,
|
||||||
|
`btowc`, `ctime`, `dprintf`, `fgetwc`, `fgetws`, `fprintf`, `fputwc`,
|
||||||
|
`fputws`, `fscanf`, `fwprintf`, `getdate`, `getwc`, `getwchar`, `isalnum`,
|
||||||
|
`isalpha`, `isblank`, `iscntrl`, `isdigit`, `isgraph`, `islower`, `isprint`,
|
||||||
|
`ispunct`, `isspace`, `isupper`, `iswalnum`, `iswalpha`, `iswblank`,
|
||||||
|
`iswcntrl`, `iswctype`, `iswdigit`, `iswgraph`, `iswlower`, `iswprint`,
|
||||||
|
`iswpunct`, `iswspace`, `iswupper`, `iswxdigit`, `isxdigit`, `mblen`,
|
||||||
|
`mbrlen`, `mbrtowc`, `mbsinit`, `mbsnrtowcs`, `mbsrtowcs`, `mbstowcs`,
|
||||||
|
`mbtowc`, `mktime`, `putwc`, `putwchar`, `scanf`, `snprintf`, `sprintf`,
|
||||||
|
`sscanf`, `stoi`, `stol`, `stoll`, `strcasecmp`, `strcasestr`, `strcoll`,
|
||||||
|
`strfmon`, `strftime`, `strncasecmp`, `strptime`, `strtod`, `strtof`,
|
||||||
|
`strtoimax`, `strtol`, `strtold`, `strtoll`, `strtoq`, `strtoul`,
|
||||||
|
`strtoull`, `strtoumax`, `strtouq`, `strxfrm`, `swprintf`, `tolower`,
|
||||||
|
`toupper`, `towctrans`, `towlower`, `towupper`, `ungetwc`, `vasprintf`,
|
||||||
|
`vdprintf`, `versionsort`, `vfprintf`, `vfscanf`, `vfwprintf`, `vprintf`,
|
||||||
|
`vscanf`, `vsnprintf`, `vsprintf`, `vsscanf`, `vswprintf`, `vwprintf`,
|
||||||
|
`wcrtomb`, `wcscasecmp`, `wcscoll`, `wcsftime`, `wcsncasecmp`, `wcsnrtombs`,
|
||||||
|
`wcsrtombs`, `wcstod`, `wcstof`, `wcstoimax`, `wcstol`, `wcstold`,
|
||||||
|
`wcstoll`, `wcstombs`, `wcstoul`, `wcstoull`, `wcstoumax`, `wcswidth`,
|
||||||
|
`wcsxfrm`, `wctob`, `wctomb`, `wctrans`, `wctype`, `wcwidth`, `wprintf`
|
||||||
|
|
||||||
- For `strprintf`, `LogPrint`, `LogPrintf` formatting characters don't need size specifiers
|
- For `strprintf`, `LogPrint`, `LogPrintf` formatting characters don't need size specifiers
|
||||||
|
|
||||||
- *Rationale*: Bitcoin Core uses tinyformat, which is type safe. Leave them out to avoid confusion
|
- *Rationale*: Bitcoin Core uses tinyformat, which is type safe. Leave them out to avoid confusion
|
||||||
|
|
||||||
|
Variable names
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Although the shadowing warning (`-Wshadow`) is not enabled by default (it prevents issues rising
|
||||||
|
from using a different variable with the same name),
|
||||||
|
please name variables so that their names do not shadow variables defined in the source code.
|
||||||
|
|
||||||
|
E.g. in member initializers, prepend `_` to the argument name shadowing the
|
||||||
|
member name:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
class AddressBookPage
|
||||||
|
{
|
||||||
|
Mode m_mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
AddressBookPage::AddressBookPage(Mode _mode) :
|
||||||
|
m_mode(_mode)
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
When using nested cycles, do not name the inner cycle variable the same as in
|
||||||
|
upper cycle etc.
|
||||||
|
|
||||||
|
|
||||||
Threads and synchronization
|
Threads and synchronization
|
||||||
----------------------------
|
----------------------------
|
||||||
|
|
||||||
|
@ -366,11 +595,57 @@ Source code organization
|
||||||
|
|
||||||
- *Rationale*: Shorter and simpler header files are easier to read, and reduce compile time
|
- *Rationale*: Shorter and simpler header files are easier to read, and reduce compile time
|
||||||
|
|
||||||
|
- Use only the lowercase alphanumerics (`a-z0-9`), underscore (`_`) and hyphen (`-`) in source code filenames.
|
||||||
|
|
||||||
|
- *Rationale*: `grep`:ing and auto-completing filenames is easier when using a consistent
|
||||||
|
naming pattern. Potential problems when building on case-insensitive filesystems are
|
||||||
|
avoided when using only lowercase characters in source code filenames.
|
||||||
|
|
||||||
|
- Every `.cpp` and `.h` file should `#include` every header file it directly uses classes, functions or other
|
||||||
|
definitions from, even if those headers are already included indirectly through other headers.
|
||||||
|
|
||||||
|
- *Rationale*: Excluding headers because they are already indirectly included results in compilation
|
||||||
|
failures when those indirect dependencies change. Furthermore, it obscures what the real code
|
||||||
|
dependencies are.
|
||||||
|
|
||||||
- Don't import anything into the global namespace (`using namespace ...`). Use
|
- Don't import anything into the global namespace (`using namespace ...`). Use
|
||||||
fully specified types such as `std::string`.
|
fully specified types such as `std::string`.
|
||||||
|
|
||||||
- *Rationale*: Avoids symbol conflicts
|
- *Rationale*: Avoids symbol conflicts
|
||||||
|
|
||||||
|
- Terminate namespaces with a comment (`// namespace mynamespace`). The comment
|
||||||
|
should be placed on the same line as the brace closing the namespace, e.g.
|
||||||
|
|
||||||
|
```c++
|
||||||
|
namespace mynamespace {
|
||||||
|
...
|
||||||
|
} // namespace mynamespace
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
...
|
||||||
|
} // namespace
|
||||||
|
```
|
||||||
|
|
||||||
|
- *Rationale*: Avoids confusion about the namespace context
|
||||||
|
|
||||||
|
- Use `#include <primitives/transaction.h>` bracket syntax instead of
|
||||||
|
`#include "primitives/transactions.h"` quote syntax.
|
||||||
|
|
||||||
|
- *Rationale*: Bracket syntax is less ambiguous because the preprocessor
|
||||||
|
searches a fixed list of include directories without taking location of the
|
||||||
|
source file into account. This allows quoted includes to stand out more when
|
||||||
|
the location of the source file actually is relevant.
|
||||||
|
|
||||||
|
- Use include guards to avoid the problem of double inclusion. The header file
|
||||||
|
`foo/bar.h` should use the include guard identifier `BITCOIN_FOO_BAR_H`, e.g.
|
||||||
|
|
||||||
|
```c++
|
||||||
|
#ifndef BITCOIN_FOO_BAR_H
|
||||||
|
#define BITCOIN_FOO_BAR_H
|
||||||
|
...
|
||||||
|
#endif // BITCOIN_FOO_BAR_H
|
||||||
|
```
|
||||||
|
|
||||||
GUI
|
GUI
|
||||||
-----
|
-----
|
||||||
|
|
||||||
|
@ -379,3 +654,265 @@ GUI
|
||||||
- *Rationale*: Model classes pass through events and data from the core, they
|
- *Rationale*: Model classes pass through events and data from the core, they
|
||||||
should not interact with the user. That's where View classes come in. The converse also
|
should not interact with the user. That's where View classes come in. The converse also
|
||||||
holds: try to not directly access core data structures from Views.
|
holds: try to not directly access core data structures from Views.
|
||||||
|
|
||||||
|
- Avoid adding slow or blocking code in the GUI thread. In particular do not
|
||||||
|
add new `interfaces::Node` and `interfaces::Wallet` method calls, even if they
|
||||||
|
may be fast now, in case they are changed to lock or communicate across
|
||||||
|
processes in the future.
|
||||||
|
|
||||||
|
Prefer to offload work from the GUI thread to worker threads (see
|
||||||
|
`RPCExecutor` in console code as an example) or take other steps (see
|
||||||
|
https://doc.qt.io/archives/qq/qq27-responsive-guis.html) to keep the GUI
|
||||||
|
responsive.
|
||||||
|
|
||||||
|
- *Rationale*: Blocking the GUI thread can increase latency, and lead to
|
||||||
|
hangs and deadlocks.
|
||||||
|
|
||||||
|
Subtrees
|
||||||
|
----------
|
||||||
|
|
||||||
|
Several parts of the repository are subtrees of software maintained elsewhere.
|
||||||
|
|
||||||
|
Some of these are maintained by active developers of Bitcoin Core, in which case changes should probably go
|
||||||
|
directly upstream without being PRed directly against the project. They will be merged back in the next
|
||||||
|
subtree merge.
|
||||||
|
|
||||||
|
Others are external projects without a tight relationship with our project. Changes to these should also
|
||||||
|
be sent upstream but bugfixes may also be prudent to PR against Bitcoin Core so that they can be integrated
|
||||||
|
quickly. Cosmetic changes should be purely taken upstream.
|
||||||
|
|
||||||
|
There is a tool in `test/lint/git-subtree-check.sh` to check a subtree directory for consistency with
|
||||||
|
its upstream repository.
|
||||||
|
|
||||||
|
Current subtrees include:
|
||||||
|
|
||||||
|
- src/leveldb
|
||||||
|
- Upstream at https://github.com/google/leveldb ; Maintained by Google, but
|
||||||
|
open important PRs to Core to avoid delay.
|
||||||
|
- **Note**: Follow the instructions in [Upgrading LevelDB](#upgrading-leveldb) when
|
||||||
|
merging upstream changes to the leveldb subtree.
|
||||||
|
|
||||||
|
- src/libsecp256k1
|
||||||
|
- Upstream at https://github.com/bitcoin-core/secp256k1/ ; actively maintaned by Core contributors.
|
||||||
|
|
||||||
|
- src/crypto/ctaes
|
||||||
|
- Upstream at https://github.com/bitcoin-core/ctaes ; actively maintained by Core contributors.
|
||||||
|
|
||||||
|
- src/univalue
|
||||||
|
- Upstream at https://github.com/jgarzik/univalue ; report important PRs to Core to avoid delay.
|
||||||
|
|
||||||
|
Upgrading LevelDB
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
Extra care must be taken when upgrading LevelDB. This section explains issues
|
||||||
|
you must be aware of.
|
||||||
|
|
||||||
|
### File Descriptor Counts
|
||||||
|
|
||||||
|
In most configurations we use the default LevelDB value for `max_open_files`,
|
||||||
|
which is 1000 at the time of this writing. If LevelDB actually uses this many
|
||||||
|
file descriptors it will cause problems with Bitcoin's `select()` loop, because
|
||||||
|
it may cause new sockets to be created where the fd value is >= 1024. For this
|
||||||
|
reason, on 64-bit Unix systems we rely on an internal LevelDB optimization that
|
||||||
|
uses `mmap()` + `close()` to open table files without actually retaining
|
||||||
|
references to the table file descriptors. If you are upgrading LevelDB, you must
|
||||||
|
sanity check the changes to make sure that this assumption remains valid.
|
||||||
|
|
||||||
|
In addition to reviewing the upstream changes in `env_posix.cc`, you can use `lsof` to
|
||||||
|
check this. For example, on Linux this command will show open `.ldb` file counts:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ lsof -p $(pidof bitcoind) |\
|
||||||
|
awk 'BEGIN { fd=0; mem=0; } /ldb$/ { if ($4 == "mem") mem++; else fd++ } END { printf "mem = %s, fd = %s\n", mem, fd}'
|
||||||
|
mem = 119, fd = 0
|
||||||
|
```
|
||||||
|
|
||||||
|
The `mem` value shows how many files are mmap'ed, and the `fd` value shows you
|
||||||
|
many file descriptors these files are using. You should check that `fd` is a
|
||||||
|
small number (usually 0 on 64-bit hosts).
|
||||||
|
|
||||||
|
See the notes in the `SetMaxOpenFiles()` function in `dbwrapper.cc` for more
|
||||||
|
details.
|
||||||
|
|
||||||
|
### Consensus Compatibility
|
||||||
|
|
||||||
|
It is possible for LevelDB changes to inadvertently change consensus
|
||||||
|
compatibility between nodes. This happened in Bitcoin 0.8 (when LevelDB was
|
||||||
|
first introduced). When upgrading LevelDB you should review the upstream changes
|
||||||
|
to check for issues affecting consensus compatibility.
|
||||||
|
|
||||||
|
For example, if LevelDB had a bug that accidentally prevented a key from being
|
||||||
|
returned in an edge case, and that bug was fixed upstream, the bug "fix" would
|
||||||
|
be an incompatible consensus change. In this situation the correct behavior
|
||||||
|
would be to revert the upstream fix before applying the updates to Bitcoin's
|
||||||
|
copy of LevelDB. In general you should be wary of any upstream changes affecting
|
||||||
|
what data is returned from LevelDB queries.
|
||||||
|
|
||||||
|
Git and GitHub tips
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
- For resolving merge/rebase conflicts, it can be useful to enable diff3 style using
|
||||||
|
`git config merge.conflictstyle diff3`. Instead of
|
||||||
|
|
||||||
|
<<<
|
||||||
|
yours
|
||||||
|
===
|
||||||
|
theirs
|
||||||
|
>>>
|
||||||
|
|
||||||
|
you will see
|
||||||
|
|
||||||
|
<<<
|
||||||
|
yours
|
||||||
|
|||
|
||||||
|
original
|
||||||
|
===
|
||||||
|
theirs
|
||||||
|
>>>
|
||||||
|
|
||||||
|
This may make it much clearer what caused the conflict. In this style, you can often just look
|
||||||
|
at what changed between *original* and *theirs*, and mechanically apply that to *yours* (or the other way around).
|
||||||
|
|
||||||
|
- When reviewing patches which change indentation in C++ files, use `git diff -w` and `git show -w`. This makes
|
||||||
|
the diff algorithm ignore whitespace changes. This feature is also available on github.com, by adding `?w=1`
|
||||||
|
at the end of any URL which shows a diff.
|
||||||
|
|
||||||
|
- When reviewing patches that change symbol names in many places, use `git diff --word-diff`. This will instead
|
||||||
|
of showing the patch as deleted/added *lines*, show deleted/added *words*.
|
||||||
|
|
||||||
|
- When reviewing patches that move code around, try using
|
||||||
|
`git diff --patience commit~:old/file.cpp commit:new/file/name.cpp`, and ignoring everything except the
|
||||||
|
moved body of code which should show up as neither `+` or `-` lines. In case it was not a pure move, this may
|
||||||
|
even work when combined with the `-w` or `--word-diff` options described above.
|
||||||
|
|
||||||
|
- When looking at other's pull requests, it may make sense to add the following section to your `.git/config`
|
||||||
|
file:
|
||||||
|
|
||||||
|
[remote "upstream-pull"]
|
||||||
|
fetch = +refs/pull/*:refs/remotes/upstream-pull/*
|
||||||
|
url = git@github.com:bitcoin/bitcoin.git
|
||||||
|
|
||||||
|
This will add an `upstream-pull` remote to your git repository, which can be fetched using `git fetch --all`
|
||||||
|
or `git fetch upstream-pull`. Afterwards, you can use `upstream-pull/NUMBER/head` in arguments to `git show`,
|
||||||
|
`git checkout` and anywhere a commit id would be acceptable to see the changes from pull request NUMBER.
|
||||||
|
|
||||||
|
Scripted diffs
|
||||||
|
--------------
|
||||||
|
|
||||||
|
For reformatting and refactoring commits where the changes can be easily automated using a bash script, we use
|
||||||
|
scripted-diff commits. The bash script is included in the commit message and our Travis CI job checks that
|
||||||
|
the result of the script is identical to the commit. This aids reviewers since they can verify that the script
|
||||||
|
does exactly what it's supposed to do. It is also helpful for rebasing (since the same script can just be re-run
|
||||||
|
on the new master commit).
|
||||||
|
|
||||||
|
To create a scripted-diff:
|
||||||
|
|
||||||
|
- start the commit message with `scripted-diff:` (and then a description of the diff on the same line)
|
||||||
|
- in the commit message include the bash script between lines containing just the following text:
|
||||||
|
- `-BEGIN VERIFY SCRIPT-`
|
||||||
|
- `-END VERIFY SCRIPT-`
|
||||||
|
|
||||||
|
The scripted-diff is verified by the tool `test/lint/commit-script-check.sh`
|
||||||
|
|
||||||
|
Commit [`bb81e173`](https://github.com/bitcoin/bitcoin/commit/bb81e173) is an example of a scripted-diff.
|
||||||
|
|
||||||
|
RPC interface guidelines
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
A few guidelines for introducing and reviewing new RPC interfaces:
|
||||||
|
|
||||||
|
- Method naming: use consecutive lower-case names such as `getrawtransaction` and `submitblock`
|
||||||
|
|
||||||
|
- *Rationale*: Consistency with existing interface.
|
||||||
|
|
||||||
|
- Argument naming: use snake case `fee_delta` (and not, e.g. camel case `feeDelta`)
|
||||||
|
|
||||||
|
- *Rationale*: Consistency with existing interface.
|
||||||
|
|
||||||
|
- Use the JSON parser for parsing, don't manually parse integers or strings from
|
||||||
|
arguments unless absolutely necessary.
|
||||||
|
|
||||||
|
- *Rationale*: Introduces hand-rolled string manipulation code at both the caller and callee sites,
|
||||||
|
which is error prone, and it is easy to get things such as escaping wrong.
|
||||||
|
JSON already supports nested data structures, no need to re-invent the wheel.
|
||||||
|
|
||||||
|
- *Exception*: AmountFromValue can parse amounts as string. This was introduced because many JSON
|
||||||
|
parsers and formatters hard-code handling decimal numbers as floating point
|
||||||
|
values, resulting in potential loss of precision. This is unacceptable for
|
||||||
|
monetary values. **Always** use `AmountFromValue` and `ValueFromAmount` when
|
||||||
|
inputting or outputting monetary values. The only exceptions to this are
|
||||||
|
`prioritisetransaction` and `getblocktemplate` because their interface
|
||||||
|
is specified as-is in BIP22.
|
||||||
|
|
||||||
|
- Missing arguments and 'null' should be treated the same: as default values. If there is no
|
||||||
|
default value, both cases should fail in the same way. The easiest way to follow this
|
||||||
|
guideline is detect unspecified arguments with `params[x].isNull()` instead of
|
||||||
|
`params.size() <= x`. The former returns true if the argument is either null or missing,
|
||||||
|
while the latter returns true if is missing, and false if it is null.
|
||||||
|
|
||||||
|
- *Rationale*: Avoids surprises when switching to name-based arguments. Missing name-based arguments
|
||||||
|
are passed as 'null'.
|
||||||
|
|
||||||
|
- Try not to overload methods on argument type. E.g. don't make `getblock(true)` and `getblock("hash")`
|
||||||
|
do different things.
|
||||||
|
|
||||||
|
- *Rationale*: This is impossible to use with `bitcoin-cli`, and can be surprising to users.
|
||||||
|
|
||||||
|
- *Exception*: Some RPC calls can take both an `int` and `bool`, most notably when a bool was switched
|
||||||
|
to a multi-value, or due to other historical reasons. **Always** have false map to 0 and
|
||||||
|
true to 1 in this case.
|
||||||
|
|
||||||
|
- Don't forget to fill in the argument names correctly in the RPC command table.
|
||||||
|
|
||||||
|
- *Rationale*: If not, the call can not be used with name-based arguments.
|
||||||
|
|
||||||
|
- Set okSafeMode in the RPC command table to a sensible value: safe mode is when the
|
||||||
|
blockchain is regarded to be in a confused state, and the client deems it unsafe to
|
||||||
|
do anything irreversible such as send. Anything that just queries should be permitted.
|
||||||
|
|
||||||
|
- *Rationale*: Troubleshooting a node in safe mode is difficult if half the
|
||||||
|
RPCs don't work.
|
||||||
|
|
||||||
|
- Add every non-string RPC argument `(method, idx, name)` to the table `vRPCConvertParams` in `rpc/client.cpp`.
|
||||||
|
|
||||||
|
- *Rationale*: `bitcoin-cli` and the GUI debug console use this table to determine how to
|
||||||
|
convert a plaintext command line to JSON. If the types don't match, the method can be unusable
|
||||||
|
from there.
|
||||||
|
|
||||||
|
- A RPC method must either be a wallet method or a non-wallet method. Do not
|
||||||
|
introduce new methods such as `signrawtransaction` that differ in behavior
|
||||||
|
based on presence of a wallet.
|
||||||
|
|
||||||
|
- *Rationale*: as well as complicating the implementation and interfering
|
||||||
|
with the introduction of multi-wallet, wallet and non-wallet code should be
|
||||||
|
separated to avoid introducing circular dependencies between code units.
|
||||||
|
|
||||||
|
- Try to make the RPC response a JSON object.
|
||||||
|
|
||||||
|
- *Rationale*: If a RPC response is not a JSON object then it is harder to avoid API breakage if
|
||||||
|
new data in the response is needed.
|
||||||
|
|
||||||
|
- Wallet RPCs call BlockUntilSyncedToCurrentChain to maintain consistency with
|
||||||
|
`getblockchaininfo`'s state immediately prior to the call's execution. Wallet
|
||||||
|
RPCs whose behavior does *not* depend on the current chainstate may omit this
|
||||||
|
call.
|
||||||
|
|
||||||
|
- *Rationale*: In previous versions of Bitcoin Core, the wallet was always
|
||||||
|
in-sync with the chainstate (by virtue of them all being updated in the
|
||||||
|
same cs_main lock). In order to maintain the behavior that wallet RPCs
|
||||||
|
return results as of at least the highest best-known block an RPC
|
||||||
|
client may be aware of prior to entering a wallet RPC call, we must block
|
||||||
|
until the wallet is caught up to the chainstate as of the RPC call's entry.
|
||||||
|
This also makes the API much easier for RPC clients to reason about.
|
||||||
|
|
||||||
|
- Be aware of RPC method aliases and generally avoid registering the same
|
||||||
|
callback function pointer for different RPCs.
|
||||||
|
|
||||||
|
- *Rationale*: RPC methods registered with the same function pointer will be
|
||||||
|
considered aliases and only the first method name will show up in the
|
||||||
|
`help` rpc command list.
|
||||||
|
|
||||||
|
- *Exception*: Using RPC method aliases may be appropriate in cases where a
|
||||||
|
new RPC is replacing a deprecated RPC, to avoid both RPCs confusingly
|
||||||
|
showing up in the command list.
|
||||||
|
|
||||||
|
|
BIN
lbrycrdd_daemon_screenshot.png
Normal file
After Width: | Height: | Size: 49 KiB |
18
packaging/build_windows.sh
Executable file
|
@ -0,0 +1,18 @@
|
||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y --no-install-recommends \
|
||||||
|
g++-mingw-w64-i686 mingw-w64-i686-dev g++-mingw-w64-x86-64 \
|
||||||
|
mingw-w64-x86-64-dev build-essential libtool autotools-dev automake pkg-config \
|
||||||
|
libssl-dev libevent-dev bsdmainutils curl ca-certificates
|
||||||
|
|
||||||
|
cd depends
|
||||||
|
make HOST=i686-w64-mingw32 NO_QT=1
|
||||||
|
cd ..
|
||||||
|
patch -p1 < packaging/remove_consensus.patch
|
||||||
|
./autogen.sh
|
||||||
|
./configure --prefix=`pwd`/depends/i686-w64-mingw32 --without-gui
|
||||||
|
make
|
||||||
|
|
23
packaging/remove_consensus.patch
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
diff --git a/src/Makefile.am b/src/Makefile.am
|
||||||
|
index a9f0a94..d71bfeb 100644
|
||||||
|
--- a/src/Makefile.am
|
||||||
|
+++ b/src/Makefile.am
|
||||||
|
@@ -64,12 +64,12 @@ if ENABLE_ZMQ
|
||||||
|
EXTRA_LIBRARIES += libbitcoin_zmq.a
|
||||||
|
endif
|
||||||
|
|
||||||
|
-if BUILD_BITCOIN_LIBS
|
||||||
|
-lib_LTLIBRARIES = libbitcoinconsensus.la
|
||||||
|
-LIBBITCOINCONSENSUS=libbitcoinconsensus.la
|
||||||
|
-else
|
||||||
|
-LIBBITCOINCONSENSUS=
|
||||||
|
-endif
|
||||||
|
+# if BUILD_BITCOIN_LIBS
|
||||||
|
+# lib_LTLIBRARIES = libbitcoinconsensus.la
|
||||||
|
+# LIBBITCOINCONSENSUS=libbitcoinconsensus.la
|
||||||
|
+# else
|
||||||
|
+# LIBBITCOINCONSENSUS=
|
||||||
|
+# endif
|
||||||
|
|
||||||
|
bin_PROGRAMS =
|
||||||
|
TESTS =
|
|
@ -135,12 +135,12 @@ def initialize_datadir(dirname, n):
|
||||||
datadir = os.path.join(dirname, "node"+str(n))
|
datadir = os.path.join(dirname, "node"+str(n))
|
||||||
if not os.path.isdir(datadir):
|
if not os.path.isdir(datadir):
|
||||||
os.makedirs(datadir)
|
os.makedirs(datadir)
|
||||||
with open(os.path.join(datadir, "bitcoin.conf"), 'w') as f:
|
with open(os.path.join(datadir, "lbrycrd.conf"), 'w') as f:
|
||||||
f.write("regtest=1\n")
|
f.write("regtest=1\n");
|
||||||
f.write("rpcuser=rt\n")
|
f.write("rpcuser=rt\n");
|
||||||
f.write("rpcpassword=rt\n")
|
f.write("rpcpassword=rt\n");
|
||||||
f.write("port="+str(p2p_port(n))+"\n")
|
f.write("port="+str(p2p_port(n))+"\n");
|
||||||
f.write("rpcport="+str(rpc_port(n))+"\n")
|
f.write("rpcport="+str(rpc_port(n))+"\n");
|
||||||
f.write("listenonion=0\n")
|
f.write("listenonion=0\n")
|
||||||
return datadir
|
return datadir
|
||||||
|
|
||||||
|
|
412
reproducible_build.sh
Executable file
|
@ -0,0 +1,412 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
function HELP {
|
||||||
|
echo "Build lbrycrd"
|
||||||
|
echo "-----"
|
||||||
|
echo "When run without any arguments, this script expects the current directory"
|
||||||
|
echo "to be the lbrycrd repo and it builds what is in that directory"
|
||||||
|
echo
|
||||||
|
echo "This is a long build process so it can be split into two parts"
|
||||||
|
echo "Specify the -d flag to build only the dependencies"
|
||||||
|
echo "and the -l flag to build only lbrycrd. This will fail"
|
||||||
|
echo "if the dependencies weren't built earlier"
|
||||||
|
echo
|
||||||
|
echo "Optional arguments:"
|
||||||
|
echo
|
||||||
|
echo "-c: don't clone a fresh copy of the repo"
|
||||||
|
echo "-f: check formatting of committed code relative to master"
|
||||||
|
echo "-r: remove intermediate files."
|
||||||
|
echo "-l: build only lbrycrd"
|
||||||
|
echo "-d: build only the dependencies"
|
||||||
|
echo "-o: timeout build after 40 minutes"
|
||||||
|
echo "-t: turn trace on"
|
||||||
|
echo "-h: show help"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
CLONE=true
|
||||||
|
CLEAN=false
|
||||||
|
CHECK_CODE_FORMAT=false
|
||||||
|
BUILD_DEPENDENCIES=true
|
||||||
|
BUILD_LBRYCRD=true
|
||||||
|
TIMEOUT=false
|
||||||
|
THREE_MB=3145728
|
||||||
|
# this flag gets set to False if
|
||||||
|
# the script exits due to a timeout
|
||||||
|
OUTPUT_LOG=true
|
||||||
|
|
||||||
|
while getopts :crfldoth:w:d: FLAG; do
|
||||||
|
case $FLAG in
|
||||||
|
c)
|
||||||
|
CLONE=false
|
||||||
|
;;
|
||||||
|
r)
|
||||||
|
CLEAN=true
|
||||||
|
;;
|
||||||
|
f)
|
||||||
|
CHECK_CODE_FORMAT=true
|
||||||
|
;;
|
||||||
|
l)
|
||||||
|
BUILD_DEPENDENCIES=false
|
||||||
|
;;
|
||||||
|
d)
|
||||||
|
BUILD_LBRYCRD=false
|
||||||
|
;;
|
||||||
|
o)
|
||||||
|
TIMEOUT=true
|
||||||
|
;;
|
||||||
|
t)
|
||||||
|
set -o xtrace
|
||||||
|
;;
|
||||||
|
h)
|
||||||
|
HELP
|
||||||
|
;;
|
||||||
|
\?) #unrecognized option - show help
|
||||||
|
echo "Option -$OPTARG not allowed."
|
||||||
|
HELP
|
||||||
|
;;
|
||||||
|
:)
|
||||||
|
echo "Option -$OPTARG requires an argument."
|
||||||
|
HELP
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
shift $((OPTIND-1))
|
||||||
|
|
||||||
|
SUDO=''
|
||||||
|
if (( EUID != 0 )); then
|
||||||
|
SUDO='sudo'
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${CLONE}" = false ]; then
|
||||||
|
if [ "$(basename "$PWD")" != "lbrycrd" ]; then
|
||||||
|
echo "Not currently in the lbrycrd directory. Cowardly refusing to go forward"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
SOURCE_DIR=$PWD
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "${TRAVIS_OS_NAME+x}" ]; then
|
||||||
|
if [ "$(uname -s)" = "Darwin" ]; then
|
||||||
|
OS_NAME="osx"
|
||||||
|
else
|
||||||
|
OS_NAME="linux"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
OS_NAME="${TRAVIS_OS_NAME}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "${TRAVIS_BUILD_DIR+x}" ]; then
|
||||||
|
START_TIME_FILE="$PWD/start_time"
|
||||||
|
else
|
||||||
|
# if we are on travis (the primary use case for setting a timeout)
|
||||||
|
# this file is created when the build starts
|
||||||
|
START_TIME_FILE="$TRAVIS_BUILD_DIR/start_time"
|
||||||
|
fi
|
||||||
|
if [ ! -f "${START_TIME_FILE}" ]; then
|
||||||
|
date +%s > "${START_TIME_FILE}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
NEXT_TIME=60
|
||||||
|
function exit_at_40() {
|
||||||
|
if [ -f "${START_TIME_FILE}" ]; then
|
||||||
|
NOW=$(date +%s)
|
||||||
|
START=$(cat "${START_TIME_FILE}")
|
||||||
|
TIMEOUT_SECS=2400 # 40 * 60
|
||||||
|
TIME=$((NOW - START))
|
||||||
|
if (( TIME > NEXT_TIME )); then
|
||||||
|
echo "Build has taken $((TIME / 60)) minutes: $1"
|
||||||
|
NEXT_TIME=$((TIME + 60))
|
||||||
|
fi
|
||||||
|
if [ "$TIMEOUT" = true ] && (( TIME > TIMEOUT_SECS )); then
|
||||||
|
echo 'Exiting at 40 minutes to allow the cache to populate'
|
||||||
|
OUTPUT_LOG=false
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# two arguments
|
||||||
|
# - pid (probably from $!)
|
||||||
|
# - echo message
|
||||||
|
function wait_and_echo() {
|
||||||
|
PID=$1
|
||||||
|
(set -o | grep xtrace | grep -q on)
|
||||||
|
TRACE_STATUS=$?
|
||||||
|
# disable xtrace or else this will get verbose, which is what
|
||||||
|
# I'm trying to avoid by going through all of this nonsense anyway
|
||||||
|
set +o xtrace
|
||||||
|
TIME=0
|
||||||
|
SLEEP=5
|
||||||
|
# loop until the process is no longer running
|
||||||
|
# check every $SLEEP seconds, echoing a message every minute
|
||||||
|
while (ps -p "${PID}" > /dev/null); do
|
||||||
|
exit_at_40 "$2"
|
||||||
|
sleep "${SLEEP}"
|
||||||
|
done
|
||||||
|
# restore the xtrace setting
|
||||||
|
if [ "${TRACE_STATUS}" -eq 0 ]; then
|
||||||
|
set -o xtrace
|
||||||
|
fi
|
||||||
|
wait "$PID"
|
||||||
|
return $?
|
||||||
|
}
|
||||||
|
|
||||||
|
# run a command ($1) in the background
|
||||||
|
# logging its stdout and stderr to $2
|
||||||
|
# and wait until it completed
|
||||||
|
function background() {
|
||||||
|
$1 >> "$2" 2>&1 &
|
||||||
|
BACKGROUND_PID=$!
|
||||||
|
wait_and_echo $BACKGROUND_PID "$3"
|
||||||
|
}
|
||||||
|
|
||||||
|
function cleanup() {
|
||||||
|
rv=$?
|
||||||
|
# cat the log file if it exists
|
||||||
|
if [ -f "$2" ] && [ "${OUTPUT_LOG}" = true ]; then
|
||||||
|
echo
|
||||||
|
echo "Output of log file $2"
|
||||||
|
echo
|
||||||
|
tail -n 1000 "$2"
|
||||||
|
echo
|
||||||
|
fi
|
||||||
|
# delete the build directory
|
||||||
|
rm -rf "$1"
|
||||||
|
echo "Build failed. Removing $1"
|
||||||
|
exit $rv
|
||||||
|
}
|
||||||
|
|
||||||
|
function cat_and_exit() {
|
||||||
|
rv=$?
|
||||||
|
# cat the log file if it exists
|
||||||
|
if [ -f "$1" ] && [ "${OUTPUT_LOG}" = true ]; then
|
||||||
|
echo
|
||||||
|
echo "Output of log file $1"
|
||||||
|
echo
|
||||||
|
# This used to be the last 3MB but outputing that
|
||||||
|
# caused problems on travis.
|
||||||
|
# Hopefully the last 1000 lines is enough
|
||||||
|
# to debug whatever went wrong
|
||||||
|
tail -n 1000 "$1"
|
||||||
|
echo
|
||||||
|
fi
|
||||||
|
exit $rv
|
||||||
|
}
|
||||||
|
|
||||||
|
function brew_if_not_installed() {
|
||||||
|
if ! brew ls | grep $1 --quiet; then
|
||||||
|
brew install $1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_brew_packages() {
|
||||||
|
brew update > /dev/null
|
||||||
|
brew unlink python
|
||||||
|
brew_if_not_installed autoconf
|
||||||
|
brew_if_not_installed automake
|
||||||
|
# something weird happened where glibtoolize was failing to find
|
||||||
|
# sed, and reinstalling fixes it.
|
||||||
|
brew reinstall -s libtool
|
||||||
|
brew_if_not_installed pkg-config
|
||||||
|
brew_if_not_installed protobuf
|
||||||
|
brew_if_not_installed gmp
|
||||||
|
|
||||||
|
if [ "${CHECK_CODE_FORMAT}" = true ]; then
|
||||||
|
brew_if_not_installed clang-format
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_apt_packages() {
|
||||||
|
if [ -z "${TRAVIS+x}" ]; then
|
||||||
|
# if not on travis, its nice to see progress
|
||||||
|
QUIET=""
|
||||||
|
else
|
||||||
|
QUIET="-qq"
|
||||||
|
fi
|
||||||
|
# get the required OS packages
|
||||||
|
$SUDO apt-get ${QUIET} update
|
||||||
|
$SUDO apt-get ${QUIET} install -y --no-install-recommends \
|
||||||
|
build-essential python-dev libbz2-dev libtool \
|
||||||
|
autotools-dev autoconf git pkg-config wget \
|
||||||
|
ca-certificates automake bsdmainutils
|
||||||
|
|
||||||
|
if [ "${CHECK_CODE_FORMAT}" = true ]; then
|
||||||
|
$SUDO apt-get ${QUIET} install -y --no-install-recommends \
|
||||||
|
clang-format-3.4
|
||||||
|
fi
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function build_dependencies() {
|
||||||
|
if [ "${OS_NAME}" = "osx" ]; then
|
||||||
|
install_brew_packages
|
||||||
|
else
|
||||||
|
install_apt_packages
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$CLEAN" = true ]; then
|
||||||
|
rm -rf "${LBRYCRD_DEPENDENCIES}"
|
||||||
|
rm -rf "${OUTPUT_DIR}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d "${LBRYCRD_DEPENDENCIES}" ]; then
|
||||||
|
git clone https://github.com/lbryio/lbrycrd-dependencies.git "${LBRYCRD_DEPENDENCIES}"
|
||||||
|
fi
|
||||||
|
# TODO: if the repo exists, make sure its clean: revert to head.
|
||||||
|
mkdir -p "${LOG_DIR}"
|
||||||
|
|
||||||
|
build_dependency "${BDB_PREFIX}" "${LOG_DIR}/bdb_build.log" build_bdb
|
||||||
|
build_dependency "${OPENSSL_PREFIX}" "${LOG_DIR}/openssl_build.log" build_openssl
|
||||||
|
|
||||||
|
set +u
|
||||||
|
export PKG_CONFIG_PATH="${PKG_CONFIG_PATH}:${OPENSSL_PREFIX}/lib/pkgconfig/"
|
||||||
|
set -u
|
||||||
|
|
||||||
|
build_dependency "${BOOST_PREFIX}" "${LOG_DIR}/boost_build.log" build_boost
|
||||||
|
build_dependency "${LIBEVENT_PREFIX}" "${LOG_DIR}/libevent_build.log" build_libevent
|
||||||
|
}
|
||||||
|
|
||||||
|
function build_bdb() {
|
||||||
|
BDB_LOG="$1"
|
||||||
|
if [ "${OS_NAME}" = "osx" ]; then
|
||||||
|
patch db-4.8.30.NC/dbinc/atomic.h < atomic.patch
|
||||||
|
fi
|
||||||
|
cd db-4.8.30.NC/build_unix
|
||||||
|
echo "Building bdb. tail -f $BDB_LOG to see the details and monitor progress"
|
||||||
|
../dist/configure --prefix="${BDB_PREFIX}" --enable-cxx --disable-shared --with-pic > "${BDB_LOG}"
|
||||||
|
background make "${BDB_LOG}" "Waiting for bdb to finish building"
|
||||||
|
make install >> "${BDB_LOG}" 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
function build_openssl() {
|
||||||
|
OPENSSL_LOG="$1"
|
||||||
|
mkdir -p "${OPENSSL_PREFIX}/ssl"
|
||||||
|
cd openssl-1.0.1p
|
||||||
|
echo "Building openssl. tail -f $OPENSSL_LOG to see the details and monitor progress"
|
||||||
|
if [ "${OS_NAME}" = "osx" ]; then
|
||||||
|
./Configure --prefix="${OPENSSL_PREFIX}" --openssldir="${OPENSSL_PREFIX}/ssl" \
|
||||||
|
-fPIC darwin64-x86_64-cc \
|
||||||
|
no-shared no-dso no-engines > "${OPENSSL_LOG}"
|
||||||
|
else
|
||||||
|
[[ $(uname -m) = 'i686' ]] && OS_ARCH="linux-generic32" || OS_ARCH="linux-x86_64"
|
||||||
|
./Configure --prefix="${OPENSSL_PREFIX}" --openssldir="${OPENSSL_PREFIX}/ssl" \
|
||||||
|
${OS_ARCH} -fPIC -static no-shared no-dso > "${OPENSSL_LOG}"
|
||||||
|
fi
|
||||||
|
background make "${OPENSSL_LOG}" "Waiting for openssl to finish building"
|
||||||
|
make install >> "${OPENSSL_LOG}" 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
function build_boost() {
|
||||||
|
BOOST_LOG="$1"
|
||||||
|
cd boost_1_59_0
|
||||||
|
echo "Building Boost. tail -f ${BOOST_LOG} to see the details and monitor progress"
|
||||||
|
./bootstrap.sh --prefix="${BOOST_PREFIX}" > "${BOOST_LOG}" 2>&1
|
||||||
|
background "./b2 link=static cxxflags=-fPIC install" \
|
||||||
|
"${BOOST_LOG}" \
|
||||||
|
"Waiting for boost to finish building"
|
||||||
|
}
|
||||||
|
|
||||||
|
function build_libevent() {
|
||||||
|
LIBEVENT_LOG="$1"
|
||||||
|
if [ ! -d libevent ]; then
|
||||||
|
git clone --branch release-2.0.22-stable https://github.com/libevent/libevent.git
|
||||||
|
fi
|
||||||
|
cd libevent
|
||||||
|
echo "Building libevent. tail -f ${LIBEVENT_LOG} to see the details and monitor progress"
|
||||||
|
./autogen.sh > "${LIBEVENT_LOG}" 2>&1
|
||||||
|
./configure --prefix="${LIBEVENT_PREFIX}" --enable-static --disable-shared --with-pic \
|
||||||
|
LDFLAGS="-L${OPENSSL_PREFIX}/lib/" \
|
||||||
|
CPPFLAGS="-I${OPENSSL_PREFIX}/include" >> "${LIBEVENT_LOG}" 2>&1
|
||||||
|
background make "${LIBEVENT_LOG}" "Waiting for libevent to finish building"
|
||||||
|
make install >> "${LIBEVENT_LOG}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function build_dependency() {
|
||||||
|
PREFIX=$1
|
||||||
|
LOG=$2
|
||||||
|
BUILD=$3
|
||||||
|
if [ ! -d "${PREFIX}" ]; then
|
||||||
|
trap 'cleanup "${PREFIX}" "${LOG}"' INT TERM EXIT
|
||||||
|
cd "${LBRYCRD_DEPENDENCIES}"
|
||||||
|
mkdir -p "${PREFIX}"
|
||||||
|
"${BUILD}" "${LOG}"
|
||||||
|
trap - INT TERM EXIT
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function build_lbrycrd() {
|
||||||
|
if [ "$CLONE" == true ]; then
|
||||||
|
cd "${LBRYCRD_DEPENDENCIES}"
|
||||||
|
git clone https://github.com/lbryio/lbrycrd
|
||||||
|
cd lbrycrd
|
||||||
|
else
|
||||||
|
cd "${SOURCE_DIR}"
|
||||||
|
fi
|
||||||
|
./autogen.sh > "${LBRYCRD_LOG}" 2>&1
|
||||||
|
LDFLAGS="-L${OPENSSL_PREFIX}/lib/ -L${BDB_PREFIX}/lib/ -L${LIBEVENT_PREFIX}/lib/ -static-libstdc++"
|
||||||
|
CPPFLAGS="-I${OPENSSL_PREFIX}/include -I${BDB_PREFIX}/include -I${LIBEVENT_PREFIX}/include/"
|
||||||
|
if [ "${OS_NAME}" = "osx" ]; then
|
||||||
|
OPTIONS="--enable-cxx --enable-static --disable-shared --with-pic"
|
||||||
|
else
|
||||||
|
OPTIONS=""
|
||||||
|
fi
|
||||||
|
./configure --without-gui ${OPTIONS} \
|
||||||
|
--with-boost="${BOOST_PREFIX}" \
|
||||||
|
LDFLAGS="${LDFLAGS}" \
|
||||||
|
CPPFLAGS="${CPPFLAGS}" >> "${LBRYCRD_LOG}" 2>&1
|
||||||
|
background make "${LBRYCRD_LOG}" "Waiting for lbrycrd to finish building"
|
||||||
|
src/test/test_lbrycrd
|
||||||
|
strip src/lbrycrdd
|
||||||
|
strip src/lbrycrd-cli
|
||||||
|
strip src/lbrycrd-tx
|
||||||
|
strip src/test/test_lbrycrd
|
||||||
|
}
|
||||||
|
|
||||||
|
function clang_format_diff(){
|
||||||
|
# run a code formatting check on any commits not in master
|
||||||
|
# requires clang-format
|
||||||
|
if ! git config remote.origin2.url > /dev/null; then
|
||||||
|
git remote add origin2 https://github.com/lbryio/lbrycrd.git
|
||||||
|
fi
|
||||||
|
git fetch origin2
|
||||||
|
git diff -U0 origin2/master -- '*.h' '*.cpp' | ./contrib/devtools/clang-format-diff.py -p1
|
||||||
|
}
|
||||||
|
|
||||||
|
# these variables are needed in both functions
|
||||||
|
LBRYCRD_DEPENDENCIES="$(pwd)/lbrycrd-dependencies"
|
||||||
|
OUTPUT_DIR="$(pwd)/build"
|
||||||
|
LOG_DIR="$(pwd)/logs"
|
||||||
|
BDB_PREFIX="${OUTPUT_DIR}/bdb"
|
||||||
|
OPENSSL_PREFIX="${OUTPUT_DIR}/openssl"
|
||||||
|
BOOST_PREFIX="${OUTPUT_DIR}/boost"
|
||||||
|
LIBEVENT_PREFIX="${OUTPUT_DIR}/libevent"
|
||||||
|
|
||||||
|
if [ "${BUILD_DEPENDENCIES}" = true ]; then
|
||||||
|
build_dependencies
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${CHECK_CODE_FORMAT}" = true ]; then
|
||||||
|
LINES_W_FORMAT_REQUIRED=$(clang_format_diff | wc -l)
|
||||||
|
if [ ${LINES_W_FORMAT_REQUIRED} -ne 0 ]; then
|
||||||
|
echo "Failed to pass clang format diff: See below for the diff"
|
||||||
|
clang_format_diff
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
set +u
|
||||||
|
export PKG_CONFIG_PATH="${PKG_CONFIG_PATH}:${OPENSSL_PREFIX}/lib/pkgconfig/:${LIBEVENT_PREFIX}/lib/pkgconfig/"
|
||||||
|
set -u
|
||||||
|
|
||||||
|
if [ "${BUILD_LBRYCRD}" = true ]; then
|
||||||
|
LBRYCRD_LOG="${LOG_DIR}/lbrycrd_build.log"
|
||||||
|
echo "Building lbrycrd. tail -f ${LBRYCRD_LOG} to see the details and monitor progress"
|
||||||
|
trap 'cat_and_exit "${LBRYCRD_LOG}"' INT TERM EXIT
|
||||||
|
build_lbrycrd
|
||||||
|
trap - INT TERM EXIT
|
||||||
|
fi
|
Before Width: | Height: | Size: 67 KiB After Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 9.3 KiB |
|
@ -1,384 +1,612 @@
|
||||||
/* XPM */
|
/* XPM */
|
||||||
static char *bitcoin___[] = {
|
static char * bitcoin128_xpm[] = {
|
||||||
/* columns rows colors chars-per-pixel */
|
"128 128 481 2",
|
||||||
"128 128 250 2",
|
" c None",
|
||||||
" c #845415",
|
". c #FFFFFF",
|
||||||
". c #895616",
|
"+ c #ECEEEE",
|
||||||
"X c #84581E",
|
"@ c #CED3D4",
|
||||||
"o c #8D5C18",
|
"# c #F0F2F2",
|
||||||
"O c #925A15",
|
"$ c #F9FAFA",
|
||||||
"+ c #925E1C",
|
"% c #C7CDCD",
|
||||||
"@ c #98621C",
|
"& c #6B7A7C",
|
||||||
"# c #9E711C",
|
"* c #405457",
|
||||||
"$ c #A36E1A",
|
"= c #6C7B7D",
|
||||||
"% c #A96F1B",
|
"- c #B8BFC0",
|
||||||
"& c #A6711C",
|
"; c #EFF1F1",
|
||||||
"* c #AC741C",
|
"> c #E3E6E7",
|
||||||
"= c #B2741E",
|
", c #8E9A9B",
|
||||||
"- c #B37C1E",
|
"' c #415558",
|
||||||
"; c #BB7C1E",
|
") c #2B4145",
|
||||||
": c #835B21",
|
"! c #2B4245",
|
||||||
"> c #8F6125",
|
"~ c #2B4144",
|
||||||
", c #956727",
|
"{ c #374C4F",
|
||||||
"< c #916B2E",
|
"] c #667679",
|
||||||
"1 c #996B2C",
|
"^ c #B3BBBC",
|
||||||
"2 c #B47B23",
|
"/ c #EEF0F0",
|
||||||
"3 c #BD7C20",
|
"( c #F6F7F7",
|
||||||
"4 c #A17330",
|
"_ c #B5BCBD",
|
||||||
"5 c #AB7D3B",
|
": c #58696C",
|
||||||
"6 c #C17F20",
|
"< c #2E4447",
|
||||||
"7 c #B9831F",
|
"[ c #2C4245",
|
||||||
"8 c #BB842B",
|
"} c #2D4346",
|
||||||
"9 c #BD8533",
|
"| c #344A4D",
|
||||||
"0 c #B68F3D",
|
"1 c #617274",
|
||||||
"q c #BE8C3B",
|
"2 c #B0B8B9",
|
||||||
"w c #C4801F",
|
"3 c #EEEFF0",
|
||||||
"e c #FE8C03",
|
"4 c #FEFEFE",
|
||||||
"r c #F38A0F",
|
"5 c #D7DBDC",
|
||||||
"t c #FD8E0A",
|
"6 c #7A888A",
|
||||||
"y c #FF910C",
|
"7 c #364B4E",
|
||||||
"u c #F78F13",
|
"8 c #32474A",
|
||||||
"i c #F98F10",
|
"9 c #5D6E71",
|
||||||
"p c #F79016",
|
"0 c #ADB5B6",
|
||||||
"a c #FE9314",
|
"a c #A2ACAD",
|
||||||
"s c #F6931E",
|
"b c #495C5E",
|
||||||
"d c #FD961B",
|
"c c #2C4346",
|
||||||
"f c #FE991E",
|
"d c #2A4043",
|
||||||
"g c #C58421",
|
"e c #304649",
|
||||||
"h c #CD8621",
|
"f c #5A6B6E",
|
||||||
"j c #C78B21",
|
"g c #A6AFB1",
|
||||||
"k c #CC8B23",
|
"h c #E6E8E9",
|
||||||
"l c #C2852B",
|
"i c #FDFEFE",
|
||||||
"z c #C08B2D",
|
"j c #F8F9F9",
|
||||||
"x c #D28722",
|
"k c #C2C9CA",
|
||||||
"c c #D38B25",
|
"l c #657577",
|
||||||
"v c #DB8E22",
|
"m c #2F4548",
|
||||||
"b c #D28E2C",
|
"n c #314749",
|
||||||
"n c #D49323",
|
"o c #506365",
|
||||||
"m c #DC9224",
|
"p c #56676A",
|
||||||
"M c #DC9B25",
|
"q c #9FA9AA",
|
||||||
"N c #D4922D",
|
"r c #E1E4E4",
|
||||||
"B c #DF972A",
|
"s c #FCFDFD",
|
||||||
"V c #DF982E",
|
"t c #DDE0E1",
|
||||||
"C c #C18D33",
|
"u c #879496",
|
||||||
"Z c #C58E38",
|
"v c #3D5154",
|
||||||
"A c #CB9332",
|
"w c #475A5D",
|
||||||
"S c #C2933C",
|
"x c #9AA5A6",
|
||||||
"D c #CD9339",
|
"y c #E2E5E6",
|
||||||
"F c #CC9938",
|
"z c #C9CFD0",
|
||||||
"G c #D19733",
|
"A c #7F8C8E",
|
||||||
"H c #DA9230",
|
"B c #435659",
|
||||||
"J c #D59935",
|
"C c #526466",
|
||||||
"K c #DC9C33",
|
"D c #98A3A4",
|
||||||
"L c #DC9E3B",
|
"E c #DCDFE0",
|
||||||
"P c #E49124",
|
"F c #FBFCFC",
|
||||||
"I c #EA9426",
|
"G c #F1F3F3",
|
||||||
"U c #E09D26",
|
"H c #ABB4B5",
|
||||||
"Y c #EC972B",
|
"I c #536568",
|
||||||
"T c #F79625",
|
"J c #778587",
|
||||||
"R c #F99524",
|
"K c #D1D6D7",
|
||||||
"E c #F69A26",
|
"L c #F8F8F8",
|
||||||
"W c #F89825",
|
"M c #CFD3D4",
|
||||||
"Q c #F2972B",
|
"N c #869394",
|
||||||
"! c #F59A2C",
|
"O c #45595B",
|
||||||
"~ c #F89B2B",
|
"P c #2A4044",
|
||||||
"^ c #E79D33",
|
"Q c #2D4347",
|
||||||
"/ c #EF9D31",
|
"R c #4E6063",
|
||||||
"( c #E19F3A",
|
"S c #919C9E",
|
||||||
") c #EF9D3A",
|
"T c #D6DADB",
|
||||||
"_ c #F49C33",
|
"U c #FAFBFB",
|
||||||
"` c #F99E32",
|
"V c #FBFBFB",
|
||||||
"' c #F49F39",
|
"W c #CCD1D2",
|
||||||
"] c #D6A13E",
|
"X c #718082",
|
||||||
"[ c #DAA33B",
|
"Y c #354A4D",
|
||||||
"{ c #E3A127",
|
"Z c #2A4144",
|
||||||
"} c #E7A328",
|
"` c #F3F4F4",
|
||||||
"| c #EDA32C",
|
" . c #FAFAFA",
|
||||||
" . c #EDA829",
|
".. c #D4D9DA",
|
||||||
".. c #FFA325",
|
"+. c #8D999A",
|
||||||
"X. c #FFAB25",
|
"@. c #485C5E",
|
||||||
"o. c #F3A42B",
|
"#. c #495C5F",
|
||||||
"O. c #FFA429",
|
"$. c #8A9698",
|
||||||
"+. c #F4A929",
|
"%. c #D2D7D8",
|
||||||
"@. c #FFAC2A",
|
"&. c #E6E9E9",
|
||||||
"#. c #FFB227",
|
"*. c #939EA0",
|
||||||
"$. c #FFB32C",
|
"=. c #43575A",
|
||||||
"%. c #FFBA2D",
|
"-. c #3E5255",
|
||||||
"&. c #EEA830",
|
";. c #8E9A9C",
|
||||||
"*. c #F7A334",
|
">. c #DADEDF",
|
||||||
"=. c #FAA036",
|
",. c #4C5F61",
|
||||||
"-. c #FCAB34",
|
"'. c #859193",
|
||||||
";. c #F4A13C",
|
"). c #D1D6D6",
|
||||||
":. c #F9A33B",
|
"!. c #F7F8F8",
|
||||||
">. c #F4A83B",
|
"~. c #B9C0C1",
|
||||||
",. c #FFA83F",
|
"{. c #5B6C6F",
|
||||||
"<. c #FDB432",
|
"]. c #314649",
|
||||||
"1. c #FFBB33",
|
"^. c #68787A",
|
||||||
"2. c #FFB73A",
|
"/. c #C8CECF",
|
||||||
"3. c #FDB93E",
|
"(. c #FDFDFD",
|
||||||
"4. c #FFC12F",
|
"_. c #E0E4E4",
|
||||||
"5. c #FFC432",
|
":. c #9BA5A6",
|
||||||
"6. c #FFC338",
|
"<. c #4F6264",
|
||||||
"7. c #D2A043",
|
"[. c #818E90",
|
||||||
"8. c #D8A140",
|
"}. c #CFD4D4",
|
||||||
"9. c #EEA144",
|
"|. c #DBDFDF",
|
||||||
"0. c #E2A840",
|
"1. c #7E8B8D",
|
||||||
"q. c #EDA34B",
|
"2. c #384D50",
|
||||||
"w. c #F4A444",
|
"3. c #4B5E60",
|
||||||
"e. c #F9A642",
|
"4. c #A3ADAE",
|
||||||
"r. c #FBA945",
|
"5. c #E3E6E6",
|
||||||
"t. c #F3A64B",
|
"6. c #9CA6A8",
|
||||||
"y. c #F4A84E",
|
"7. c #536567",
|
||||||
"u. c #FBAB4B",
|
"8. c #7B898B",
|
||||||
"i. c #EEB041",
|
"9. c #A5AEB0",
|
||||||
"p. c #FABA44",
|
"0. c #394E51",
|
||||||
"a. c #ECA653",
|
"a. c #D8DDDD",
|
||||||
"s. c #EEAC5D",
|
"b. c #E4E6E7",
|
||||||
"d. c #F3AA53",
|
"c. c #A0AAAB",
|
||||||
"f. c #FAAE53",
|
"d. c #3B5052",
|
||||||
"g. c #F2AD5A",
|
"e. c #768586",
|
||||||
"h. c #FBB056",
|
"f. c #C4CACB",
|
||||||
"j. c #F6B15E",
|
"g. c #F4F5F5",
|
||||||
"k. c #FBB25B",
|
"h. c #FAFAFB",
|
||||||
"l. c #DDAF79",
|
"i. c #C6CCCD",
|
||||||
"z. c #E3A962",
|
"j. c #6A7A7C",
|
||||||
"x. c #EBAE63",
|
"k. c #5D6E70",
|
||||||
"c. c #E4AC68",
|
"l. c #5E6F71",
|
||||||
"v. c #EAAF69",
|
"m. c #33494C",
|
||||||
"b. c #EEB065",
|
"n. c #BEC4C5",
|
||||||
"n. c #E7B06C",
|
"o. c #F1F2F2",
|
||||||
"m. c #EEB36B",
|
"p. c #E0E3E4",
|
||||||
"M. c #F5B263",
|
"q. c #8E999B",
|
||||||
"N. c #FBB461",
|
"r. c #3F5456",
|
||||||
"B. c #E6B274",
|
"s. c #45585B",
|
||||||
"V. c #ECB574",
|
"t. c #95A0A1",
|
||||||
"C. c #E7B57B",
|
"u. c #E5E7E8",
|
||||||
"Z. c #EAB77C",
|
"v. c #E9EBEC",
|
||||||
"A. c #ECB97C",
|
"w. c #ADB6B7",
|
||||||
"S. c #F2B770",
|
"x. c #647476",
|
||||||
"D. c #F0BB7A",
|
"y. c #384C4F",
|
||||||
"F. c #DBB485",
|
"z. c #B6BEBF",
|
||||||
"G. c #DFB888",
|
"A. c #EDEFEF",
|
||||||
"H. c #E4B984",
|
"B. c #F2F3F3",
|
||||||
"J. c #EDBD82",
|
"C. c #AFB7B8",
|
||||||
"K. c #E5BC8B",
|
"D. c #56686A",
|
||||||
"L. c #EABE8A",
|
"E. c #34494C",
|
||||||
"P. c #F0BE82",
|
"F. c #728183",
|
||||||
"I. c #E0BF96",
|
"G. c #CDD2D3",
|
||||||
"U. c #EDC089",
|
"H. c #B4BCBD",
|
||||||
"Y. c #F0C28B",
|
"I. c #69797B",
|
||||||
"T. c #E5C194",
|
"J. c #657678",
|
||||||
"R. c #E9C191",
|
"K. c #EAEDED",
|
||||||
"E. c #E4C39C",
|
"L. c #FCFCFC",
|
||||||
"W. c #EBC699",
|
"M. c #CFD4D5",
|
||||||
"Q. c #EBC99F",
|
"N. c #748385",
|
||||||
"!. c #DFC3A0",
|
"O. c #AEB6B7",
|
||||||
"~. c #DDCAAF",
|
"P. c #F1F2F3",
|
||||||
"^. c #CFC7BD",
|
"Q. c #F0F1F1",
|
||||||
"/. c #D2CBB6",
|
"R. c #BCC3C4",
|
||||||
"(. c #DBC8B1",
|
"S. c #707F81",
|
||||||
"). c #DBCDBB",
|
"T. c #607173",
|
||||||
"_. c #E2C6A4",
|
"U. c #AAB3B4",
|
||||||
"`. c #E6C8A5",
|
"V. c #E9EBEB",
|
||||||
"'. c #EACBA5",
|
"W. c #EAECED",
|
||||||
"]. c #E1C7A8",
|
"X. c #465A5C",
|
||||||
"[. c #E3CBAD",
|
"Y. c #3C5053",
|
||||||
"{. c #EACCAA",
|
"Z. c #899697",
|
||||||
"}. c #EED1AC",
|
"`. c #758386",
|
||||||
"|. c #E1CDB3",
|
" + c #3A4F52",
|
||||||
" X c #E3CFB8",
|
".+ c #33484B",
|
||||||
".X c #E6D1B6",
|
"++ c #5A6C6E",
|
||||||
"XX c #EBD2B3",
|
"@+ c #A4AEAF",
|
||||||
"oX c #E3D1BB",
|
"#+ c #BFC5C6",
|
||||||
"OX c #EAD6BB",
|
"$+ c #304548",
|
||||||
"+X c #EBD8BF",
|
"%+ c #798789",
|
||||||
"@X c #D3CDC2",
|
"&+ c #556769",
|
||||||
"#X c #D8CDC2",
|
"*+ c #E5E8E8",
|
||||||
"$X c #D0CECA",
|
"=+ c #DEE1E2",
|
||||||
"%X c #DDD3C4",
|
"-+ c #849192",
|
||||||
"&X c #D3D2CC",
|
";+ c #3A4E51",
|
||||||
"*X c #DDD5CB",
|
">+ c #485B5E",
|
||||||
"=X c #CCD3D5",
|
",+ c #9DA7A8",
|
||||||
"-X c #C9D7DF",
|
"'+ c #EDEEEF",
|
||||||
";X c #D2D4D6",
|
")+ c #CAD0D1",
|
||||||
":X c #DEDAD4",
|
"!+ c #7D8A8C",
|
||||||
">X c #DDDCDB",
|
"~+ c #516366",
|
||||||
",X c #E2D4C2",
|
"{+ c #E2E5E5",
|
||||||
"<X c #ECDBC2",
|
"]+ c #788688",
|
||||||
"1X c #E2D7CA",
|
"^+ c #D3D8D9",
|
||||||
"2X c #E3D8CC",
|
"/+ c #828F91",
|
||||||
"3X c #E2DCD6",
|
"(+ c #44585A",
|
||||||
"4X c #E9DED2",
|
"_+ c #4E6163",
|
||||||
"5X c #E1DEDA",
|
":+ c #97A2A3",
|
||||||
"6X c #EEE0CE",
|
"<+ c #CBD0D1",
|
||||||
"7X c #EEE3D4",
|
"[+ c #6E7D7F",
|
||||||
"8X c #E7E2DA",
|
"}+ c #32484B",
|
||||||
"9X c #EEE4D8",
|
"|+ c #596B6D",
|
||||||
"0X c #F3E6D1",
|
"1+ c #F4F5F6",
|
||||||
"qX c #C5D7ED",
|
"2+ c #D2D6D7",
|
||||||
"wX c #CDDBEB",
|
"3+ c #899597",
|
||||||
"eX c #DBDEE2",
|
"4+ c #4B5E61",
|
||||||
"rX c #CBDCF1",
|
"5+ c #D8DCDC",
|
||||||
"tX c #C4DFFF",
|
"6+ c #919D9E",
|
||||||
"yX c #DEE1E4",
|
"7+ c #425658",
|
||||||
"uX c #DDE4EC",
|
"8+ c #909C9E",
|
||||||
"iX c #D3E1F2",
|
"9+ c #D6DBDB",
|
||||||
"pX c #DDE6F1",
|
"0+ c #8A9798",
|
||||||
"aX c #DEE9F4",
|
"a+ c #D2D7D7",
|
||||||
"sX c #D8E5F8",
|
"b+ c #F9F9F9",
|
||||||
"dX c #D6EEFF",
|
"c+ c #F5F6F6",
|
||||||
"fX c #DEECFB",
|
"d+ c #5B6C6E",
|
||||||
"gX c #D5F4FF",
|
"e+ c #6D7C7F",
|
||||||
"hX c #DDF3FF",
|
"f+ c #DCE0E0",
|
||||||
"jX c #DCF9FF",
|
"g+ c #D3D7D8",
|
||||||
"kX c #E3E4E6",
|
"h+ c #506265",
|
||||||
"lX c #EFEBE4",
|
"i+ c #A9B3B4",
|
||||||
"zX c #E1E5EB",
|
"j+ c #EFF0F1",
|
||||||
"xX c #E2E8ED",
|
"k+ c #9EA8AA",
|
||||||
"cX c #F1F1ED",
|
"l+ c #7C898C",
|
||||||
"vX c #E0E7F0",
|
"m+ c #C7CDCE",
|
||||||
"bX c #E2E9F2",
|
"n+ c #EBEDED",
|
||||||
"nX c #EAEFF6",
|
"o+ c #849193",
|
||||||
"mX c #E1EEFD",
|
"p+ c #596A6D",
|
||||||
"MX c #E4F1F6",
|
"q+ c #768486",
|
||||||
"NX c #E3F4FF",
|
"r+ c #C3C9CA",
|
||||||
"BX c #EAF6FF",
|
"s+ c #C2C8C9",
|
||||||
"VX c #E5F9FF",
|
"t+ c #637476",
|
||||||
"CX c #EBFAFF",
|
"u+ c #C0C6C7",
|
||||||
"ZX c #F5F5F5",
|
"v+ c #EAECEC",
|
||||||
"AX c #F9F7F5",
|
"w+ c #5C6D70",
|
||||||
"SX c #FAF8F6",
|
"x+ c #A8B1B2",
|
||||||
"DX c #F3F7FB",
|
"y+ c #889496",
|
||||||
"FX c #F4FAFE",
|
"z+ c #99A4A5",
|
||||||
"GX c #FEFEFE",
|
"A+ c #EBEEEE",
|
||||||
"HX c None",
|
"B+ c #ECEEEF",
|
||||||
/* pixels */
|
"C+ c #AEB7B8",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"D+ c #617174",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"E+ c #344A4C",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"F+ c #273E41",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"G+ c #F2F3F4",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"H+ c #748284",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"I+ c #D0D5D6",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"J+ c #FCFCFD",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX1 Z L >.N b b b b N >.( C > HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"K+ c #283F42",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX4 L _ *.@.<.$.X.X...X.X.X.X.X.X...X.@.$.<.@.*./ G , HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"L+ c #919D9F",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX< L -.@.$.X...R R R T T T T W W W W W W T T T T R R W ..X.$.@.*.J HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"M+ c #738284",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXD -.%.X.W R T T W W W W W W W W W W W W W W W W W W W W W W T T R W X.%.+.A HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"N+ c #33494B",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXS -.$.X.R T T W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W T T R X.$.-.C HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"O+ c #4D6062",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXF <.@.f R T W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W T R W #.<.A HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"P+ c #96A1A3",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX[ <.X.f T W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W T R X.$.K HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"Q+ c #3F5356",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX0.$...R T W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W E W W W W W W W T R ..%.G HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"R+ c #8B9799",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXS 1...R T W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W E ~ ~ E W W W W W W W W W T R X.1.A HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"S+ c #DFE2E2",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX3.X.d T W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W ~ ~ ~ ~ ~ E W W W W W W W W W W T R @.2.HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"T+ c #D9DDDE",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX7.5.f T W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W ~ ~ ~ ~ ~ ~ ~ E W W W W W W W W W W W W T W %.z HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"U+ c #B8C0C1",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX3.X.s T W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W ~ ~ ~ ~ ~ ~ ~ ~ ~ W W W W W W W W W W W W W T R $.<.HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"V+ c #31474A",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX1...R W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W E ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ E E W W W W W W W W W W W W W R ..1.HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"W+ c #F9F9FA",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX0 5.f T W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W T W 5.8 HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"X+ c #A6B0B1",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX8.$.s W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W E ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ` ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W W T R %.N HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"Y+ c #D7DCDC",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXi.#.R W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W E ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ` ` ` ` ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W R $.&.HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"Z+ c #7D8B8D",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXp.X.R W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W E ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ` ` ` ` ` ~ ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W R @.<.HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"`+ c #A5AEAF",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXp.X.R W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W E ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ` ` ` ` ` ` ` ~ ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W W W R @.<.HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
" @ c #6B7B7D",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXi.X.R W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W E ~ E ~ W R ~ ~ ~ ~ ~ ~ ` ` ` ` ` ` ` ` ` ` ~ ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W W R @.| HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
".@ c #263D40",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX] #.R W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W ~ ~ ~ ~ ~ ! s e t d ~ ` ` ` ` ` ` =.=.=.` ` ` ` ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W W W R %.N HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"+@ c #8F9B9D",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXq %.R W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W E W E ~ ~ ~ ~ y l.=XI.x.) p a =.` ` =.=.=.=.=.=.` ` ` ~ ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W W W W W R %.2 HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"@@ c #4C5F62",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX5 5.d W W W W W W W W W W W W W W W W W W W W W W W W W W W W W E ~ ~ ~ ~ ~ ~ ~ ~ t (.jXVXNXuX@XF.W ` =.:.` W =.:.=.=.` ` ` ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W W W W W T R 5.HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"#@ c #384D4F",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX1.f T W W W W W W W W W W W W W W W W W W W W W W W W W W W W E ~ ~ ~ ~ ~ ~ ~ ~ R Q eXDXSXSXDXgX#Xa ` =.=.;.q.W a a R ` ` ` ~ ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W W W W W T W %.HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"$@ c #DADEDE",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX3...T W W W W W W W W W W W W W W W W W W W W W W W W W W W E ~ ~ ~ ~ ~ ~ ~ ~ ~ ` a a.NXSXGXGXAXNXV.a :.:.f c.tX*XE.n.9.R ~ ` ` ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W W W W T @.@.HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"%@ c #8D989A",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXD #.R W W W W W W W W W W W W W W W W W W W W W W W W W W W E ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ` t H.VXSXGXGXDXmXy.f :.:.a I.hXBXCXNXiX^.' W ` ~ ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W W W W R %.g HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"&@ c #405557",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX5.d W W W W W W W W W W W W W W W W W W W W W W W W W E ~ W ~ ~ ~ ~ ~ ~ ~ ~ ~ ` ` ` i |.CXGXGXGXCX3X~ ` :.:.R %XCXSXGXAXNX>XW ~ ` ` ~ ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W W W W W W R 5.HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"*@ c #B6BDBE",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX2.W T W W W W W W W W W W W W W W W W W W W W W W W W ~ ~ ~ s t e a W ~ ` ` ` ` ` ` W ! eXFXGXGXSXVX[.d :.:.~ w.uXFXGXGXSXVXW.a ` ` ` ` ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W W W W W W T ..@.HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"=@ c #C7CCCD",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHX9 $.R W W W W W W W W W W W W W W W W W W W W W W E W ~ ~ ~ y F./.B.9.T t t a ~ =.` =.a a.hXDXGXGXSXNXA.d :.e.R v.NXSXGXGXSXNXm.a =.` ` ` ~ ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W W W W R %.= HXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"-@ c #5C6D6F",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHX6.d W W W W W W W W W W W W W W W W W W W W W W E ~ ~ ~ ~ W i &XjXNXfX:X].B.q.T t a d e K.VXSXGXGXDXaXd.W e.e.d E.VXSXGXGXDXvXw.W =.` ` ` ` ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W W W W W W %.HXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
";@ c #BBC2C3",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXK X.T W W W W W W W W W W W W W W W W W W W W ~ ~ ~ ~ ~ ~ ~ a ) uXDXSXFXFXCXNXfX:X_.B.q.r .XFXGXGXGXCX3X=.=.e.,.~ %XCXGXGXGXCX1XW ` =.` ` ` ` ~ ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W W W W W W T $.m HXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
">@ c #B1BABB",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHX5.R W W W W W W W W W W W W W W W W W W W E ~ ~ ~ ~ ~ ~ ~ ~ t x.NXSXGXGXGXSXSXDXFXCXNXmX8XcXSXGXGXGXCXW.e :.e.=.t.uXFXGXGXSXVXE.d :.=.=.` ` ` ~ ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W W W W W W W R %.HXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
",@ c #E4E7E7",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHX^ X.T W W W W W W W W W W W W W W W W W W ~ ~ ~ ~ ~ ~ ~ ~ ~ ` t T.VXSXGXGXGXGXGXGXGXSXSXFXGXGXGXGXGXGXFX}.9.' W e v.VXSXGXGXSXNXm.d :.=.=.=.` ` ` ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W W W W W T @.P HXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"'@ c #8D999B",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHX1.R W W W W W W W W W W W W W W W W E E ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ s ;XNXAXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXSXFXNX>X|.V.XXFXGXGXGXFXbXy.~ :.:.=.=.` ` ` ` ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W W W W W W W R %.HXHXHXHXHXHXHXHXHXHXHXHXHX",
|
")@ c #939E9F",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXH X.T W W W W W W W W W W W W W W E E ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ` ` R ' $XsXNXVXFXSXSXGXGXGXGXGXGXGXGXGXGXGXGXGXGXSXFXCXCXFXSXGXGXGXCXOXa :.:.:.=.=.=.` ` ` ~ ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W W W W T $.c HXHXHXHXHXHXHXHXHXHXHXHX",
|
"!@ c #E7EAEA",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHX1.R W W W W W W W W W W W W W W W ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ` ` ` ` ` ` ~ t.V.`.5XVXFXSXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXFX<X_ d d =.:.=.=.` ` ` ` ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W W W W W R $.HXHXHXHXHXHXHXHXHXHXHXHX",
|
"~@ c #D4D8D9",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHX8 $.T W W W W W W W W W W W E E ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ` ` ` ` ` =.=.~ f a a W b.xXFXSXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXSXFXmX~.x.T a =.:.=.` ` ` ~ ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W W W W W W T $.3 HXHXHXHXHXHXHXHXHXHXHX",
|
"{@ c #516365",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHX-.W W W W W W W W W W W W ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ` ` ` ` ` ` =.=.=.=.=.:.:.:.` e y.MXFXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXSXFXCXhX*Xn.p a :.=.` ` ` ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W W W W W ~ O.HXHXHXHXHXHXHXHXHXHXHX",
|
"]@ c #F6F7F8",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHX1.R W W W W W W W W W ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ` ` ` ` ` =.` =.=.=.:.:.:.:.:.:.:.a .XFXGXGXGXGXGXGXGXGXGXFXFXSXSXGXGXGXGXGXGXGXGXGXGXGXSXAXCXhX%Xq.t ~ =.` ` ` ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W W W W R %.HXHXHXHXHXHXHXHXHXHXHX",
|
"^@ c #2D4345",
|
||||||
"HXHXHXHXHXHXHXHXHXHXb @.T W W W W W W W W E ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ` ` ` ` ` ` =.=.=.=.=.:.:.:.:.:.:.:.e.d [.CXGXGXGXGXGXGXGXGXSXZXnXNXNXBXDXSXSXGXGXGXGXGXGXGXGXGXSXAXCXhXH.t W :.` ` ~ ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W W W W W T @.x HXHXHXHXHXHXHXHXHXHX",
|
"/@ c #6F7E80",
|
||||||
"HXHXHXHXHXHXHXHXHXHX<.R W W W W W E E E ~ ~ ~ ~ ~ ~ ~ ~ ~ ` ~ ` ` ` ` ` =.=.=.=.=.:.:.:.:.:.:.:.:.e.=.' >XFXGXGXGXGXGXGXGXSXCX{.e.P.'.2XvXNXBXDXSXGXGXGXGXGXGXGXGXGXSXDXjX~.y W =.` ` ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W W W W W W W @.HXHXHXHXHXHXHXHXHXHX",
|
"(@ c #CCD2D2",
|
||||||
"HXHXHXHXHXHXHXHXHX: 1.R W W W W E ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ` ` ` ` ` ` =.=.=.=.=.:.:.:.:.:.:.:.:.e.e.e.~ s.fXDXGXGXGXGXGXGXGXSXNXD.f =.=.,.M.L.oXaXVXDXSXGXGXGXGXGXGXGXGXGXAXVX(.t ~ ` ` ~ ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W W W W W R %. HXHXHXHXHXHXHXHXHX",
|
"_@ c #9BA6A7",
|
||||||
"HXHXHXHXHXHXHXHXHXl #.T W W W E ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ` ` ` ` ` ` =.=.=.=.:.:.:.:.:.:.:.:.:.e.e.e.e.r.W H.NXSXGXGXGXGXGXGXGXDXzXg.r.f.f.f.r.=.=.g.`.fXBXAXGXGXGXGXGXGXGXGXGXAXjXH.t =.` ` ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W W W W W T $.6 HXHXHXHXHXHXHXHXHX",
|
":@ c #46595C",
|
||||||
"HXHXHXHXHXHXHXHXHX~ ..W W W W E ~ ~ ~ ~ ~ ~ ~ ~ ` ` ` ` ` ` =.=.=.=.=.:.:.:.:.:.:.:.e.e.e.e.e.e.e.r.W |.CXGXGXGXGXGXGXGXGXBX1X,.f.f.f.f.h.h.f.,.~ d.3XVXAXGXGXGXGXGXGXGXGXGXDXsX' f ` ` ~ ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W W W W W ..~ HXHXHXHXHXHXHXHXHX",
|
"<@ c #859294",
|
||||||
"HXHXHXHXHXHXHXHXHX$.R W W W W W E ~ ~ ~ ~ ~ ` ` ` ` ` ` =.=.=.=.=.=.:.:.:.:.:.:.:.e.e.e.e.e.r.r.r.,.w.>XFXGXGXGXGXGXGXGXSXNX`.=.f.h.h.h.h.f.f.f.f.=.~ ,XVXSXGXGXGXGXGXGXGXGXSXVXT.y ` ` ` ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W W W R $.HXHXHXHXHXHXHXHXHX",
|
"[@ c #DDE1E1",
|
||||||
"HXHXHXHXHXHXHXHXX %.T W W W W W E ~ ~ ~ ~ ~ ` ` ` ` =.=.=.=.=.:.:.:.:.:.:.:.:.e.e.e.e.e.e.r.r.r.u.=.x.fXDXGXGXGXGXGXGXGXSXmXA.,.h.h.h.k.k.h.f.f.f.f.:.~ 5XFXGXGXGXGXGXGXGXGXGXCX:XW ~ ` ` ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W W W T $.. HXHXHXHXHXHXHXHX",
|
"}@ c #FEFFFF",
|
||||||
"HXHXHXHXHXHXHXHX8 $.T W W W W W W E ~ ~ ~ ~ ~ ` ` ` =.=.=.:.:.:.:.:.:.:.:.e.e.e.e.e.r.r.r.r.r.u.u.~ K.NXSXGXGXGXGXGXGXGXDXzXj.r.k.k.k.k.k.h.f.f.f.f.f.W V.VXSXGXGXGXGXGXGXGXGXDXuXw.f ` ` ` ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W W T $.3 HXHXHXHXHXHXHXHX",
|
"|@ c #C9CFCF",
|
||||||
"HXHXHXHXHXHXHXHXY ..W W W W W W W E ~ ~ ~ ~ ~ ~ ` ` ` =.=.=.:.:.:.:.:.e.e.e.e.e.e.r.r.r.r.u.u.u.u.~ |.CXGXGXGXGXGXGXGXGXBX2Xr.f.k.k.k.k.k.k.h.f.f.f.f.,.d.bXFXGXGXGXGXGXGXGXGXDXfXd.d =.` ` ~ ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W W W W O.P HXHXHXHXHXHXHXHX",
|
"1@ c #3B4F52",
|
||||||
"HXHXHXHXHXHXHXHXO.W W W W W W W W W ~ ~ ~ ~ ~ ~ ` ` ` ` =.=.:.:.:.:.e.e.e.e.r.r.r.r.r.r.u.u.u.u.r.w.>XFXGXGXGXGXGXGXGXSXNX'.,.k.k.k.k.k.k.k.h.h.f.f.f.e.y.kXFXGXGXGXGXGXGXGXGXDXfXg.d =.` ` ` ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W W W W W O.HXHXHXHXHXHXHXHX",
|
"2@ c #526467",
|
||||||
"HXHXHXHXHXHXHXHX$.R W W W W W W W W E ~ ~ ~ ~ ~ ` ` ` ` =.=.=.:.:.:.:.e.e.r.r.r.r.u.u.u.u.u.u.f.=.b.fXDXGXGXGXGXGXGXGXSXmXJ.r.k.k.k.k.k.k.k.h.h.f.f.f.:.s.mXFXGXGXGXGXGXGXGXGXDXpXy.R =.` ` ` ~ ~ ~ ~ ~ E E W W W W W W W W W W W W W W W W W $.HXHXHXHXHXHXHXHX",
|
"3@ c #A9B2B4",
|
||||||
"HXHXHXHXHXHXHXHX1.R W W W W W W W W W ~ ~ ~ ~ ~ ~ ` ` ` =.=.=.:.:.:.:.e.e.e.r.r.u.u.u.u.u.u.u.f.=.K.NXSXGXGXGXGXGXGXGXFXxXM.u.k.k.k.k.k.k.k.k.h.f.f.k.~ K.VXSXGXGXGXGXGXGXGXGXCX5X=.~ =.=.` ` ` ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W W $.HXHXHXHXHXHXHXHX",
|
"4@ c #BEC5C6",
|
||||||
"HXHXHXHXHXHXHX+ $.T W W W W W W W W W W ~ ~ ~ ~ ~ ~ ` ` ` =.=.=.:.:.:.:.e.e.e.r.r.u.u.u.u.f.f.f.=.|.CXGXGXGXGXGXGXGXGXFX<X~ u.k.N.N.N.k.k.k.k.k.k.k.=.;.uXFXGXGXGXGXGXGXGXGXSXBXoXR =.=.=.` ` ` ~ ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W T $.O HXHXHXHXHXHXHX",
|
"5@ c #C0C7C8",
|
||||||
"HXHXHXHXHXHXHXl @.T W W W W W W W W W W ~ ~ ~ ~ ~ ~ ` ` ` =.=.=.:.:.:.:.e.e.e.r.r.u.u.u.u.f.f.u.t.>XFXGXGXGXGXGXGXGXGXFX9XA.b.u.r.r.u.u.h.h.h.u.r.O.w.:XCXSXGXGXGXGXGXGXGXGXSXhXL.a :.=.=.=.` ` ` ~ ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W T $.* HXHXHXHXHXHXHX",
|
"6@ c #F7F8F9",
|
||||||
"HXHXHXHXHXHXHXV X.T W W W W W W W W W W E ~ ~ ~ ~ ~ ~ ` ` ` =.=.=.:.:.:.:.e.e.e.r.r.u.u.u.u.f.,.b.fXFXGXGXGXGXGXGXGXGXSXFXVXpX*X[.R.V.M.g.d.d.g.b.T.pXCXSXGXGXGXGXGXGXGXGXGXDXpXe.~ :.:.=.=.` ` ` ~ ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W T $.; HXHXHXHXHXHXHX",
|
"7@ c #879395",
|
||||||
"HXHXHXHXHXHXHX| O.T W W W W W W W W W W W ~ ~ ~ ~ ~ ~ ` ` ` ` =.=.:.:.:.:.:.e.e.r.r.u.u.u.u.f.=.K.NXSXGXGXGXGXGXGXGXGXGXGXSXFXFXBXNXmXuX>X3X3XyXmXVXFXSXGXGXGXGXGXGXGXGXGXAXhXE.d :.:.:.=.=.` ` ` ` ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W T @.h HXHXHXHXHXHXHX",
|
"8@ c #C1C7C8",
|
||||||
"HXHXHXHXHXHXHXc @.T W W W W W W W W W W W E ~ ~ ~ ~ ~ ~ ` ` ` ` =.:.:.:.:.:.e.e.e.r.r.u.u.u.u.=.|.BXGXGXGXGXGXGXGXGXGXGXGXGXGXGXSXSXSXFXFXFXFXFXSXSXGXGXGXGXGXGXGXGXGXGXAXNX>X~ =.e.:.:.:.=.` ` ` ` ~ ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W @.h HXHXHXHXHXHXHX",
|
"9@ c #637375",
|
||||||
"HXHXHXHXHXHXHXk @.T W W W W W W W W W W W W W ~ ~ ~ ~ ~ ~ ` ` ` =.=.:.:.:.:.e.e.e.r.r.r.u.u.r.w.>XFXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXSXZXNXeXe.~ e.:.:.:.:.=.=.=.` ` ` ~ ~ ~ ~ ~ ~ W W W W W W W W W W W W W W @.h HXHXHXHXHXHXHX",
|
"0@ c #A3ACAE",
|
||||||
"HXHXHXHXHXHXHXc @.T W W W W W W W W W W W W W ~ ~ ~ ~ ~ ~ ` ` ` =.=.=.:.:.:.:.e.e.e.r.r.u.u.=.x.fXFXGXGXGXGXGXGXGXGXGXFXFXSXSXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXFXCXfXoX:.~ r.e.:.:.:.:.:.=.` ` ` ` ~ ~ ~ ~ ~ ~ W W W W W W W W W W W W W W @.h HXHXHXHXHXHXHX",
|
"a@ c #BAC1C2",
|
||||||
"HXHXHXHXHXHXHXc @.T W W W W W W W W W W W W W E ~ ~ ~ ~ ~ ` ` ` ` =.=.:.:.:.:.:.e.e.r.r.r.u.~ K.NXSXGXGXGXGXGXGXGXSXZX6XkXmXNXBXDXAXSXGXGXGXGXGXGXGXGXGXGXGXGXGXGX0X'.S.~ =.u.e.e.e.:.:.:.:.=.=.` ` ` ` ~ ~ ~ ~ ~ ~ W W W W W W W W W W W W W @.h HXHXHXHXHXHXHX",
|
"b@ c #F6F6F7",
|
||||||
"HXHXHXHXHXHXHXk @.T W W W W W W W W W W W W W W ~ ~ ~ ~ ~ ~ ` ` ` ` =.=.:.:.:.:.e.e.e.r.r.u.~ |.CXGXGXGXGXGXGXGXGXFX4X,.k.D.Q.,XkXmXNXDXSXSXGXGXGXGXGXGXGXGXGXGXGX<X_ y r.u.r.r.e.e.e.:.:.:.:.=.=.` ` ` ~ ~ ~ ~ ~ ~ W W W W W W W W W W W W W @.h HXHXHXHXHXHXHX",
|
"c@ c #DBDEDF",
|
||||||
"HXHXHXHXHXHXHXc @.T W W W W W W W W W W W W W W E ~ ~ ~ ~ ~ ` ` ` ` =.=.=.:.:.:.e.e.e.r.r.e.;.>XFXGXGXGXGXGXGXGXSXVX{.,.f.u.r.u.N.J.{.5XNXBXAXSXGXGXGXGXGXGXGXGXGXFXMXH.W r.u.r.e.e.e.:.:.:.:.=.=.` ` ` ` ~ ~ ~ ~ ~ ~ W W W W W W W W W W W T @.h HXHXHXHXHXHXHX",
|
"d@ c #CAD0D0",
|
||||||
"HXHXHXHXHXHXHXo.O.T W W W W W W W W W W W W W W E ~ ~ ~ ~ ~ ~ ` ` ` =.=.=.:.:.:.:.e.e.e.r.O.s.fXFXGXGXGXGXGXGXGXSXmXJ.r.N.N.N.N.h.r.r.f.J.1XhXBXAXGXGXGXGXGXGXGXGXSXDXjX!.W e.u.r.e.e.e.:.:.:.:.=.=.` ` ` ` ~ ~ ~ ~ ~ E W W W W W W W W W W T @.g HXHXHXHXHXHXHX",
|
"e@ c #DFE2E3",
|
||||||
"HXHXHXHXHXHXHXB X.T W W W W W W W W W W W W W W W W ~ ~ ~ ~ ~ ~ ` ` ` =.=.:.:.:.:.:.e.e.r.W H.NXSXGXGXGXGXGXGXGXDXuXM.u.k.k.N.N.N.N.N.h.,.e.D.>XNXSXGXGXGXGXGXGXGXGXSXZXjXE.W r.r.e.e.e.:.:.:.:.=.=.=.` ` ` ~ ~ ~ ~ ~ ~ W W W W W W W W W W T $.- HXHXHXHXHXHXHX",
|
"f@ c #44575A",
|
||||||
"HXHXHXHXHXHXHXl @.T W W W W W W W W W W W W W W W W E ~ ~ ~ ~ ~ ` ` ` =.=.=.:.:.:.:.e.e.r.W |.CXGXGXGXGXGXGXGXGXBX2Xr.h.k.k.k.k.k.k.k.k.k.h.,.,.|.NXZXGXGXGXGXGXGXGXGXGXZXgXV.~ u.e.e.e.:.:.:.:.:.=.=.` ` ` ` ~ ~ ~ ~ ~ ~ W W W W W W W W W T $.% HXHXHXHXHXHXHX",
|
"g@ c #97A2A4",
|
||||||
"HXHXHXHXHXHXHX@ $.T W W W W W W W W W W W W W W W W E ~ ~ ~ ~ ~ ~ ` ` ` ` =.=.:.:.:.:.e.:.' >XFXGXGXGXGXGXGXGXSXNX{.,.k.k.k.k.k.k.k.k.k.k.k.k.u.~ `.NXSXGXGXGXGXGXGXGXGXSXCX>X=.e.r.r.e.e.:.:.:.:.:.=.=.` ` ` ~ ~ ~ ~ ~ ~ W W W W W W W W W T $.. HXHXHXHXHXHXHX",
|
"h@ c #E8EAEA",
|
||||||
"HXHXHXHXHXHXHXHX%.R W W W W W W W W W W W W W W W W W E ~ ~ ~ ~ ~ ` ` ` ` =.=.:.:.:.:.e.~ s.fXFXGXGXGXGXGXGXGXSXNXJ.,.k.k.k.k.k.k.k.k.k.k.h.h.k.u.O.2XCXGXGXGXGXGXGXGXGXGXAXhXV.~ u.r.e.e.e.:.:.:.:.=.=.=.` ` ` ~ ~ ~ ~ ~ W W W W W W W W W W $.HXHXHXHXHXHXHXHX",
|
"i@ c #E0E3E3",
|
||||||
"HXHXHXHXHXHXHXHX$.R W W W W W W W W W W W W W W W W W E ~ ~ ~ ~ ~ ~ ` ` ` ` ~ :.:.:.:.e.f Z.VXSXGXGXGXGXGXGXGXDXzXM.r.k.k.k.k.k.k.k.h.h.h.h.f.f.k.=.V.NXSXGXGXGXGXGXGXGXGXSXVX`.W r.e.e.e.e.:.:.:.:.=.=.=.` ` ` ~ ~ ~ ~ ~ ~ E W W W W W W W W $.HXHXHXHXHXHXHXHX",
|
"j@ c #516466",
|
||||||
"HXHXHXHXHXHXHXHXO.W W W W W W W W W W W W W W W W W W W ~ ~ ~ ~ ~ ~ ` ` =.~ Q a a W =.=.t XCXGXGXGXGXGXGXGXGXBX2Xr.f.k.k.k.k.k.k.h.h.h.h.f.f.f.f.r.y.kXFXGXGXGXGXGXGXGXGXGXBX,X~ :.e.e.e.:.:.:.:.:.:.=.=.` ` ` ` ~ ~ ~ ~ ~ E W W W W W W W ~ ..HXHXHXHXHXHXHXHX",
|
"k@ c #68787B",
|
||||||
"HXHXHXHXHXHXHXHXI O.W W W W W W W W W W W W W W W W W W W ~ ~ ~ ~ ~ ~ ` a z.-X_.B.q.! u C.NXSXGXGXGXGXGXGXGXSXNX'.=.h.h.k.k.k.h.h.f.f.f.f.f.f.f.f.r.w.5XFXGXGXGXGXGXGXGXGXGXCX2X=.:.e.:.:.:.:.:.:.:.:.=.=.=.` ` ` ` ~ ~ ~ ~ ~ E W W W W W W O.P HXHXHXHXHXHXHXHX",
|
"l@ c #F3F5F5",
|
||||||
"HXHXHXHXHXHXHXHXk @.T W W W W W W W W W W W W W W W W W W ~ ~ ~ ~ ~ ~ ~ t ).jXVXNXaX2X1XBXDXSXGXGXGXGXGXGXGXSXmXA.:.h.h.h.h.h.f.f.f.f.f.f.f.f.f.f.,.d.vXFXGXGXGXGXGXGXGXGXGXCX1X` =.:.:.:.:.:.:.=.=.=.=.=.=.` ` ` ` ~ ~ ~ ~ ~ ~ W W W W W T $.; HXHXHXHXHXHXHXHX",
|
"m@ c #425659",
|
||||||
"HXHXHXHXHXHXHXHXo %.T W W W W W W W W W W W W W W W W W W W W ~ ~ ~ ` y q.fXZXSXSXFXFXFXSXSXGXGXGXGXGXGXGXGXFXxXj.r.f.h.h.h.f.f.f.f.f.f.f.f.u.u.f.W B.NXSXGXGXGXGXGXGXGXGXSXBXoXW :.:.:.:.:.:.=.=.=.=.=.` ` ` ` ` ` ~ ~ ~ ~ ~ ~ W W W W W W %. HXHXHXHXHXHXHXHX",
|
"n@ c #293F42",
|
||||||
"HXHXHXHXHXHXHXHXHX$.R W W W W W W W W W W W W W W W W W W W E ~ ~ ~ ` e !.CXSXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXFX+Xd ,.f.h.h.h.f.f.f.f.f.f.u.u.u.f.,.T :XFXGXGXGXGXGXGXGXGXGXSXNXE.f :.:.:.:.:.=.=.=.=.` ` ` ` ` ` ~ ~ ~ ~ ~ ~ ~ ~ ~ W W W W R $.HXHXHXHXHXHXHXHXHX",
|
"o@ c #6A797C",
|
||||||
"HXHXHXHXHXHXHXHXHX~ ..W W W W W W W W W W W W W W W W W W W W E ~ ~ a _ aXFXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXFX7XV.s.:.=.:.,.u.f.f.f.f.u.u.u.r.~ s ~.VXSXGXGXGXGXGXGXGXGXGXAXhXV.d :.:.=.=.=.=.=.` ` ` ` ` ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ W W W W O.E HXHXHXHXHXHXHXHXHX",
|
"p@ c #D0D5D5",
|
||||||
"HXHXHXHXHXHXHXHXHXg $.T W W W W W W W W W W W W W W W W W W W E ~ ~ e G.hXAXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXSXFXVXpX*X_.Z.x.t.:.` ~ ~ ~ ~ ~ ' x.*XVXSXGXGXGXGXGXGXGXGXGXGXDXuXw.W :.=.=.=.=.` ` ` ` ` ` ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ W W W W W W T $.; HXHXHXHXHXHXHXHXHX",
|
"q@ c #AFB8B9",
|
||||||
"HXHXHXHXHXHXHXHXHX %.R W W W W W W W W W W W W W W W W W W W W ~ d T qXgXBXFXSXSXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXSXFXFXBXNXaX>X,X[._.T.T.E.|.:XNXCXSXGXGXGXGXGXGXGXGXGXGXSXVX Xd =.=.=.=.` ` ` ` ` ` ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ E W W W W W W R %.HXHXHXHXHXHXHXHXHXHX",
|
"r@ c #DBDFE0",
|
||||||
"HXHXHXHXHXHXHXHXHXHX@.W W W W W W W W W W W W W W W W W W W W W ~ R ` s.H.oXkXNXNXCXFXSXSXGXGXGXGXGXGXGXGXGXGXGXGXGXGXSXSXDXFXCXCXBXVXVXBXCXFXSXSXGXGXGXGXGXGXGXGXGXGXGXAXhXm.a :.` =.` ` ` ` ` ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ W W W W W W W W W W @.HXHXHXHXHXHXHXHXHXHX",
|
"s@ c #69787A",
|
||||||
"HXHXHXHXHXHXHXHXHXHXx @.T W W W W W W W W W W W W W W W W W W W W ~ ~ y t a _ g.L.oXkXhXVXCXFXSXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXSXGXSXSXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXSXBX:Xf ~ ` ` ` ` ` ` ` ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ E W W W W W W W W W T $.h HXHXHXHXHXHXHXHXHXHX",
|
"t@ c #B8C0C0",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHX%.R W W W W W W W W W W W W W W W W W W W W W ~ ~ ~ ~ d a t a ' s.R.oXnXDXSXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXZXhXg.y =.` ` ` ` ` ~ ~ ~ ~ ~ ~ ~ ~ ~ E ~ E W W W W W W W W W W R %.HXHXHXHXHXHXHXHXHXHXHX",
|
"u@ c #F0F1F2",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXO.~ W W W W W W W W W W W W W W W W W W W W W ~ ~ ~ ~ ~ ` ` ~ W a a d ! <XFXGXGXGXGXGXFXSXSXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXAXjX`.y ` ` ` ` ` ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ E E W W W W W W W W W W W W ..O.HXHXHXHXHXHXHXHXHXHXHX",
|
"v@ c #8A9697",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHX; $.T W W W W W W W W W W W W W W W W W W W W W ~ ~ ~ ~ ~ ~ ` ` ` =.~ p 2XFXGXGXGXSXZXMXNXVXFXSXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXZXjX%Xa W =.` ` ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ W W W W W W W W W W W W W W T %.= HXHXHXHXHXHXHXHXHXHXHX",
|
"w@ c #E8EAEB",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHX%.R W W W W W W W W W W W W W W W W W W W W W ~ ~ ~ ~ ~ ~ ~ ` ` =.d a.mXSXGXGXSXCXY.:.U..XkXDXSXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXSXAXBXjX Xa d =.` ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W R $.HXHXHXHXHXHXHXHXHXHXHXHX",
|
"x@ c #D9DDDD",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXv $.T W W W W W W W W W W W W W W W W W W W W E ~ ~ ~ ~ ~ ~ ` ` ` a C.NXSXGXGXDXNXg.a ~ ~ ~ '.FXGXGXGXGXFXFXFXDXDXSXSXSXSXSXSXSXSXDXBXhXuXZ.y d ` ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W T $.x HXHXHXHXHXHXHXHXHXHXHXHX",
|
"y@ c #ACB4B6",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHX%.R W W W W W W W W W W W W W W W W W W W W W W ~ ~ ~ ~ ~ ` ` =.i ].CXGXGXGXCX5X:.:.r.r.d [.FXGXGXGXFXlXXX3XzXmXNXNXNXNXNXNXNXfXuX,XJ.~ t ~ ` ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W W W R %.HXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"z@ c #6F7E81",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXP @.T W W W W W W W W W W W W W W W W W W W W W ~ ~ ~ ~ ~ ~ ` ~ E :XFXGXGXGXVX|.R e.r.:.w.yXFXGXGXSXCX'.e ` t.g.m.J.L.R.R.L.A.x.;.d t f ` ` ~ ~ ~ ~ ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W W W W W W T @.m HXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"A@ c #5F7072",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHX%.R W W W W W W W W W W W W W W W W W W W W W E ~ ~ ~ ~ ~ ` a q.fXDXGXGXSXNXJ.f e.r.~ x.hXSXGXGXSXNXV.d ` W f d d a a a a a a d ~ ` ` ~ ~ ~ ~ ~ ~ ~ ~ E E W W W W W W W W W W W W W W W W W W W W W R %.HXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"B@ c #738183",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXP $.T W W W W W W W W W W W W W W W W W W W W W E ~ ~ ~ ~ ` t C.VXSXGXGXDXfXg.W e.r.f K.VXSXGXGXDXbXt.W :.:.:.=.=.=.` ` ` ` ` ` ~ ~ ~ ~ ~ ~ ~ ~ ~ E E W W W W W W W W W W W W W W W W W W W W W W T $.v HXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"C@ c #3B5053",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHX%.W W W W W W W W W W W W W W W W W W W W W W E ~ ~ ~ ~ ~ t ].CXSXGXGXFX3X` =.e.e.R ).CXGXGXGXCX2XW ` =.=.=.` ` ` ` ` ` ~ ` ~ ~ ~ ~ ~ ~ ~ ~ ~ E E W W W W W W W W W W W W W W W W W W W W W W W W %.HXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"D@ c #677779",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHX* %.R W W W W W W W W W W W W W W W W W W W W W ~ ~ ~ ~ R Q wXNXAXSXSXVX[.d :.e.=.;.yXFXGXGXSXVX`.a =.=.=.` ` ` ` ` ` ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W W W W W W W W W T %.* HXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"E@ c #B9C1C1",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX@.O.T W W W W W W W W W W W W W W W W W W W W E ~ ~ ~ d ' @XyXNXVXNXdXZ.d :.e.R s.NXSXGXGXSXNXV.a =.` ` ` ` ` ` ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W W W W W W W W W W W W W T O.@.HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"F@ c #C3CACB",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX5.R W W W W W W W W W W W W W W W W W W W W W ~ ~ ~ ! ~ d ' b.W.%XrXd.R :.:.a K.NXSXGXGXFXbXw.f =.` ` ` ` ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ E E W W W W W W W W W W W W W W W W W W W W W W W W W W W R 5.HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"G@ c #627375",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXg %.R W W W W W W W W W W W W W W W W W W W W E ~ ~ ~ ~ ~ d a y R w.:.=.:.=.R =XgXDXSXAXBX1XR ~ ` ` ` ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W W W W W W W W W W W W W T %.w HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"H@ c #55676A",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX+.@.T W W W W W W W W W W W W W W W W W W W W ~ ~ ~ ~ ~ ` ` ` ~ R ` :.:.=.` K.%XzXNXNXgXE.y ` ` ` ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W W W W W W W W W W W W W W W T @.o.HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"I@ c #3C5153",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX%.~ T W W W W W W W W W W W W W W W W W W W W ~ ~ ~ ~ ~ ` ` ` ` =.=.:.:.:.d d ;.b.R.&Xv.a ` ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W T ~ %.HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"J@ c #283E42",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX4.R T W W W W W W W W W W W W W W W W W W W E ~ ~ ~ ~ ~ ` ` ` ` =.=.=.=.=.` R a y R ~ ` ~ ~ ~ ~ ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W T R 5.HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"K@ c #294043",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX& %.R W W W W W W W W W W W W W W W W W W W E ~ ~ ~ ~ ~ ~ ` ` ` =.=.` ` ` ` ` ` ` ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W R 4.$ HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"L@ c #D8DCDD",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXk %.R W W W W W W W W W W W W W W W W W W W W ~ ~ ~ ~ ~ ` ` ` ` ` ` ` ` ` ` ~ ~ ~ ~ ~ ~ ~ ~ ~ E E E W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W R %.g HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"M@ c #374C4E",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXM %.R W W W W W W W W W W W W W W W W W W W ~ ~ ~ ~ ~ ~ ` ` ` ` ` ` ` ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W R %.n HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"N@ c #B0B9BA",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX{ $.R W W W W W W W W W W W W W W W W W W ~ ~ ~ ~ ~ ~ ` ` ` ` ` ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W R $.U HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"O@ c #FEFFFE",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX{ $.R W W W W W W W W W W W W W W W W W W E ~ ~ ~ ~ ~ ` ` ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ E E W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W R %.M HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"P@ c #D5DADA",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXM %.R W W W W W W W W W W W W W W W W W E ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W R %.n HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"Q@ c #273D41",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXk %.R T W W W W W W W W W W W W W W W W ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W T W %.g HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"R@ c #45595C",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX* 4.~ T W W W W W W W W W W W W W W W ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W T ..4.# HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"S@ c #768587",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX%.@.T W W W W W W W W W W W W W W W ~ ~ ~ ~ ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W T @.%.HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"T@ c #627274",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX .%.R T W W W W W W W W W W W W W E ~ ~ ~ ~ ~ ~ ~ E W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W T R %.} HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"U@ c #ACB5B6",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX7 4.O.T W W W W W W W W W W W W W ~ ~ ~ ~ E E W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W T O.%.- HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"V@ c #E9ECEC",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX+.%.W T W W W W W W W W W W W E ~ E E W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W T W %. .HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"W@ c #829091",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX- %.@.R T W W W W W W W W W W ~ W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W T R $.%.* HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"X@ c #808E90",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXk %.@.R T W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W T R @.%.j HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"Y@ c #C1C8C9",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXn %.@.R T W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W T W @.%.n HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"Z@ c #A8B1B3",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXk $.$.~ R T W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W T R ..$.$.j HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"`@ c #BFC6C7",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX- O.%.@.W T T W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W T T W @.%.O.* HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
" # c #3E5355",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXk @.%.$.O.R T T W W W W W W W W W W W W W W W W W W W W W W T T R O.$.%.@.h HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
".# c #C5CCCC",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX; E $.%.$.O.~ W W T T T T T T T T T T T T T T W W W O.$.$.$.E ; HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"+# c #A6AFB0",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX ; P ..$.$.$.$.$.@.@.@.@.@.@.@.@.$.$.$.$.$.O.P ; . HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"@# c #9CA6A7",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXO % ; g h h h h h h h ; % O HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"## c #596A6C",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"$# c #F2F4F4",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"%# c #758485",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"&# c #C3CACA",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"*# c #4A5D60",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"=# c #7C8A8B",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
|
"-# c #58696B",
|
||||||
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX"
|
";# c #B1B9BA",
|
||||||
};
|
"># c #CBD1D2",
|
||||||
|
",# c #57686B",
|
||||||
|
"'# c #929E9F",
|
||||||
|
")# c #405456",
|
||||||
|
"!# c #8C9899",
|
||||||
|
"~# c #E1E4E5",
|
||||||
|
"{# c #B5BDBE",
|
||||||
|
"]# c #57696B",
|
||||||
|
"^# c #A1ABAD",
|
||||||
|
"/# c #5A6B6D",
|
||||||
|
"(# c #939FA0",
|
||||||
|
"_# c #E1E5E5",
|
||||||
|
":# c #46595B",
|
||||||
|
"<# c #2F4447",
|
||||||
|
"[# c #546668",
|
||||||
|
"}# c #9DA8A9",
|
||||||
|
"|# c #E7E9EA",
|
||||||
|
"1# c #9AA4A6",
|
||||||
|
"2# c #475B5D",
|
||||||
|
"3# c #FDFDFE",
|
||||||
|
"4# c #2E4346",
|
||||||
|
"5# c #B7BEBF",
|
||||||
|
"6# c #D3D8D8",
|
||||||
|
"7# c #99A3A5",
|
||||||
|
"8# c #D7DBDB",
|
||||||
|
"9# c #4F6164",
|
||||||
|
"0# c #949FA1",
|
||||||
|
"a# c #808D8F",
|
||||||
|
"b# c #96A1A2",
|
||||||
|
"c# c #2D4447",
|
||||||
|
"d# c #9FAAAB",
|
||||||
|
"e# c #929D9F",
|
||||||
|
"f# c #9EA8A9",
|
||||||
|
"g# c #EBEDEE",
|
||||||
|
"h# c #4D5F62",
|
||||||
|
"i# c #959FA1",
|
||||||
|
"j# c #4C5E61",
|
||||||
|
"k# c #4A5D5F",
|
||||||
|
"l# c #909B9D",
|
||||||
|
"m# c #7A8889",
|
||||||
|
"n# c #F4F6F6",
|
||||||
|
"o# c #DEE2E2",
|
||||||
|
"p# c #DFE3E3",
|
||||||
|
"q# c #4E6062",
|
||||||
|
"r# c #8F9B9C",
|
||||||
|
"s# c #CACFD0",
|
||||||
|
"t# c #586A6C",
|
||||||
|
"u# c #B5BCBE",
|
||||||
|
"v# c #8B9798",
|
||||||
|
"w# c #3F5355",
|
||||||
|
"x# c #425558",
|
||||||
|
"y# c #949FA0",
|
||||||
|
"z# c #9BA5A7",
|
||||||
|
"A# c #6D7C7E",
|
||||||
|
"B# c #C8CECE",
|
||||||
|
"C# c #4F6163",
|
||||||
|
"D# c #919C9D",
|
||||||
|
"E# c #A0AAAC",
|
||||||
|
"F# c #889596",
|
||||||
|
"G# c #A8B2B3",
|
||||||
|
"H# c #E4E7E8",
|
||||||
|
"I# c #818F90",
|
||||||
|
"J# c #D5D9DA",
|
||||||
|
"K# c #2C4345",
|
||||||
|
"L# c #889597",
|
||||||
|
"M# c #DCE0E1",
|
||||||
|
"N# c #A2ABAD",
|
||||||
|
"O# c #56686B",
|
||||||
|
"P# c #2F4547",
|
||||||
|
"Q# c #2C4246",
|
||||||
|
"R# c #667678",
|
||||||
|
"S# c #5F6F72",
|
||||||
|
"T# c #A1ABAC",
|
||||||
|
"U# c #9BA6A8",
|
||||||
|
"V# c #E8EBEB",
|
||||||
|
"W# c #D9DCDD",
|
||||||
|
"X# c #627275",
|
||||||
|
"Y# c #859293",
|
||||||
|
"Z# c #A7B0B1",
|
||||||
|
"`# c #4F6265",
|
||||||
|
" $ c #839091",
|
||||||
|
".$ c #F8F8F9",
|
||||||
|
"+$ c #CBD1D1",
|
||||||
|
"@$ c #415557",
|
||||||
|
"#$ c #7D8B8C",
|
||||||
|
"$$ c #758385",
|
||||||
|
"%$ c #C5CBCC",
|
||||||
|
"&$ c #B7BFC0",
|
||||||
|
"*$ c #607072",
|
||||||
|
"=$ c #758486",
|
||||||
|
"-$ c #465A5D",
|
||||||
|
";$ c #394D50",
|
||||||
|
">$ c #69787B",
|
||||||
|
",$ c #728082",
|
||||||
|
"'$ c #BDC4C5",
|
||||||
|
")$ c #546568",
|
||||||
|
"!$ c #717F81",
|
||||||
|
"~$ c #68777A",
|
||||||
|
"{$ c #778688",
|
||||||
|
"]$ c #3A4F51",
|
||||||
|
"^$ c #F5F6F7",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" . . . . . . . ",
|
||||||
|
" . . . . . . . . . . . ",
|
||||||
|
" . . . . . . . . . . . . . . ",
|
||||||
|
" . . . . . . . + @ # . . . . . . . . ",
|
||||||
|
" . . . . . . . $ % & * = - ; . . . . . . . . ",
|
||||||
|
" . . . . . . . > , ' ) ! ~ { ] ^ / . . . . . . . . ",
|
||||||
|
" . . . . . . . ( _ : < [ } } } [ ~ | 1 2 3 . . . . . . . . ",
|
||||||
|
" . . . . . . . 4 5 6 7 ~ } } } } } } } [ ~ 8 9 0 + 4 . . . . . . . ",
|
||||||
|
" . . . . . . . + a b ~ [ } } } } ~ [ } } } } c d e f g h i . . . . . . . . ",
|
||||||
|
" . . . . . . . j k l m ~ } } } } ~ n o * ~ ~ } } } } } d m p q r s . . . . . . . . ",
|
||||||
|
" . . . . . . 4 t u v d c } } } [ ~ w x y z A B ~ ~ } } } } } d < C D E F . . . . . . . . ",
|
||||||
|
" . . . . . . . G H I } ! } } } } d 7 J K F . . L M N O ! ~ } } } } } P Q R S T U . . . . . . . . ",
|
||||||
|
" . . . . . . . V W X Y Z } } } } ! [ : ^ ` . . . . . . ...+.@.[ ~ } } } } } ~ } #.$.%.$ . . . . . . . . ",
|
||||||
|
" . . . . . . . &.*.=.~ [ } } } c Z -.;.> . . . . . . . . . . F >.*.,.} ~ } } } } } ~ } O '.).$ . . . . . . . . ",
|
||||||
|
" . . . . . . . !.~.{.m ! } } } } ~ ].^./.U . . . . . . . . . . . . . (._.:.<.< ~ } } } } } ! [ ' [.}.$ . . . . . . . . ",
|
||||||
|
" . . . . . . 4 |.1.2.~ } } } } [ [ 3.4.# . . . . . . . . . . . . . . . . . 4 5.6.7.e ~ c } } } } [ ~ -.8.z !.. . . . . . . . ",
|
||||||
|
" . . . . . . . / 9.,.~ [ } } } } ~ 0.1.a.4 . . . . . . . . . . . . . . . . . . . . 4 b.c.: 8 ~ [ } } } } [ d d.e.f.g.. . . . . . . . ",
|
||||||
|
" . . . . . . . h.i.j.e ~ } } } } ~ m k.- ( . . . . . . . . . . . . . . . . . . . . . . . . 4 h g l.m.Z [ } } } } [ d 0.X n.o.. . . . . . . . ",
|
||||||
|
" . . . . . . 4 p.q.r.d [ } } } [ ~ s.t.u.. . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 v.w.x.Y d [ } } } } [ d y.= z.A.. . . . . . . . ",
|
||||||
|
" . . . . . . . B.C.D.} ~ } } } } d E.F.G.V . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + H.I.{ d [ } } } } [ d 7 J.2 K.. . . . . . . . ",
|
||||||
|
" . . . . . . . L.M.N.7 Z } } } } ! [ 7.O.P.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Q.R.S.2.d [ } } } } [ Z Y T.U.V.4 . . . . . . . ",
|
||||||
|
" . . . . . . . W.D X.[ [ } } } } d Y.Z.r 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . g.f.`. +d [ } } } } [ ~ .+++@+&.4 . . . . . . . . ",
|
||||||
|
" . . . . . . . j #+T.$+~ } } } } ) $+l f. .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . !./.%+v ~ [ } } } } [ ~ ].&+c.*+4 . . . . . . . . ",
|
||||||
|
" . . . . . . . 4 =+-+;+~ } } } } [ [ >+,+'+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . j )+!+* [ ! } } } } } ~ < ~+6.{+(.. . . . . . . . ",
|
||||||
|
" . . . . . . . # U.<.~ [ } } } } ~ { ]+^+(.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . j G./+(+c ~ } } } } } ~ } _+:+t L.. . . . . . . . ",
|
||||||
|
" . . . . . . . U <+[+}+~ } } } } ~ < |+^ 1+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . $ 2+3+@.} ~ } } } } } ~ [ 4+S 5+U . . . . . . . . ",
|
||||||
|
" . . . . . . . 5.6+7+d [ } } } [ Z 7+8+y . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . U 9+S R < Z } } } } } ~ [ >+0+a+b+. . . . . . . . ",
|
||||||
|
" . . . . . . . c+H.d+< ~ } } } } Z }+e+z .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . F f+D ~+< d } } } } } ~ [ O -+W !.. . . . . . . ",
|
||||||
|
" . . . . . . . s g+%+2.P } } } } [ ~ h+i+j+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . s _.k+&+m d } } } } } ~ [ ' l+m+( . . . . . . ",
|
||||||
|
" . . . . . . . n+6.b [ [ } } } } d 0.o+t 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 *+9.p+e d c } } } } ! ! -.q+r+( . . . . ",
|
||||||
|
" . . . . . . . $ s+t+].~ } } } } ~ m T.u+j . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . v+U.w+8 ~ [ } } } } [ ~ 2.x+. . . . ",
|
||||||
|
" . . . . . . . {+y+Y.~ } } } } [ [ O z+A+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . B+C+D+E+~ [ } } } } F+8+. . . . ",
|
||||||
|
" . . . . . . . G+C.I [ [ } } } } ~ 7 H+I+J+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . / ^ ] { c } } } K+L+. . . . ",
|
||||||
|
" . . . . . . . F @ M+N+Z } } } } ! } &+w.` . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o.- O+~ } } K+L+. . . . ",
|
||||||
|
" . . . . . . . *+P+s.d [ } } } [ d Q+R+S+4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 T+: d } } K+L+. . . . ",
|
||||||
|
" . . . . . . . ( U+l.m ~ } } } } Z V+I.f.W+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . / X+o < } } } K+L+. . . . ",
|
||||||
|
" . . . . . . 4 Y+Z+;+Z } } } } [ ~ ,.`+A.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . $ i. @.+~ } } } } .@+@. . . . ",
|
||||||
|
" . . . . . . . Q.a @@[ [ } } } } Z #@A $@(.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . y %@&@~ [ } } } [ d * *@. . . . ",
|
||||||
|
". . . . . . U =@^.8 ~ } } } } [ < -@;@!.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . c+>@D.< [ } } } } ~ .+X M.L.. . . . ",
|
||||||
|
". . . . . ,@'@-.~ c } } } [ ~ 7+)@!@. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (.~@J Y ~ } } } } [ } {@H ` . . . . . . ",
|
||||||
|
". . . ]@H.D.^@[ } } } } ~ E./@(@F . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . v+_@:@Z [ } } } [ ~ v <@[@}@. . . . . . . ",
|
||||||
|
". . . |@1@d } } } } ! } 2@3@B.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ( 4@T.< ~ } } } } ~ V+l 5@6@. . . . . . . . . ",
|
||||||
|
". . . 5@8 [ } } } Z v 7@t 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (.5+[. +d } } } } [ ! 4+c.W.. . . . . . . . . . . ",
|
||||||
|
". . . 8@.+[ } } m 9@5@j . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + 0@_+[ [ } } } } d 2.1.T L.. . . . . . . . . . . . . ",
|
||||||
|
". . . 8@.+[ } [ Q+}.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . b+f.^.8 ~ } } } } ~ < l.a@b@. . . . . . . . . . . . . . . . ",
|
||||||
|
". . . 8@.+[ } [ B c@. . . . . . . G d@G . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 e@3+-.~ [ } } } [ Z f@g@h@. . . . . . . . . . . . . . . . . . . . ",
|
||||||
|
". . . 8@.+[ } [ B >.. . . . . . . i@j@k@;@` . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . l@w.2@} [ } } } } ~ E.F.2+s . . . . . . . . . . . . . . . . . . . . . ",
|
||||||
|
". . . 8@.+[ } [ B >.. . . . . . . =+m@n@7 o@;@B.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . L.p@X E.~ } } } } [ } I q@g.. . . . . . . . . . . . . . . (.]@# + $ . . . ",
|
||||||
|
". . . 8@.+[ } [ B >.. . . . . . . r@Q+! [ d Y s@t@u@. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . !@g@=.Z [ } } } [ ~ -.v@p.. . . . 4 4 s !.; w@r x@(@R.y@6.+.A z@A@B@*+. . . ",
|
||||||
|
". . . 8@.+[ } [ B >.. . . . . . . T+C@[ } } [ d E.D@_ A.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . c+E@9 } ~ } } } } ~ }+^.F@b+. . . . .- $.Z+S.G@H@>+I@7 .+m [ n@J@n@K@R+V . . . ",
|
||||||
|
". . . 8@.+[ } [ B >.. . . . . . . L@M@~ } } } } [ d E.l N@n+O@. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . L.P@!+2.d } } } } [ [ R a + . . . . . . 4 C+E+Q@K+K@d ~ [ [ [ } } } } ) R@%.. . . . ",
|
||||||
|
". . . 8@.+[ } [ B >.. . . . . . . K.S@0.d [ } } } } [ d E.T@U@v.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . V@k+3.~ [ } } } } d ;+[.L@s . . . . . . . . c+W@} } } } } } } } } } } } [ X@$ . . . . ",
|
||||||
|
". . . 8@.+[ } [ B >.. . . . . . . . ` Y@N. +d [ } } } } [ Z E.l.Z@w@4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . L `@l n ~ } } } } ~ < T.R.( . . . . . . . . . . . _.d+~ } } } } } } } } } [ #/.. . . . ",
|
||||||
|
". . . 8@.+[ } [ B >.. . . . . . . . . . c+.#J 1@d [ } } } } [ ~ .+{.+#w@4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . }@t '.v ~ [ } } } [ ~ :@@#V@. . . . . . . . . . . . . . s+Q+[ } } } } } } } } ~ N.( . . . . ",
|
||||||
|
". . . 8@.+[ } [ B >.. . . . . . . . . . . . !.z 6 v ~ [ } } } } [ ~ V+##+#V.}@. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . $#H o } [ } } } } ~ Y %#g+(.. . . . . . . . . . . . . . F &#*#[ } } } } } } } [ 2.4@. . . . ",
|
||||||
|
". . . 8@.+[ } [ B >.. . . . . . . . . . . . . . b+W =#Q+[ [ } } } } } ~ e -#X+V.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . L.@ [+}+~ } } } } [ < &+;#c+. . . . . . . . . . . . . . . *+S * } } } } } } } } } ~ s@$#. . . . ",
|
||||||
|
". . . 8@.+[ } [ B c@. . . . . . . . . . . . . . . . j >#Z+' [ ! } } } } } Z m ,#@+&.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . *+'#' Z [ } } } [ ~ )#!#~#. . . . . . . . . . . . . . . c+{#]#} ! } } } } } } } } [ E.{#. . . . ",
|
||||||
|
". . . 8@.+[ } [ m@$@. . . . . . . . . . . . . . . . . . j W [.=.[ ~ } } } } } d < p ^#5.(.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . g.{#/#} ~ } } } } Z .+& i.$ . . . . . . . . . . . . . . L.2+]+7 d } } } } [ ~ } } } } d A@; . . . . ",
|
||||||
|
". . . 8@.+[ } [ 7 (#_#(.. . . . . . . . . . . . . . . . . . j @ <@:#[ ~ } } } } } P <#[#}#p.s . . . . . . . . . . . . . . . . . . . . . . . . . . F %.6 { d } } } } [ [ o g 3 . . . . . . . . . . . . . . . |#1#w Z [ } } } } P 0.,.< } } } e H . . . . ",
|
||||||
|
". . . 8@.+[ } } } e [#@#i@s . . . . . . . . . . . . . . . . . . $ %.$.2#[ ~ } } } } } P < C D [@L.. . . . . . . . . . . . . . . . . . . . . . . w@_@>+~ [ } } } } d C@-+>.3#. . . . . . . . . . . . . . ( a@T.m ~ } } } } ~ 4#-@5#6#p P } d ]#V.. . . . ",
|
||||||
|
". . . u+].[ } } } } ~ m C 7#S+(.. . . . . . . . . . . . . . . . . . U 8#;.#.[ ~ } } } } } ~ < 9#0#E L.. . . . . . . . . . . . . . . . . . . ( ;@D+e ~ } } } } ~ m 9@u+!.. . . . . . . . . . . . . . i 5+a# +Z } } } } [ d =.b#*+. . E@d.~ c#d#. . . . ",
|
||||||
|
". . . g+<.[ ~ } } } } } ~ m <.b#=+(.. . . . . . . . . . . . . . . . . . F $@e#*#[ ~ } } } } } ~ < ,.6+|.L.. . . . . . . . . . . . . . . 4 T+a#1@~ c } } } [ Z w f#g#. . . . . . . . . . . . . . . ; a @@[ [ } } } } Z E.B@}.L.. . . $ ;.~ _+r . . . . ",
|
||||||
|
". . . s e@t.4+} ~ } } } } } ~ < h#t.e@(.. . . . . . . . . . . . . . . . . . s =+i#j#} ~ } } } } } ~ 4#k#l#|.s . . . . . . . . . . . . u@`+O+} [ } } } } ~ Y m#T (.. . . . . . . . . . . . . . h.i.D@V+~ } } } } [ } 7.2 n#. . . . . . &.9@e#(.. . . ",
|
||||||
|
". . . . . (.o#0#h#< ~ } } } } } ~ } ,.P+p.(.. . . . . . . . . . . . . . . . . . (.p#b#q#< ~ } } } } } ~ [ >+r#$@L.. . . . . . . . V s# @V+~ } } } } [ < t#u#( . . . . . . . . . . . . . . . {+v#v ~ c } } } [ ~ -.v@r . . . . . . . . . T > . . . . ",
|
||||||
|
". . . . . . . (.o#b#9#m ~ } } } } } ~ c ,.b#=+s . . . . . . . . . . . . . . . . . . (.e@g@o m ~ } } } } } ~ ) w '@5 V . . . . 4 ,@;.w#d [ } } } [ ~ x#+@,@. . . . . . . . . . . . . . . G+2 [#[ [ } } } } ~ }+D@f.$ . . . . . . . . . . . . . . . . ",
|
||||||
|
" . . . . . . . . s S+7#C m Z } } } } } ~ [ j#y#c@F . . . . . . . . . . . . . . . . . . (.i@z#[#e Z c } } } } ~ ) :@$.^+ .. G+;#D.[ ) } } } } ~ E.A#B# .. . . . . . . . . . . . . . V }.B@E.Z } } } } [ [ C#4.A.. . . . . . . . . . . . . . . ",
|
||||||
|
" . . . . . . . . s p#_@[#m d } } } } } Z [ 3.D#Y+U . . . . . . . . . . . . . . . . . . (.{+E#t#e d [ } } } } ~ ~ O F#U+q+Y P } } } } ! [ C G#j+. . . . . . . . . . . . . . . H#t.(+Z [ } } } c d C@I#T+4 . . . . . . . . . . . . . . . ",
|
||||||
|
" . . . . . . . . s r q H@m d } } } } } ~ } k#+.J#U . . . . . . . . . . . . . . . . . . (.*++#d+e d [ } } } } ~ K#m.! [ } } } [ d v L#M#i . . . . . . . . . . . . . . n#{#-@< ~ } } } } ~ $+G@4@!.. . . . . . . . . . . ",
|
||||||
|
" . . . . . . . (.> N#O#P#d } } } } } ~ } >+Z.~@h.. . . . . . . . . . . . . . . . . . 4 w@U.k.].d Q#} } } } [ } } } } ~ $+R#k $ . . . . . . . . . . . . . . s %.%+2.Z } } } } [ Z >+,+V@. . . . . . . ",
|
||||||
|
" . . . . . . . 4 &.`+]#m Z } } } } } ~ } R@7@^+U . . . . . . . . . . . . . . . . . . }@n+w.S#V+d [ } } } } } [ ~ k#T#B+. . . . . . . . . . . . . . . W.U#b [ [ } } } } Z 7 8.J#(.. . . . . . . ",
|
||||||
|
" . . . . . . . }@V#g ]#e ~ } } } } } ! Q#=.<@6#V . . . . . . . . . . . . . . . . . . . A.2 T.}+~ [ } } ~ { 8.W#4 . . . . . . . . . . . . . . W+8@T@e ! } } } } ! < /#- ( . . . . . . . ",
|
||||||
|
" . . . . . . . }@v.g ##V+~ [ } } } } [ [ 7+<@6#U . . . . . . . . . . . . . . . . . . . / ;#X#E+Z < f - ( . . . . . . . . . . . . . . 4 =+Y#1@~ } } } } [ ! m@e#!@. . . . . . . ",
|
||||||
|
" . . . . . . . 4 V.Z#d+}+~ [ } } } } ! ~ x#o+K $ . . . . . . . . . . . . . . . . . . . / >@ @e#h . . . . . . . . . . . . . . . # U.`#) [ } } } } ~ | /@<+V . . . . . . . ",
|
||||||
|
" . . . . . . . 4 V#x+k.N+Z [ } } } } ~ Z ' $@ .$. . . . . . . . . . . . . . . . . . 4 n#U . . . . . . . . . . . . . . h.|@[+V+Z } } } } ! } I 3@o.. . . . . . . ",
|
||||||
|
" . . . . . . . 4 V.H T.m.d [ } } } } ~ Z ' a#+$!.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 _#r#@$d [ } } } [ d Q+Z.[@4 . . . . . . ",
|
||||||
|
" . . . . . . . 4 W.q@x.m.d [ } } } } ~ ~ &@#$/.( . . . . . . . . . . . . . . . . . . . . . . . . . . . . ` 2 : c#~ } } } } Z V+I.f.b+. . . . . . . ",
|
||||||
|
" . . . . . . . . A.H.R#m.d [ } } } } ) ~ Q+6 i.( . . . . . . . . . . . . . . . . . . . . . . . . L.M.$$7 Z } } } } [ ~ O+g / . . . . . . . ",
|
||||||
|
" . . . . . . . . u@z.R#E.d [ } } } } ! ! -.J %$( . . . . . . . . . . . . . . . . . . . . . h@P+:@! [ } } } } Z 0.-+|.i . . . . . . ",
|
||||||
|
" . . . . . . . . G &$R#| ~ [ } } } } [ ~ Y.$$%$!.. . . . . . . . . . . . . . . . . !.;@k.m ! } } } } ~ m *$#+j . . . . . . . ",
|
||||||
|
" . . . . . . . . G z.] 7 ~ [ } } } } [ ~ 1@=$i.!.. . . . . . . . . . . . . 4 |.A 2.~ } } } } [ ! -$1#n+. . . . . . . ",
|
||||||
|
" . . . . . . . . o.&$I.{ ~ [ } } } } [ P ;+`.%$c+. . . . . . . . . . / @+,.~ [ } } } } ~ { J 6#(.. . . . . . ",
|
||||||
|
" . . . . . . . . o.U+ @;$~ [ } } } } [ d ;+H+Y@` . . . . . . $ %$>$e ~ } } } } ~ < |+^ n#. . . . . . . ",
|
||||||
|
" . . . . . . . . # a@[+0.d [ } } } } [ d ;+,$4@B.. . 4 =+$.-.d [ } } } [ Z =.S {+. . . . . . . ",
|
||||||
|
" . . . . . . . . P.'$X 0.d [ } } } } [ Z ;+/@R.!@H )$c ) } } } } d m.!$)+h.. . . . . . . ",
|
||||||
|
" . . . . . . . . ` 8@M+;+d [ } } } } [ Z 1@7.7 ~ } } } } ! [ I w.# . . . . . . . ",
|
||||||
|
" . . . . . . . . c+f.$$;+P [ } } } } [ ~ [ } } } c P v $.r 4 . . . . . . ",
|
||||||
|
" . . . . . . . . ( i.=$ +~ [ } } } } } } } ~ ].~$i. .. . . . . . . ",
|
||||||
|
" . . . . . . . . !.i.q+Y.~ [ } } } [ [ 4+T#/ . . . . . . . ",
|
||||||
|
" . . . . . . . . !.i.{$-.! ~ ~ ]$Z+5+4 . . . . . . . ",
|
||||||
|
" . . . . . . . . ( % 6 B A@a@( . . . . . . . ",
|
||||||
|
" . . . . . . . . ^$K &.. . . . . . . ",
|
||||||
|
" . . . . . . . . . . . . . . . ",
|
||||||
|
" . . . . . . . . . . . ",
|
||||||
|
" . . . . . . . ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" "};
|
||||||
|
|
Before Width: | Height: | Size: 827 B After Width: | Height: | Size: 1,006 B |
|
@ -1,181 +1,159 @@
|
||||||
/* XPM */
|
/* XPM */
|
||||||
static char *bitcoin__[] = {
|
static char * bitcoin16_xpm[] = {
|
||||||
/* columns rows colors chars-per-pixel */
|
"16 16 140 2",
|
||||||
"16 16 159 2",
|
" c None",
|
||||||
" c #CA7C1E",
|
". c #FFFFFF",
|
||||||
". c #CB7D1E",
|
"+ c #FFFFFF",
|
||||||
"X c #D1811E",
|
"@ c #FFFFFF",
|
||||||
"o c #D0801F",
|
"# c #F8F9F9",
|
||||||
"O c #D1801F",
|
"$ c #C1C7C8",
|
||||||
"+ c #D3821F",
|
"% c #B5BDBE",
|
||||||
"@ c #D7831F",
|
"& c #E9EBEB",
|
||||||
"# c #EE8D18",
|
"* c #FFFFFF",
|
||||||
"$ c #F4931F",
|
"= c #FFFFFF",
|
||||||
"% c #D78625",
|
"- c #DADEDE",
|
||||||
"& c #D88520",
|
"; c #9AA5A6",
|
||||||
"* c #D98521",
|
"> c #8A9698",
|
||||||
"= c #D98620",
|
", c #B0B8B9",
|
||||||
"- c #D78B2D",
|
"' c #E5E8E8",
|
||||||
"; c #DF8D2A",
|
") c #FFFFFF",
|
||||||
": c #DF8F2F",
|
"! c #FFFFFF",
|
||||||
"> c #DF943B",
|
"~ c #EFF1F1",
|
||||||
", c #D8913C",
|
"{ c #B1B9BA",
|
||||||
"< c #D8923E",
|
"] c #869395",
|
||||||
"1 c #DF953E",
|
"^ c #899597",
|
||||||
"2 c #E28B23",
|
"/ c #ACB5B6",
|
||||||
"3 c #E38B23",
|
"( c #E2E5E5",
|
||||||
"4 c #EA9023",
|
"_ c #FFFFFF",
|
||||||
"5 c #EB9023",
|
": c #FFFFFF",
|
||||||
"6 c #ED9122",
|
"< c #FEFEFE",
|
||||||
"7 c #ED9123",
|
"[ c #CBD0D1",
|
||||||
"8 c #EE9123",
|
"} c #8F9B9C",
|
||||||
"9 c #EE9223",
|
"| c #8A9698",
|
||||||
"0 c #F39421",
|
"1 c #B0B8B9",
|
||||||
"q c #F19423",
|
"2 c #F1F3F3",
|
||||||
"w c #F39523",
|
"3 c #E5E8E8",
|
||||||
"e c #F79521",
|
"4 c #A3ADAE",
|
||||||
"r c #F59422",
|
"5 c #E0E3E3",
|
||||||
"t c #F49623",
|
"6 c #9BA6A7",
|
||||||
"y c #F69622",
|
"7 c #F5F6F6",
|
||||||
"u c #F79623",
|
"8 c #BEC4C5",
|
||||||
"i c #F09324",
|
"9 c #98A3A4",
|
||||||
"p c #F19424",
|
"0 c #808D8F",
|
||||||
"a c #F19525",
|
"a c #808D8F",
|
||||||
"s c #F49624",
|
"b c #D7DBDB",
|
||||||
"d c #F59625",
|
"c c #E0E3E4",
|
||||||
"f c #F49725",
|
"d c #A5AEB0",
|
||||||
"g c #F79624",
|
"e c #889496",
|
||||||
"h c #F79724",
|
"f c #97A2A3",
|
||||||
"j c #F69725",
|
"g c #D8DCDC",
|
||||||
"k c #F79725",
|
"h c #F3F4F4",
|
||||||
"l c #F69726",
|
"i c #F9F9F9",
|
||||||
"z c #F79726",
|
"j c #FFFFFF",
|
||||||
"x c #F89621",
|
"k c #FFFFFF",
|
||||||
"c c #F89722",
|
"l c #DCE0E0",
|
||||||
"v c #F89723",
|
"m c #A6AFB0",
|
||||||
"b c #F89724",
|
"n c #889596",
|
||||||
"n c #F89824",
|
"o c #899697",
|
||||||
"m c #F89825",
|
"p c #BEC5C6",
|
||||||
"M c #F99825",
|
"q c #F7F8F8",
|
||||||
"N c #F89925",
|
"r c #FFFFFF",
|
||||||
"B c #F89926",
|
"s c #FFFFFF",
|
||||||
"V c #F89927",
|
"t c #FFFFFF",
|
||||||
"C c #F99927",
|
"u c #DEE2E2",
|
||||||
"Z c #F0972E",
|
"v c #A7B0B2",
|
||||||
"A c #F7992A",
|
"w c #899597",
|
||||||
"S c #F79A2B",
|
"x c #899697",
|
||||||
"D c #F79B2C",
|
"y c #A6AFB1",
|
||||||
"F c #F69A2D",
|
"z c #E6E9E9",
|
||||||
"G c #F79D2F",
|
"A c #FFFFFF",
|
||||||
"H c #F89929",
|
"B c #FFFFFF",
|
||||||
"J c #F89A28",
|
"C c #FFFFFF",
|
||||||
"K c #F89A29",
|
"D c #DDE1E1",
|
||||||
"L c #F99A29",
|
"E c #B0B8B9",
|
||||||
"P c #F99B29",
|
"F c #CED3D4",
|
||||||
"I c #F89A2A",
|
"G c #FFFFFF",
|
||||||
"U c #F89A2B",
|
"H c #FFFFFF",
|
||||||
"Y c #F99B2B",
|
"I c #FFFFFF",
|
||||||
"T c #F89B2C",
|
"J c #FFFFFF",
|
||||||
"R c #F89C2C",
|
"K c #8D999A",
|
||||||
"E c #F99C2D",
|
"L c #96A1A3",
|
||||||
"W c #F99C2E",
|
"M c #B5BDBE",
|
||||||
"Q c #F89D2E",
|
"N c #F5F6F7",
|
||||||
"! c #F99D2F",
|
"O c #FDFEFE",
|
||||||
"~ c #E29335",
|
"P c #DCE0E0",
|
||||||
"^ c #E49639",
|
"Q c #9FA9AA",
|
||||||
"/ c #E2983F",
|
"R c #99A4A5",
|
||||||
"( c #F79F35",
|
"S c #E3E6E6",
|
||||||
") c #F99E31",
|
"T c #FFFFFF",
|
||||||
"_ c #F89E32",
|
"U c #FEFEFE",
|
||||||
"` c #F99E32",
|
"V c #E0E3E4",
|
||||||
"' c #F9A033",
|
"W c #A3ADAE",
|
||||||
"] c #F9A035",
|
"X c #8A9698",
|
||||||
"[ c #F9A135",
|
"Y c #C8CECF",
|
||||||
"{ c #F9A036",
|
"Z c #FBFCFC",
|
||||||
"} c #F9A136",
|
"` c #FDFDFD",
|
||||||
"| c #F9A137",
|
" . c #B6BEBF",
|
||||||
" . c #F3A03F",
|
".. c #738284",
|
||||||
".. c #F7A43F",
|
"+. c #9BA5A7",
|
||||||
"X. c #F8A139",
|
"@. c #DDE1E1",
|
||||||
"o. c #F9A23A",
|
"#. c #FDFDFD",
|
||||||
"O. c #FAA33B",
|
"$. c #EBEDEE",
|
||||||
"+. c #FAA43E",
|
"%. c #A2ACAD",
|
||||||
"@. c #FAA43F",
|
"&. c #8C9899",
|
||||||
"#. c #EF9F41",
|
"*. c #D0D5D5",
|
||||||
"$. c #EEA244",
|
"=. c #8D999B",
|
||||||
"%. c #ECA34B",
|
"-. c #CFD4D4",
|
||||||
"&. c #F8A440",
|
";. c #AAB3B4",
|
||||||
"*. c #F9A541",
|
">. c #95A0A1",
|
||||||
"=. c #F9A644",
|
",. c #D5DADA",
|
||||||
"-. c #F9A947",
|
"'. c #FCFCFC",
|
||||||
";. c #F0A349",
|
"). c #F9FAFA",
|
||||||
":. c #F5A648",
|
"!. c #BFC6C7",
|
||||||
">. c #F1A74E",
|
"~. c #879395",
|
||||||
",. c #F7AA4F",
|
"{. c #B9C1C2",
|
||||||
"<. c #E4A458",
|
"]. c #B3BBBC",
|
||||||
"1. c #E4A55B",
|
"^. c #6A797B",
|
||||||
"2. c #E8A95E",
|
"/. c #9CA6A7",
|
||||||
"3. c #F2A950",
|
"(. c #E3E6E6",
|
||||||
"4. c #F4AA52",
|
"_. c #CBD1D2",
|
||||||
"5. c #FBAF55",
|
":. c #909B9D",
|
||||||
"6. c #E4A860",
|
"<. c #95A0A1",
|
||||||
"7. c #EAAC63",
|
"[. c #D3D8D9",
|
||||||
"8. c #EBAF68",
|
"}. c #FBFBFB",
|
||||||
"9. c #F2AF61",
|
"|. c #DCE0E0",
|
||||||
"0. c #EBB16C",
|
"1. c #929D9F",
|
||||||
"q. c #F6B568",
|
"2. c #9CA6A8",
|
||||||
"w. c #E3AF71",
|
"3. c #DEE1E2",
|
||||||
"e. c #EBBE89",
|
"4. c #BBC2C3",
|
||||||
"r. c #E0BC93",
|
"5. c #ADB5B6",
|
||||||
"t. c #E3C199",
|
"6. c #E3E6E6",
|
||||||
"y. c #E6C59D",
|
"7. c #CED3D4",
|
||||||
"u. c #EAC89E",
|
"8. c #929E9F",
|
||||||
"i. c #E7C8A2",
|
"9. c #879496",
|
||||||
"p. c #EACBA6",
|
"0. c #8B9799",
|
||||||
"a. c #EBCFAF",
|
"a. c #CBD1D1",
|
||||||
"s. c #F1CCA0",
|
"b. c #D4D9D9",
|
||||||
"d. c #E7CEB1",
|
"c. c #909C9D",
|
||||||
"f. c #ECD1B0",
|
"d. c #ABB4B5",
|
||||||
"g. c #E5D2BB",
|
"e. c #E2E5E5",
|
||||||
"h. c #E8D2B8",
|
"f. c #DCE0E0",
|
||||||
"j. c #DFDFDF",
|
"g. c #DFE2E3",
|
||||||
"k. c #E7D5C1",
|
"h. c #A7B0B1",
|
||||||
"l. c #E7D7C4",
|
"i. c #9BA6A7",
|
||||||
"z. c #E5D7C7",
|
" ",
|
||||||
"x. c #E7DACB",
|
" ",
|
||||||
"c. c #EADAC8",
|
" $ % ",
|
||||||
"v. c #E9DCCC",
|
" - ; K L > , ",
|
||||||
"b. c #EDDFCE",
|
" { ] M N O P Q ^ / ",
|
||||||
"n. c #E5DDD3",
|
" [ } R S T T T T U V W | 1 ",
|
||||||
"m. c #E4DFD9",
|
" 4 X Y Z T T T T T T T ` ...5 ",
|
||||||
"M. c #ECE0D1",
|
"6 +.@.#.T T T T T T T $.%.&.*.7 ",
|
||||||
"N. c #E4E1DD",
|
"=.-.;.>.,.'.T T T ).!.~.{.].^.8 ",
|
||||||
"B. c #EDE3D8",
|
"9 /.(._.:.<.[.}.|.1.2.3.4.0 a b ",
|
||||||
"V. c #EAE4DD",
|
"c d e 5.6.7.8.9.0.a.b.c.f g ",
|
||||||
"C. c #ECE5DC",
|
" m n d.e.f.g.h.o p ",
|
||||||
"Z. c #E2E2E2",
|
" v w i.x y ",
|
||||||
"A. c #E5E2E0",
|
" E F ",
|
||||||
"S. c #E4E4E4",
|
" ",
|
||||||
"D. c #E7E7E7",
|
" "};
|
||||||
"F. c #EAEAE9",
|
|
||||||
"G. c gray92",
|
|
||||||
"H. c #EEEEEE",
|
|
||||||
"J. c None",
|
|
||||||
/* pixels */
|
|
||||||
"J.J.J.J.J.J.J.1 > J.J.J.J.J.J.J.",
|
|
||||||
"J.J.J.J.J./ ..| ' ( ~ J.J.J.J.J.",
|
|
||||||
"J.J.J.< *.{ V $ r U W _ - J.J.J.",
|
|
||||||
"J.J., o.J 0 # <.w.$.F N H % J.J.",
|
|
||||||
"J.J.o.T e 1.r.k.x.t.S z B u J.J.",
|
|
||||||
"J.^ [ Y ! #.z.H.M.n.0.d n m 2 J.",
|
|
||||||
"J.X.) | =. .h.B.5.f.j.;.v B d J.",
|
|
||||||
": Q M ` &.>.A.V.p.c.l.4.E n d = ",
|
|
||||||
"; I b A Z 2.D.s.u.F.a.-.} C w & ",
|
|
||||||
"J.l g y 6.m.G.q.3.b.Z.,.] D 8 J.",
|
|
||||||
"J.3 k c %.d.C.v.N.S.y.@.L a * J.",
|
|
||||||
"J.J.j z x 8.i.g.e.9.+.W t 6 J.J.",
|
|
||||||
"J.J.+ s h G :.7.O.R B s 7 . J.J.",
|
|
||||||
"J.J.J.O i f P L K d p 5 J.J.J.",
|
|
||||||
"J.J.J.J.J.@ 9 q i 4 + J.J.J.J.J.",
|
|
||||||
"J.J.J.J.J.J.J.X o J.J.J.J.J.J.J."
|
|
||||||
};
|
|
||||||
|
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.9 KiB |
|
@ -1,140 +1,233 @@
|
||||||
/* XPM */
|
/* XPM */
|
||||||
static char *bitcoin__[] = {
|
static char * bitcoin32_xpm[] = {
|
||||||
/* columns rows colors chars-per-pixel */
|
"32 32 198 2",
|
||||||
"32 32 102 2",
|
" c None",
|
||||||
" c #CC7D1D",
|
". c #FDFDFD",
|
||||||
". c #D5831F",
|
"+ c #FCFCFC",
|
||||||
"X c #D48221",
|
"@ c #FFFFFF",
|
||||||
"o c #D98621",
|
"# c #EDEFEF",
|
||||||
"O c #DC8820",
|
"$ c #9DA7A8",
|
||||||
"+ c #DC8D2C",
|
"% c #839092",
|
||||||
"@ c #D98F36",
|
"& c #CFD4D4",
|
||||||
"# c #D68F39",
|
"* c #FAFAFA",
|
||||||
"$ c #DD943E",
|
"= c #C2C9CA",
|
||||||
"% c #E28B23",
|
"- c #5E6F71",
|
||||||
"& c #E98F24",
|
"; c #43575A",
|
||||||
"* c #E18F2D",
|
"> c #526467",
|
||||||
"= c #ED9124",
|
", c #405457",
|
||||||
"- c #EC942A",
|
"' c #788688",
|
||||||
"; c #F59624",
|
") c #CAD0D0",
|
||||||
": c #F89724",
|
"! c #F7F8F8",
|
||||||
"> c #F79827",
|
"~ c #E0E3E4",
|
||||||
", c #F89825",
|
"{ c #828F91",
|
||||||
"< c #F0962B",
|
"] c #3E5255",
|
||||||
"1 c #F59A2D",
|
"^ c #707F81",
|
||||||
"2 c #F99B2B",
|
"/ c #D4D8D9",
|
||||||
"3 c #EC9732",
|
"( c #EFF0F1",
|
||||||
"4 c #EC9A37",
|
"_ c #B2BABB",
|
||||||
"5 c #E2963B",
|
": c #5F7072",
|
||||||
"6 c #E6983A",
|
"< c #3F5356",
|
||||||
"7 c #EC9C3B",
|
"[ c #728082",
|
||||||
"8 c #F69D33",
|
"} c #C5CBCC",
|
||||||
"9 c #F99E32",
|
"| c #F6F7F7",
|
||||||
"0 c #F49E3A",
|
"1 c #F3F4F4",
|
||||||
"q c #F9A036",
|
"2 c #ABB4B5",
|
||||||
"w c #F6A13C",
|
"3 c #4C5F61",
|
||||||
"e c #F9A33B",
|
"4 c #4F6264",
|
||||||
"r c #D79341",
|
"5 c #B0B8BA",
|
||||||
"t c #DC9641",
|
"6 c #B8BFC0",
|
||||||
"y c #E39A43",
|
"7 c #647477",
|
||||||
"u c #EA9D42",
|
"8 c #6C7C7E",
|
||||||
"i c #EFA041",
|
"9 c #BFC6C7",
|
||||||
"p c #EDA34B",
|
"0 c #F4F5F5",
|
||||||
"a c #F5A443",
|
"a c #6A7A7C",
|
||||||
"s c #F9A643",
|
"b c #3F5355",
|
||||||
"d c #FAA846",
|
"c c #889596",
|
||||||
"f c #F2A64C",
|
"d c #E4E7E7",
|
||||||
"g c #F9AA4B",
|
"e c #F5F6F6",
|
||||||
"h c #E5A251",
|
"f c #BEC5C6",
|
||||||
"j c #ECA756",
|
"g c #6B7A7C",
|
||||||
"k c #EBA758",
|
"h c #667678",
|
||||||
"l c #FAAF57",
|
"i c #B9C1C2",
|
||||||
"z c #FBB057",
|
"j c #F2F3F3",
|
||||||
"x c #FBB25B",
|
"k c #E8EBEB",
|
||||||
"c c #DFB179",
|
"l c #929E9F",
|
||||||
"v c #E4AA65",
|
"m c #415558",
|
||||||
"b c #EBAE64",
|
"n c #627275",
|
||||||
"n c #E9AF69",
|
"o c #C7CDCE",
|
||||||
"m c #FBB665",
|
"p c #C4CACB",
|
||||||
"M c #F1B46A",
|
"q c #617274",
|
||||||
"N c #F8B96D",
|
"r c #B4BCBD",
|
||||||
"B c #E5B071",
|
"s c #EFF1F1",
|
||||||
"V c #EBB777",
|
"t c #B9C0C1",
|
||||||
"C c #EEB877",
|
"u c #56686A",
|
||||||
"Z c #E7B478",
|
"v c #475A5D",
|
||||||
"A c #EBB97D",
|
"w c #A1ABAD",
|
||||||
"S c #F0B671",
|
"x c #F1F2F2",
|
||||||
"D c #F2B871",
|
"y c #F9F9F9",
|
||||||
"F c #EFBC80",
|
"z c #CACFD0",
|
||||||
"G c #E6BD8D",
|
"A c #778587",
|
||||||
"H c #EDBF88",
|
"B c #5D6E70",
|
||||||
"J c #E6BF90",
|
"C c #B6BEBF",
|
||||||
"K c #F1C187",
|
"D c #FBFCFC",
|
||||||
"L c #F1C288",
|
"E c #FEFEFE",
|
||||||
"P c #E5C093",
|
"F c #DADDDE",
|
||||||
"I c #EEC493",
|
"G c #798789",
|
||||||
"U c #E1C19B",
|
"H c #3D5154",
|
||||||
"Y c #E9C69C",
|
"I c #788788",
|
||||||
"T c #ECC89D",
|
"J c #DBDEDF",
|
||||||
"R c #F1C897",
|
"K c #CFD4D5",
|
||||||
"E c #DFC5A4",
|
"L c #596A6D",
|
||||||
"W c #DBCBB8",
|
"M c #536568",
|
||||||
"Q c #E2C7A7",
|
"N c #A1ABAC",
|
||||||
"! c #EBCBA6",
|
"O c #BAC1C2",
|
||||||
"~ c #E6CBAB",
|
"P c #EEF0F0",
|
||||||
"^ c #E9D2B7",
|
"Q c #435659",
|
||||||
"/ c #E5D1B9",
|
"R c #738284",
|
||||||
"( c #EBD6BD",
|
"S c #EBEDED",
|
||||||
") c #EFD9BE",
|
"T c #6D7D7F",
|
||||||
"_ c #DDD0C2",
|
"U c #415557",
|
||||||
"` c #DCD7D2",
|
"V c #929D9F",
|
||||||
"' c #DEDEDE",
|
"W c #FAFBFB",
|
||||||
"] c #ECDAC5",
|
"X c #C0C7C8",
|
||||||
"[ c #EDDECB",
|
"Y c #5C6D6F",
|
||||||
"{ c #E9E0D5",
|
"Z c #44575A",
|
||||||
"} c #E7E0D9",
|
"` c #98A3A5",
|
||||||
"| c #E9E2DB",
|
" . c #D8DCDD",
|
||||||
" . c #EFE8DF",
|
".. c #A9B2B4",
|
||||||
".. c #E5E5E5",
|
"+. c #E3E6E6",
|
||||||
"X. c #EBE7E2",
|
"@. c #EBEDEE",
|
||||||
"o. c #EFEAE6",
|
"#. c #DEE2E2",
|
||||||
"O. c #ECECEC",
|
"$. c #7F8C8E",
|
||||||
"+. c #F2ECE6",
|
"%. c #738183",
|
||||||
"@. c #F1F0EE",
|
"&. c #D8DCDC",
|
||||||
"#. c #F4F4F4",
|
"*. c #FCFDFD",
|
||||||
"$. c #FBFBFB",
|
"=. c #FDFEFE",
|
||||||
"%. c None",
|
"-. c #D9DDDE",
|
||||||
/* pixels */
|
";. c #45595B",
|
||||||
"%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.",
|
">. c #BFC5C6",
|
||||||
"%.%.%.%.%.%.%.%.%.%.%.%.%.%.t 5 5 $ %.%.%.%.%.%.%.%.%.%.%.%.%.%.",
|
",. c #98A3A4",
|
||||||
"%.%.%.%.%.%.%.%.%.%.%.r u w q 9 9 9 8 4 # %.%.%.%.%.%.%.%.%.%.%.",
|
"'. c #A8B1B2",
|
||||||
"%.%.%.%.%.%.%.%.%.y s e 9 2 , , , : > 2 9 q 5 %.%.%.%.%.%.%.%.%.",
|
"). c #ECEEEE",
|
||||||
"%.%.%.%.%.%.%.%.s q 2 , , , , : , > 2 2 > > 2 9 %.%.%.%.%.%.%.%.",
|
"!. c #F2F3F4",
|
||||||
"%.%.%.%.%.%.t e 1 , , , , : : ; > 2 9 9 2 , , > 2 + %.%.%.%.%.%.",
|
"~. c #A6AFB1",
|
||||||
"%.%.%.%.%.$ e 2 , , , , , , ; u u 8 1 1 2 > , , > > + %.%.%.%.%.",
|
"{. c #4A5D5F",
|
||||||
"%.%.%.%.%.e 2 , , : > ; ; > < ` ` 0 c n 1 2 , , , > , %.%.%.%.%.",
|
"]. c #526466",
|
||||||
"%.%.%.%.e 1 , , , , ; h v - 3 ..! w ' _ 9 2 > , , , > : %.%.%.%.",
|
"^. c #EAEDED",
|
||||||
"%.%.%.6 q , : , > 2 > W ..| [ #.H V ..D 9 9 2 , , , , , % %.%.%.",
|
"/. c #AFB7B8",
|
||||||
"%.%.%.e 2 , > 2 2 2 9 b ! #.$.$.#.#.#.Y i 1 2 > , , , > ; %.%.%.",
|
"(. c #939EA0",
|
||||||
"%.%.@ q > 2 2 2 9 q e q 0 o.$.+.) { #.#.| b 2 2 , , , , : X %.%.",
|
"_. c #818E90",
|
||||||
"%.%.4 9 2 2 9 q e e s w b O.#.( m x I @.$...f > > , , , : & %.%.",
|
":. c #939FA0",
|
||||||
"%.%.8 > 2 2 9 e s d g a P #.#.L x l a [ $.#.A 2 2 , : , , ; %.%.",
|
"<. c #DDE0E1",
|
||||||
"%.+ 1 , , 2 2 q e d g f / $.#.T n k Z o.$.O.M 9 2 > , , , ; X %.",
|
"[. c #808D8F",
|
||||||
"%.* 2 , , , 2 9 q e s f X.$.#.O.O.O.#.$.+.Y g e 9 2 , , , ; o %.",
|
"}. c #A4AEAF",
|
||||||
"%.* 2 , , , 2 2 q e w n O.$.[ R ( O.$.$.[ d s e 9 2 2 , , ; o %.",
|
"|. c #657577",
|
||||||
"%.+ 2 , , , > 2 8 8 1 G #.#.T m m N ] #.#.~ s e e 9 2 > : ; X %.",
|
"1. c #8D999A",
|
||||||
"%.%.> , , , , 2 < v B [ $.O.m z z s b #.$...g e e q 9 2 ; = %.%.",
|
"2. c #E7E9E9",
|
||||||
"%.%.= : , , , : 7 ' O.#.$.@.C j p u ~ #.$.} g q 9 9 2 2 ; % %.%.",
|
"3. c #6B7A7D",
|
||||||
"%.%.o , , , , : 0 G ^ .$.#.O.X.{ X.#.$.#.Y e 9 2 2 > , ; %.%.",
|
"4. c #273D40",
|
||||||
"%.%.%., : , , , 2 2 2 M O.) ] #.#.#.#.O./ d 9 2 > , , ; = %.%.%.",
|
"5. c #283F42",
|
||||||
"%.%.%.& ; , , , , 2 ; Q ..g F O.K A H S s 9 2 > , : , ; o %.%.%.",
|
"6. c #97A1A3",
|
||||||
"%.%.%.%.; ; , , , , 2 E _ d ' ..d q q 9 2 > , : , , ; = %.%.%.%.",
|
"7. c #425659",
|
||||||
"%.%.%.%.%.; : , , , 2 q d g U J e 2 2 > , , , , , ; = %.%.%.%.%.",
|
"8. c #D5DADA",
|
||||||
"%.%.%.%.%.o ; : , , , 2 9 q 9 q 9 > , : , , , , ; = . %.%.%.%.%.",
|
"9. c #A2ACAD",
|
||||||
"%.%.%.%.%.%.. ; ; , , > 2 2 2 > , , , , , , , ; = %.%.%.%.%.%.",
|
"0. c #E9EBEB",
|
||||||
"%.%.%.%.%.%.%.%.= ; : > 2 2 , , : , , , , ; ; & %.%.%.%.%.%.%.%.",
|
"a. c #E5E8E8",
|
||||||
"%.%.%.%.%.%.%.%.%.. = ; > : , , , , ; ; = = X %.%.%.%.%.%.%.%.%.",
|
"b. c #8B9798",
|
||||||
"%.%.%.%.%.%.%.%.%.%.%. % = ; ; ; ; & O %.%.%.%.%.%.%.%.%.%.%.",
|
"c. c #677779",
|
||||||
"%.%.%.%.%.%.%.%.%.%.%.%.%.%. X X %.%.%.%.%.%.%.%.%.%.%.%.%.%.",
|
"d. c #CCD1D2",
|
||||||
"%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%."
|
"e. c #EAECED",
|
||||||
};
|
"f. c #94A0A1",
|
||||||
|
"g. c #34494C",
|
||||||
|
"h. c #475B5D",
|
||||||
|
"i. c #435759",
|
||||||
|
"j. c #899697",
|
||||||
|
"k. c #DADEDF",
|
||||||
|
"l. c #879495",
|
||||||
|
"m. c #44585A",
|
||||||
|
"n. c #506265",
|
||||||
|
"o. c #9EA8AA",
|
||||||
|
"p. c #E7EAEA",
|
||||||
|
"q. c #B1B9BA",
|
||||||
|
"r. c #506365",
|
||||||
|
"s. c #4B5E60",
|
||||||
|
"t. c #57686B",
|
||||||
|
"u. c #A0AAAB",
|
||||||
|
"v. c #9CA6A8",
|
||||||
|
"w. c #516366",
|
||||||
|
"x. c #D9DDDD",
|
||||||
|
"y. c #8A9698",
|
||||||
|
"z. c #46595C",
|
||||||
|
"A. c #4E6163",
|
||||||
|
"B. c #9DA7A9",
|
||||||
|
"C. c #C6CCCD",
|
||||||
|
"D. c #717F81",
|
||||||
|
"E. c #808E8F",
|
||||||
|
"F. c #E0E3E3",
|
||||||
|
"G. c #DADEDE",
|
||||||
|
"H. c #D7DCDC",
|
||||||
|
"I. c #FBFBFB",
|
||||||
|
"J. c #E8EAEA",
|
||||||
|
"K. c #A4ADAF",
|
||||||
|
"L. c #536567",
|
||||||
|
"M. c #859294",
|
||||||
|
"N. c #D7DBDC",
|
||||||
|
"O. c #DDE1E1",
|
||||||
|
"P. c #8E9A9C",
|
||||||
|
"Q. c #485B5E",
|
||||||
|
"R. c #384D50",
|
||||||
|
"S. c #C2C8C9",
|
||||||
|
"T. c #E9EBEC",
|
||||||
|
"U. c #A5AFB0",
|
||||||
|
"V. c #546668",
|
||||||
|
"W. c #D6DADB",
|
||||||
|
"X. c #DEE1E2",
|
||||||
|
"Y. c #B7BFC0",
|
||||||
|
"Z. c #A9B2B3",
|
||||||
|
"`. c #425658",
|
||||||
|
" + c #E1E4E4",
|
||||||
|
".+ c #6E7D7F",
|
||||||
|
"++ c #D1D5D6",
|
||||||
|
"@+ c #AAB3B4",
|
||||||
|
"#+ c #57696B",
|
||||||
|
"$+ c #7F8D8E",
|
||||||
|
"%+ c #D3D8D8",
|
||||||
|
"&+ c #F0F2F2",
|
||||||
|
"*+ c #AFB8B9",
|
||||||
|
"=+ c #ACB5B6",
|
||||||
|
"-+ c #596B6D",
|
||||||
|
";+ c #ADB5B7",
|
||||||
|
">+ c #7B898B",
|
||||||
|
",+ c #C8CDCE",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" . + ",
|
||||||
|
" @ # $ % & * ",
|
||||||
|
" * = - ; > , ' ) ! ",
|
||||||
|
" @ ~ { ] ^ / ( _ : < [ } | ",
|
||||||
|
" 1 2 3 4 5 | @ @ @ 1 6 7 ] 8 9 0 @ ",
|
||||||
|
" . & a b c d @ @ @ @ @ @ @ e f g ] h i j @ ",
|
||||||
|
" @ k l m n o + @ @ @ @ @ @ @ @ @ @ ! p ^ < q r s @ ",
|
||||||
|
" ! t u v w x @ @ @ @ @ @ @ @ @ @ @ @ @ @ y z A , B C D ",
|
||||||
|
" E F G H I J @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ + K L M s ",
|
||||||
|
"@ s N v u O y @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ P $ Q R e ",
|
||||||
|
"S T U V S @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ W X Y Z ` # @ ",
|
||||||
|
" .m ..@ +.@.@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ #.$.] %.&.@ @ *.=.",
|
||||||
|
"-.;.>.@ ,.M '.).@ @ @ @ @ @ @ @ @ @ @ @ @ !.~.{.].r ^./.(._.:.0 ",
|
||||||
|
"-.;.>.@ <.[.m M }.^.@ @ @ @ @ @ @ @ @ *.) |., 1.2.@ e 3.4.5.6.@ ",
|
||||||
|
" .7./.@ @ + 8.% 7.].9.0.@ @ @ @ @ @ a.b.< c.d.. @ e.f.Q g.h.#. ",
|
||||||
|
"a.- i.j.k.. @ *.&.l.m.n.o.p.@ @ | q.r.s.'.1 @ y O t.;.u._ v.=. ",
|
||||||
|
"@ p.N w.m.c x.. @ . k.y.z.A.B.C.D.] E.F.@ E G.' H A H.E I.| ",
|
||||||
|
" @ J.K.L.; M.N.*.@ . O.P.Q.R.- S.W @ s o.z.u t ! ",
|
||||||
|
" @ T.U.V.Q % W.+ @ E X.Y.# @ I.p : m (.k @ ",
|
||||||
|
" @ e.Z.u `._./ + @ @ @ +{ ] .+++. ",
|
||||||
|
" @ ).@+#+m $+%+&+@+3 4 *+0 ",
|
||||||
|
" @ ).=+-+7.M , j.+.@ ",
|
||||||
|
" @ # ;+>+,+D ",
|
||||||
|
" E D ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" "};
|
||||||
|
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 4.2 KiB |
|
@ -1,242 +1,406 @@
|
||||||
/* XPM */
|
/* XPM */
|
||||||
static char *bitcoin__[] = {
|
static char * bitcoin64_xpm[] = {
|
||||||
/* columns rows colors chars-per-pixel */
|
"64 64 339 2",
|
||||||
"64 64 172 2",
|
" c None",
|
||||||
" c #8F6319",
|
". c #FFFFFF",
|
||||||
". c #8F6A1A",
|
"+ c #FAFAFA",
|
||||||
"X c #90651A",
|
"@ c #BFC6C7",
|
||||||
"o c #916C1A",
|
"# c #9EA8A9",
|
||||||
"O c #AF7C1E",
|
"$ c #DEE1E2",
|
||||||
"+ c #B1781E",
|
"% c #FDFEFE",
|
||||||
"@ c #9A7026",
|
"& c #DFE3E3",
|
||||||
"# c #AC801F",
|
"* c #828F91",
|
||||||
"$ c #B1811F",
|
"= c #384D50",
|
||||||
"% c #A9812B",
|
"- c #2C4245",
|
||||||
"& c #B08320",
|
"; c #485B5E",
|
||||||
"* c #BB8621",
|
"> c #8F9B9D",
|
||||||
"= c #BD8E22",
|
", c #DCDFE0",
|
||||||
"- c #A58132",
|
"' c #FDFDFD",
|
||||||
"; c #FC8400",
|
") c #F3F4F5",
|
||||||
": c #FD8A03",
|
"! c #ABB4B5",
|
||||||
"> c #FD8E0C",
|
"~ c #4D6062",
|
||||||
", c #FF910E",
|
"{ c #2B4144",
|
||||||
"< c #F98F14",
|
"] c #2A4043",
|
||||||
"1 c #F79117",
|
"^ c #2A4144",
|
||||||
"2 c #FD9314",
|
"/ c #294043",
|
||||||
"3 c #FC951B",
|
"( c #45585B",
|
||||||
"4 c #FE9A1D",
|
"_ c #8B9799",
|
||||||
"5 c #CA8E22",
|
": c #D8DCDC",
|
||||||
"6 c #CC8E2A",
|
"< c #FCFCFC",
|
||||||
"7 c #D48D23",
|
"[ c #FCFDFD",
|
||||||
"8 c #C39223",
|
"} c #CDD2D3",
|
||||||
"9 c #CE9925",
|
"| c #6C7C7E",
|
||||||
"0 c #D19C25",
|
"1 c #314649",
|
||||||
"q c #D19329",
|
"2 c #2D4346",
|
||||||
"w c #D5992B",
|
"3 c #5B6C6F",
|
||||||
"e c #DD9D33",
|
"4 c #526467",
|
||||||
"r c #D69F3C",
|
"5 c #2E4447",
|
||||||
"t c #E29425",
|
"6 c #293F42",
|
||||||
"y c #E79925",
|
"7 c #425558",
|
||||||
"u c #EA9926",
|
"8 c #849192",
|
||||||
"i c #E69A2C",
|
"9 c #D2D6D7",
|
||||||
"p c #F79625",
|
"0 c #FAFBFB",
|
||||||
"a c #F99524",
|
"a c #E8EAEA",
|
||||||
"s c #F79825",
|
"b c #919D9E",
|
||||||
"d c #F89825",
|
"c c #3F5356",
|
||||||
"f c #F3962A",
|
"d c #415557",
|
||||||
"g c #F69B2C",
|
"e c #95A0A2",
|
||||||
"h c #F89B2B",
|
"f c #E9ECEC",
|
||||||
"j c #E19F30",
|
"g c #E7E9EA",
|
||||||
"k c #EE9B34",
|
"h c #A3ADAE",
|
||||||
"l c #F49D33",
|
"i c #56686A",
|
||||||
"z c #F99E32",
|
"j c #2F4548",
|
||||||
"x c #F39F3B",
|
"k c #3E5355",
|
||||||
"c c #DFA731",
|
"l c #7D8A8C",
|
||||||
"v c #D7A43D",
|
"m c #CCD1D2",
|
||||||
"b c #DCA63C",
|
"n c #F9FAFA",
|
||||||
"n c #EEA328",
|
"o c #F8F9F9",
|
||||||
"m c #FFA225",
|
"p c #B8BFC0",
|
||||||
"M c #FFAB26",
|
"q c #57696B",
|
||||||
"N c #F3A529",
|
"r c #31474A",
|
||||||
"B c #FEA429",
|
"s c #6F7E80",
|
||||||
"V c #F4AB2A",
|
"t c #D0D5D6",
|
||||||
"C c #FFAC2A",
|
"u c #EBEDEE",
|
||||||
"Z c #FFB325",
|
"v c #5B6D6F",
|
||||||
"A c #FFB42C",
|
"w c #304649",
|
||||||
"S c #FFBB2D",
|
"x c #3B5053",
|
||||||
"D c #E3A335",
|
"y c #778688",
|
||||||
"F c #E5A438",
|
"z c #C9CECF",
|
||||||
"G c #EDA03D",
|
"A c #FEFEFE",
|
||||||
"H c #F7A037",
|
"B c #D9DDDE",
|
||||||
"J c #FAA135",
|
"C c #7A888A",
|
||||||
"K c #F3AB31",
|
"D c #354A4D",
|
||||||
"L c #FEAB31",
|
"E c #4F6164",
|
||||||
"P c #F4A13C",
|
"F c #ADB5B6",
|
||||||
"I c #F9A33B",
|
"G c #F4F5F6",
|
||||||
"U c #FDB432",
|
"H c #EFF0F1",
|
||||||
"Y c #FFBF37",
|
"I c #AFB7B9",
|
||||||
"T c #FFC12F",
|
"J c #5F7072",
|
||||||
"R c #FFC230",
|
"K c #32484B",
|
||||||
"E c #FFC03E",
|
"L c #394E50",
|
||||||
"W c #DFAF41",
|
"M c #728183",
|
||||||
"Q c #ECA34D",
|
"N c #C3CACA",
|
||||||
"! c #EDA84E",
|
"O c #F6F7F7",
|
||||||
"~ c #F2A343",
|
"P c #EFF1F1",
|
||||||
"^ c #FAA642",
|
"Q c #A1ABAC",
|
||||||
"/ c #FAA846",
|
"R c #475A5D",
|
||||||
"( c #F1A74C",
|
"S c #3A4E51",
|
||||||
") c #F6A94F",
|
"T c #859294",
|
||||||
"_ c #FAAA4A",
|
"U c #E1E4E4",
|
||||||
"` c #E7A451",
|
"V c #F0F2F2",
|
||||||
"' c #ECA754",
|
"W c #B5BCBE",
|
||||||
"] c #EFAA56",
|
"X c #657577",
|
||||||
"[ c #ECAC5B",
|
"Y c #34494C",
|
||||||
"{ c #F3AA52",
|
"Z c #364B4E",
|
||||||
"} c #FCAE52",
|
"` c #6D7C7E",
|
||||||
"| c #FBB056",
|
" . c #BDC4C5",
|
||||||
" . c #FBB25C",
|
".. c #FBFBFB",
|
||||||
".. c #E7AB61",
|
"+. c #C4CACB",
|
||||||
"X. c #ECB067",
|
"@. c #637476",
|
||||||
"o. c #E7B36D",
|
"#. c #627275",
|
||||||
"O. c #EBB36C",
|
"$. c #C3C9CA",
|
||||||
"+. c #F2B163",
|
"%. c #F3F4F4",
|
||||||
"@. c #FCB460",
|
"&. c #BBC3C4",
|
||||||
"#. c #F0B56B",
|
"*. c #6C7B7D",
|
||||||
"$. c #E3B274",
|
"=. c #344A4D",
|
||||||
"%. c #EDB672",
|
"-. c #667679",
|
||||||
"&. c #EDB877",
|
";. c #B6BEBF",
|
||||||
"*. c #E2B57C",
|
">. c #F1F2F3",
|
||||||
"=. c #ECB97B",
|
",. c #E3E6E6",
|
||||||
"-. c #E4BA83",
|
"'. c #889496",
|
||||||
";. c #EBBD83",
|
"). c #3B4F52",
|
||||||
":. c #E7BF8D",
|
"!. c #46595C",
|
||||||
">. c #EBBD88",
|
"~. c #9FA9AA",
|
||||||
",. c #E9C08C",
|
"{. c #EFF0F0",
|
||||||
"<. c #E7C496",
|
"]. c #718082",
|
||||||
"1. c #EBC393",
|
"^. c #33484B",
|
||||||
"2. c #EBC997",
|
"/. c #617174",
|
||||||
"3. c #E7C49A",
|
"(. c #B1B9BA",
|
||||||
"4. c #E9C69A",
|
"_. c #F5F6F6",
|
||||||
"5. c #E3CA9D",
|
":. c #B0B8B9",
|
||||||
"6. c #E9C89E",
|
"<. c #516365",
|
||||||
"7. c #DCC9AE",
|
"[. c #2B4245",
|
||||||
"8. c #DDCBB2",
|
"}. c #778587",
|
||||||
"9. c #E3C7A2",
|
"|. c #D7DBDC",
|
||||||
"0. c #E5CAA3",
|
"1. c #C7CDCD",
|
||||||
"q. c #E9CBA3",
|
"2. c #768486",
|
||||||
"w. c #E5CEAB",
|
"3. c #293F43",
|
||||||
"e. c #E8CEAA",
|
"4. c #5C6D70",
|
||||||
"r. c #E4D4AC",
|
"5. c #ACB5B6",
|
||||||
"t. c #EBD2AF",
|
"6. c #ECEEEE",
|
||||||
"y. c #E7CFB2",
|
"7. c #D1D6D7",
|
||||||
"u. c #E1D4B4",
|
"8. c #B5BDBE",
|
||||||
"i. c #E8D5B6",
|
"9. c #F7F8F8",
|
||||||
"p. c #E5D7BB",
|
"0. c #F9F9FA",
|
||||||
"a. c #E9D6BB",
|
"a. c #CBD1D2",
|
||||||
"s. c #E5D8B9",
|
"b. c #58696C",
|
||||||
"d. c #EAD8BE",
|
"c. c #A6AFB0",
|
||||||
"f. c #F0D6B4",
|
"d. c #E8EBEB",
|
||||||
"g. c #DFDFC6",
|
"e. c #EAECED",
|
||||||
"h. c #E3D6C1",
|
"f. c #96A1A3",
|
||||||
"j. c #E9D7C0",
|
"g. c #425658",
|
||||||
"k. c #E6DAC5",
|
"h. c #3E5255",
|
||||||
"l. c #EBDCC7",
|
"i. c #E6E9E9",
|
||||||
"z. c #E5DCCA",
|
"j. c #839092",
|
||||||
"x. c #EADEC9",
|
"k. c #415558",
|
||||||
"c. c #E8DFD0",
|
"l. c #536568",
|
||||||
"v. c #D7E2D9",
|
"m. c #9EA8AA",
|
||||||
"b. c #E3E0C9",
|
"n. c #E4E7E8",
|
||||||
"n. c #EEE2CB",
|
"o. c #BCC3C4",
|
||||||
"m. c #E6E1D4",
|
"p. c #6A7A7C",
|
||||||
"M. c #E9E2D3",
|
"q. c #8A9698",
|
||||||
"N. c #E4E4DC",
|
"r. c #44585B",
|
||||||
"B. c #E9E5DE",
|
"s. c #A9B2B4",
|
||||||
"V. c #F4EDDE",
|
"t. c #DDE0E1",
|
||||||
"C. c #DFE8E6",
|
"u. c #7F8D8E",
|
||||||
"Z. c #DEEEE8",
|
"v. c #374C4E",
|
||||||
"A. c #DFF2F3",
|
"w. c #4B5E61",
|
||||||
"S. c #DDFFFF",
|
"x. c #A7B0B2",
|
||||||
"D. c #E1E6E0",
|
"y. c #DBDFDF",
|
||||||
"F. c #E8E6E2",
|
"z. c #8F9B9C",
|
||||||
"G. c #E8E9E5",
|
"A. c #495C5F",
|
||||||
"H. c #E5EFEC",
|
"B. c #273E41",
|
||||||
"J. c #E8E9EA",
|
"C. c #4A5D60",
|
||||||
"K. c #EAF3EE",
|
"D. c #384C4F",
|
||||||
"L. c #F3F3EB",
|
"E. c #808D8F",
|
||||||
"P. c #E7EDF2",
|
"F. c #C8CECE",
|
||||||
"I. c #E8EEF3",
|
"G. c #435759",
|
||||||
"U. c #E7F4F7",
|
"H. c #283F42",
|
||||||
"Y. c #E9F0F7",
|
"I. c #667779",
|
||||||
"T. c #EBF5FD",
|
"J. c #C9CFCF",
|
||||||
"R. c #E4FEFF",
|
"K. c #68787A",
|
||||||
"E. c #ECFCFF",
|
"L. c #5E6F71",
|
||||||
"W. c #F4F5F4",
|
"M. c #BFC5C6",
|
||||||
"Q. c #F4FFFF",
|
"N. c #C0C6C7",
|
||||||
"!. c #FEFFFF",
|
"O. c #283E41",
|
||||||
"~. c None",
|
"P. c #657578",
|
||||||
/* pixels */
|
"Q. c #E6E8E9",
|
||||||
"~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.",
|
"R. c #8D999B",
|
||||||
"~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.",
|
"S. c #3D5154",
|
||||||
"~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.",
|
"T. c #435659",
|
||||||
"~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.",
|
"U. c #99A4A5",
|
||||||
"~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.F L h C C A A A A C C h L e ~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.",
|
"V. c #DEE2E2",
|
||||||
"~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.D N C m d d a a p a a p a a d m m C N j ~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.",
|
"W. c #818E90",
|
||||||
"~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.- K M m a p s d d d d d d d d d d d d s p d m M V % ~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.",
|
"X. c #FEFEFF",
|
||||||
"~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.Y M d a d d d d d d d d d d d d d d d d h h d s a d M U ~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.",
|
"Y. c #546668",
|
||||||
"~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.E m 4 a d d d d d d d d d d d d d d d d d d h h h d d d a d M U ~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.",
|
"Z. c #D3D8D8",
|
||||||
"~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.C 4 a d d d d d d d d d d d d d d d d d h h h h h h d d d d d a m C ~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.",
|
"`. c #F2F3F4",
|
||||||
"~.~.~.~.~.~.~.~.~.~.~.~.~.W S a p d d d d d d d d d d d d d d d d h h h h g g h h h d d d d d p a S c ~.~.~.~.~.~.~.~.~.~.~.~.~.",
|
" + c #A8B1B3",
|
||||||
"~.~.~.~.~.~.~.~.~.~.~.~.v M a s d d d d d d d d d d d d d d d h h h h h g z z g h h d d d d d d s a C w ~.~.~.~.~.~.~.~.~.~.~.~.",
|
".+ c #4C5F61",
|
||||||
"~.~.~.~.~.~.~.~.~.~.~.r Z a d d d d d d d d d d d d d d d g 4 : 2 h z z z z z h h h h d d d d d d d a S q ~.~.~.~.~.~.~.~.~.~.~.",
|
"++ c #374C4F",
|
||||||
"~.~.~.~.~.~.~.~.~.~.b Z a d d d d d d d d d d d d d d h h 4 x $.l a z H h h H z h h h d d d d d d d d a A w ~.~.~.~.~.~.~.~.~.~.",
|
"@+ c #7D8B8D",
|
||||||
"~.~.~.~.~.~.~.~.~.~.T a s d d d d d d d d d d d d h h h g : $.R.T.7.a B x f > a H h h d d d d d d d d s a R ~.~.~.~.~.~.~.~.~.~.",
|
"#+ c #DCE0E0",
|
||||||
"~.~.~.~.~.~.~.~.~.U a s d d d d d d d d d d d d h h h h z : e.!.!.p.2 3 8.D.5.' a h h h d d d d d d d d p d A ~.~.~.~.~.~.~.~.~.",
|
"$+ c #DADEDE",
|
||||||
"~.~.~.~.~.~.~.~.U M p d d d d d d d d d d h h 1 : : 2 h h p B.!.Q.%., l J.!.R.-.> z h h h d d d d d d d d p C N ~.~.~.~.~.~.~.~.",
|
"%+ c #B0B9BA",
|
||||||
"~.~.~.~.~.~.~.~.S a d d d d d d d d d d h d 3 7.r.O.G p ; k E.!.T.( , [ E.!.T.~ 4 z h h h d d d d d d d d d a S ~.~.~.~.~.~.~.~.",
|
"&+ c #CAD0D0",
|
||||||
"~.~.~.~.~.~.~.V d s d d d d d d d d h h h 2 l E.!.Q.T.m.:.q.!.!.l.: : -.Q.!.c.a z z z g h h d d d d d d d d s m A ~.~.~.~.~.~.~.",
|
"*+ c #6A797B",
|
||||||
"~.~.~.~.~.~.@ S a d d d d d d d h h h h z : *.R.!.!.!.!.Q.!.!.!.V.,.Q d.!.Q.1.2 I z z h h h d d d d d d d d d a S X ~.~.~.~.~.~.",
|
"=+ c #F9F9F9",
|
||||||
"~.~.~.~.~.~.U d s d d d d d h h h h h g z a [ 5.M.Q.!.!.!.!.!.!.!.Q.E.!.!.Q.&.; 3 J H z h h h d d d d d d d d s h C ~.~.~.~.~.~.",
|
"-+ c #D5D9DA",
|
||||||
"~.~.~.~.~.~.S a d d d d h h h h h h z z z I d > < %.W.!.!.!.!.!.!.!.!.!.!.!.W.s.[ > 4 H g h h d d d d d d d d d a S ~.~.~.~.~.~.",
|
";+ c #E3E6E7",
|
||||||
"~.~.~.~.~.i M p d d d h h h h g z z z z J H I I J > x.!.!.!.!.Q.T.E.Q.!.!.!.!.!.E.u.f 2 H h h h d d d d d d d d p C 7 ~.~.~.~.~.",
|
">+ c #E5E7E8",
|
||||||
"~.~.~.~.~.C a d h h h h h g g z z z J J I I I I J P J.!.!.!.!.d.P =.e.G.E.!.!.!.!.Q.Z.f 2 z h h d d d d d d d d d d A ~.~.~.~.~.",
|
",+ c #8D989A",
|
||||||
"~.~.~.~.~.A a h h h h h g z z z J H I I I I ^ / d X.E.!.!.!.Q.1.4 I J I ;.U.!.!.!.!.!.N.1 h g h h d d d d d d d d a S ~.~.~.~.~.",
|
"'+ c #3D5254",
|
||||||
"~.~.~.~.6 C p d h h h z z J J J I I I I ^ ^ ^ _ a 3.Q.!.!.!.E.#.I . ._ 3 ] K.!.!.!.!.E.O., z h h h d d d d d d d p A + ~.~.~.~.",
|
")+ c #99A3A5",
|
||||||
"~.~.~.~.i B d d h h h g z J I I I I ^ ^ ^ / / _ h k.!.!.!.!.J.) } . .| .3 6.Q.!.!.!.Q.q.> z g h h d d d d d d d d B t ~.~.~.~.",
|
"!+ c #EBEDED",
|
||||||
"~.~.~.~.B d d d d h h h z z J I I ^ / / / _ _ ^ ( I.!.!.!.Q.d.I . . .| .d 1.Q.!.!.!.Q.q.2 z h h h d d d d d d d d d B ~.~.~.~.",
|
"~+ c #D5DADA",
|
||||||
"~.~.~.~.C a d d d d h h g z J H I ^ ^ / _ _ } J %.E.!.!.!.Q.;.4 _ } | } J f m.!.!.!.!.Q.;.2 J z g h h d d d d d d d a A ~.~.~.~.",
|
"{+ c #3A4F52",
|
||||||
"~.~.~.~.C a d d d d h h h z z J I I ^ ^ / _ } z 6.Q.!.!.!.!.n.<.&.+.{ ) ] h.Q.!.!.!.!.R.~ d H z z h h h d d d d d d a A ~.~.~.~.",
|
"]+ c #909C9D",
|
||||||
"~.~.~.~.A a d d d d d h h g z z H I I ^ / _ _ z k.!.!.!.!.!.!.Q.E.I.F.F.T.Q.!.!.!.!.E.9.2 I J z z h h h d d d d d d d A ~.~.~.~.",
|
"^+ c #DFE2E3",
|
||||||
"~.~.~.~.S a d d d d d h h h z z J I I ^ ^ / I ( P.!.!.!.!.Q.Q.!.!.!.!.!.!.!.!.!.!.E.w.d J I I J z h h h d d d d d d d A ~.~.~.~.",
|
"/+ c #B2BABB",
|
||||||
"~.~.~.~.A a d d d d d d h h h z J J I I ^ / h O.E.!.!.!.Q.f.1.z.Y.E.!.!.!.!.!.!.L.! , ^ / I I H z z h h h d d d d d d A ~.~.~.~.",
|
"(+ c #748284",
|
||||||
"~.~.~.~.S p d d d d d d h h h z z J I I ^ / d <.Q.!.!.!.E.+.d _ +.>.k.E.!.!.!.!.Q.s.P J _ ^ I I J z z h h h d d d d d A ~.~.~.~.",
|
"_+ c #D4D9D9",
|
||||||
"~.~.~.~.C a d d d d d d d h h g z z H I I ^ d k.!.!.!.!.J.{ | @.} I I O.H.!.!.!.!.Q.C.l I ^ I I H J z g h h d d d d a A ~.~.~.~.",
|
":+ c #909B9D",
|
||||||
"~.~.~.~.B a d d d d d d d h h h h z z J I J x P.!.!.!.Q.j.I . . . . .B { K.!.!.!.!.Q.0.a / ^ I I J z z h h h d d d a A ~.~.~.~.",
|
"<+ c #E1E4E5",
|
||||||
"~.~.~.~.B d d d d d d d d d h h h J h f 2 ; [ E.!.!.!.Q.1.I . . .| | .d 4.Q.!.!.!.!.m.z I ^ I I I J z h h h h d d d B ~.~.~.~.",
|
"[+ c #425659",
|
||||||
"~.~.~.~.u B d d d d d d d d h h z , ' v.q.X.M.!.!.!.!.E.#.^ . .| } } } d >.Q.!.!.!.!.F.x J I I I J J z z h h h d d C t ~.~.~.~.",
|
"}+ c #485B5D",
|
||||||
"~.~.~.~.7 C p d d d d d d d d h h : y.Q.Q.Q.!.!.!.!.!.B.d B / _ } } } J 1 k.!.!.!.!.!.c.s J I H J J z z z h h h h s A + ~.~.~.~.",
|
"|+ c #939EA0",
|
||||||
"~.~.~.~.~.A a d d d d d d d d h > ` R.!.!.!.!.!.!.!.!.L.q.=.[ ~ z h h l 0.Q.!.!.!.!.Q.q.2 I J J z z h h h h h h h a S ~.~.~.~.~.",
|
"1+ c #D4D8D9",
|
||||||
"~.~.~.~.~.C d d d d d d d d d d > ..g.Y.E.Q.!.!.!.!.!.!.Q.E.T.B.k.a.d.P.Q.!.!.!.!.!.E.[ 2 J z z z g h h h h d d d d C ~.~.~.~.~.",
|
"2+ c #738284",
|
||||||
"~.~.~.~.~.y C p d d d d d d d d g 3 > l [ <.x.W.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.Q.z.> z z z h h h h h d d d d p C 7 ~.~.~.~.~.",
|
"3+ c #B3BBBC",
|
||||||
"~.~.~.~.~.~.S a d d d d d d d d d h h 3 , > ; =.Q.!.W.T.Q.!.!.!.!.!.!.!.!.!.!.!.Q.A.g 2 z h h h h h h d d d d d a S ~.~.~.~.~.~.",
|
"4+ c #DCE0E1",
|
||||||
"~.~.~.~.~.~.C h s d d d d d d d d d h g z H : <.!.!.t.l &.V.!.!.Q.Q.Q.Q.!.Q.Q.E.b.l > H h h h h h d d d d d d s m C ~.~.~.~.~.~.",
|
"5+ c #CFD4D5",
|
||||||
"~.~.~.~.~.~.X S a d d d d d d d d d h h h h p N.!.Q.=.: < c.!.Q.2.&.e.a.d.i.6.[ < 2 z h h h h d d d d d d d d a S ~.~.~.~.~.~.",
|
"6+ c #C1C8C9",
|
||||||
"~.~.~.~.~.~.~.A h s d d d d d d d d d h g 2 ~ E.!.E.{ 2 [ E.!.T.l : 2 1 3 2 > > h z h h h h d d d d d d d d s m A ~.~.~.~.~.~.~.",
|
"7+ c #B1B9BB",
|
||||||
"~.~.~.~.~.~.~.~.S a d d d d d d d d d h h : -.R.!.B.h 2 =.Q.!.M.p z z z h h z g h h h d d d d d d d d d d d a S ~.~.~.~.~.~.~.~.",
|
"8+ c #B0B8BA",
|
||||||
"~.~.~.~.~.~.~.~.N C p d d d d d d d d d h 3 ' 2.N.9.2 3 z.!.!.q.> J z h h h h h h d d d d d d d d d d d d p C n ~.~.~.~.~.~.~.~.",
|
"9+ c #F3F5F5",
|
||||||
"~.~.~.~.~.~.~.~.~.S h p d d d d d d d d d z 3 : p l J g 8.T.S.O.> z h h h h h d d d d d d d d d d d d d p h S ~.~.~.~.~.~.~.~.~.",
|
"0+ c #E0E3E3",
|
||||||
"~.~.~.~.~.~.~.~.~.~.S a s d d d d d d d d h h z d h I J a P o.P d g h h h d d d d d d d d d d d d d d s a S ~.~.~.~.~.~.~.~.~.~.",
|
"a+ c #283E42",
|
||||||
"~.~.~.~.~.~.~.~.~.~.* S a s d d d d d d d d h h g z J J h 3 > d z h h h d d d d d d d d d d d d d d s a S * ~.~.~.~.~.~.~.~.~.~.",
|
"b+ c #98A3A4",
|
||||||
"~.~.~.~.~.~.~.~.~.~.~.$ T a s d d d d d d d h h h z z z h g g h h d d d d d d d d d d d d d d d d s a T O ~.~.~.~.~.~.~.~.~.~.~.",
|
"c+ c #8C989A",
|
||||||
"~.~.~.~.~.~.~.~.~.~.~.~.& S a p d d d d d d h h h z g h h h h h d d d d d d d d d d d d d d d d p a S # ~.~.~.~.~.~.~.~.~.~.~.~.",
|
"d+ c #69797B",
|
||||||
"~.~.~.~.~.~.~.~.~.~.~.~.~.8 S d p d d d d d d h h g h h h h d d d d d d d d d d d d d d d d d p h S = ~.~.~.~.~.~.~.~.~.~.~.~.~.",
|
"e+ c #32474A",
|
||||||
"~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.S A a s d d d d h h h h h d d d d d d d d d d d d d d d d d s a A S ~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.",
|
"f+ c #798789",
|
||||||
"~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.0 T m p d d d d h h h d d d d d d d d d d d d d d d d d p B S 9 ~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.",
|
"g+ c #9CA6A8",
|
||||||
"~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.V S m a p d h d d d d d d d d d d d d d d d d p a m S V ~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.",
|
"h+ c #4C5F62",
|
||||||
"~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.o V S C d p p d d d d d d d d d d d d p p d C S N . ~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.",
|
"i+ c #D9DDDD",
|
||||||
"~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.5 C S A B d d a a d d a a a d B A S C 5 ~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.",
|
"j+ c #5C6D6F",
|
||||||
"~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.O t B A A A A A A A A B t O ~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.",
|
"k+ c #7E8C8D",
|
||||||
"~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.",
|
"l+ c #9BA6A7",
|
||||||
"~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.",
|
"m+ c #4F6264",
|
||||||
"~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.",
|
"n+ c #44585A",
|
||||||
"~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~."
|
"o+ c #899597",
|
||||||
};
|
"p+ c #D8DCDD",
|
||||||
|
"q+ c #4C5E61",
|
||||||
|
"r+ c #A8B1B2",
|
||||||
|
"s+ c #6E7D7F",
|
||||||
|
"t+ c #516366",
|
||||||
|
"u+ c #889596",
|
||||||
|
"v+ c #A4AEAF",
|
||||||
|
"w+ c #2F4447",
|
||||||
|
"x+ c #2C4346",
|
||||||
|
"y+ c #788688",
|
||||||
|
"z+ c #A0AAAC",
|
||||||
|
"A+ c #FBFCFC",
|
||||||
|
"B+ c #C7CCCD",
|
||||||
|
"C+ c #667678",
|
||||||
|
"D+ c #3E5254",
|
||||||
|
"E+ c #384D4F",
|
||||||
|
"F+ c #5D6E70",
|
||||||
|
"G+ c #ADB6B7",
|
||||||
|
"H+ c #EDEFEF",
|
||||||
|
"I+ c #E9EBEB",
|
||||||
|
"J+ c #A5AFB0",
|
||||||
|
"K+ c #57686B",
|
||||||
|
"L+ c #405457",
|
||||||
|
"M+ c #D1D6D6",
|
||||||
|
"N+ c #E2E5E5",
|
||||||
|
"O+ c #9AA4A6",
|
||||||
|
"P+ c #869394",
|
||||||
|
"Q+ c #677779",
|
||||||
|
"R+ c #EEF0F0",
|
||||||
|
"S+ c #849193",
|
||||||
|
"T+ c #5B6C6E",
|
||||||
|
"U+ c #A9B2B3",
|
||||||
|
"V+ c #596A6D",
|
||||||
|
"W+ c #304548",
|
||||||
|
"X+ c #2A4044",
|
||||||
|
"Y+ c #506265",
|
||||||
|
"Z+ c #D7DBDB",
|
||||||
|
"`+ c #5D6E71",
|
||||||
|
" @ c #637375",
|
||||||
|
".@ c #CED3D4",
|
||||||
|
"+@ c #FBFBFC",
|
||||||
|
"@@ c #808E8F",
|
||||||
|
"#@ c #5A6B6D",
|
||||||
|
"$@ c #EDEEEF",
|
||||||
|
"%@ c #ACB4B5",
|
||||||
|
"&@ c #7C8A8C",
|
||||||
|
"*@ c #707F81",
|
||||||
|
"=@ c #56676A",
|
||||||
|
"-@ c #B6BDBE",
|
||||||
|
";@ c #DDE1E1",
|
||||||
|
">@ c #9FA9AB",
|
||||||
|
",@ c #D3D7D8",
|
||||||
|
"'@ c #596A6C",
|
||||||
|
")@ c #AEB7B8",
|
||||||
|
"!@ c #3C5053",
|
||||||
|
"~@ c #C2C8C9",
|
||||||
|
"{@ c #95A0A1",
|
||||||
|
"]@ c #4B5D60",
|
||||||
|
"^@ c #7B898B",
|
||||||
|
"/@ c #D4D9DA",
|
||||||
|
"(@ c #869294",
|
||||||
|
"_@ c #A5AEB0",
|
||||||
|
":@ c #F0F1F2",
|
||||||
|
"<@ c #627375",
|
||||||
|
"[@ c #FCFCFD",
|
||||||
|
"}@ c #BBC2C3",
|
||||||
|
"|@ c #546669",
|
||||||
|
"1@ c #E9EBEC",
|
||||||
|
"2@ c #F2F3F3",
|
||||||
|
"3@ c #B7BFC0",
|
||||||
|
"4@ c #4E6063",
|
||||||
|
"5@ c #899697",
|
||||||
|
"6@ c #97A2A4",
|
||||||
|
"7@ c #EAEDED",
|
||||||
|
"8@ c #44575A",
|
||||||
|
"9@ c #A2ACAD",
|
||||||
|
"0@ c #E8EAEB",
|
||||||
|
"a@ c #B9C0C1",
|
||||||
|
"b@ c #E0E4E4",
|
||||||
|
"c@ c #728082",
|
||||||
|
"d@ c #D2D7D8",
|
||||||
|
"e@ c #45595C",
|
||||||
|
"f@ c #A0AAAB",
|
||||||
|
"g@ c #506365",
|
||||||
|
"h@ c #9DA7A8",
|
||||||
|
"i@ c #E4E7E7",
|
||||||
|
"j@ c #949FA1",
|
||||||
|
"k@ c #929D9F",
|
||||||
|
"l@ c #4E6163",
|
||||||
|
"m@ c #9AA5A6",
|
||||||
|
"n@ c #6A797C",
|
||||||
|
"o@ c #DFE2E2",
|
||||||
|
"p@ c #4D5F62",
|
||||||
|
"q@ c #F2F4F4",
|
||||||
|
"r@ c #4B5E60",
|
||||||
|
"s@ c #394E51",
|
||||||
|
"t@ c #97A2A3",
|
||||||
|
"u@ c #627274",
|
||||||
|
"v@ c #9BA5A7",
|
||||||
|
"w@ c #354B4D",
|
||||||
|
"x@ c #F8F8F8",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" . . ",
|
||||||
|
" . . . . . . . ",
|
||||||
|
" . . + @ # $ % . . . ",
|
||||||
|
" . . . & * = - ; > , ' . . . ",
|
||||||
|
" . . . ) ! ~ { ] ^ / { ( _ : < . . . ",
|
||||||
|
" . . [ } | 1 / 2 3 _ 4 5 6 ^ 7 8 9 0 . . . ",
|
||||||
|
" . . . a b c ] ] d e f . g h i j 6 ] k l m n . . . ",
|
||||||
|
" . . . o p q 2 / r s t ' . . . . u ! v w / ] x y z o . . . ",
|
||||||
|
" . . A B C D ] { E F G . . . . . . . . H I J K / ] L M N O . . . ",
|
||||||
|
" . . . P Q R ^ ] S T U . . . . . . . . . . . . V W X Y / / Z ` .) . . . ",
|
||||||
|
" . . ..+.@.j / 5 #.$.0 . . . . . . . . . . . . . . . %.&.*.Z / / =.-.;.>.. . . ",
|
||||||
|
" . . . ,.'.).] ^ !.~.{.. . . . . . . . . . . . . . . . . . . O $.].= ] / ^./.(.P . . . ",
|
||||||
|
" . . . _.:.<.[.] Y }.|.A . . . . . . . . . . . . . . . . . . . . . . o 1.2.).] 3.1 4.5.6.. . . ",
|
||||||
|
" . . ' 7.].K / - i 8.9.. . . . . . . . . . . . . . . . . . . . . . . . . . 0.a.l k ] 6 j b.c.d.. . . ",
|
||||||
|
" . . . e.f.g.] ] h.> i.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0 7.j.k.^ 6 5 l.m.n.A . . ",
|
||||||
|
" . . . n o.3 2 / w p.m [ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . < |.q.r.{ 6 2 ~ s.A . ",
|
||||||
|
" . . . t.u.v.] { w.x.%.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ' y.z.A.5 B.X 0 . ",
|
||||||
|
" . . . >.c.C.^ / D.E.t.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . F.G.H.I.0 . ",
|
||||||
|
" . . < J.K.w / 2 L.M.n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . n N./.w O.P.0 . ",
|
||||||
|
". . . Q.R.S.] ] T.U.6.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . V.W.= ] { A.:.X.. ",
|
||||||
|
". + 8.Y.- ] ^.M Z.A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . `. +.+{ ] ++@+#+. . . ",
|
||||||
|
". $+c ] 2 4 %+_.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . < &+*+w / 2 4.o.=+. . . . ",
|
||||||
|
". -+S ] p.;+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . >+,+'+] ] G.)+!+. . . . . . . ",
|
||||||
|
". ~+{+/ ]+. . . 6.x.^+A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . O /+l.- / ^.(+_+A . . . . . . . . . ",
|
||||||
|
". ~+{+/ :+. . . <+[+}+|+V.% . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . % 1+2+^./ - l.3+O ' O P i.4+5+6+7+8+9+. ",
|
||||||
|
". ~+{+/ :+. . . 0+c a+[.}+:+, ' . . . . . . . . . . . . . . . . . . . . . . . . . . . !+b+T.] ] S.c+>+. . |.d+Y.A.c = e+{ f++ . ",
|
||||||
|
". ~+{+/ :+. . . _.g+h+- 3.{ !.c+i+[ . . . . . . . . . . . . . . . . . . . . . . . =+o.j+2 / w d+&+< . . . O k+^ { - - - = 1.. . ",
|
||||||
|
". ~+{+/ :+. . . . A ;+l+m+2 / { n+o+p+' . . . . . . . . . . . . . . . . . . . . #+@+++] { q+r+`.. . . . . . m h.- 2 2 ] s+9.. ",
|
||||||
|
". ~+{+/ ]+. . . . . . . i.m.t+5 / { T.u+|.< . . . . . . . . . . . . . . . . V v+A.{ ] = W.$ . . . . . . 9.8.i w+- 2 x+Y o.. . ",
|
||||||
|
". ~+{+] y+H . . . . . . . . i.z+Y.5 6 ^ k.T 1+A+. . . . . . . . . . . . ..B+C+j / 5 J @ n . . . . . % _+2.Y / - D+j ] @.%.. ",
|
||||||
|
". -+E+{ e+F+G+H+. . . . . . . . I+J+K+j 6 ^ L+W.M+... . . . . . . . . N+u+x ] ] ( g+H+. . . . . . 6.O+n+] ] S P+t Q+5 (.. . ",
|
||||||
|
". R+S+h.] / w T+! H+. . . . . . . . u U+V+W+/ X+h.k+5+... . . . . _.G+Y+[./ Y }.Z+A . . . . . + M.`+5 ] w+ @+.0 . .@M 6.. ",
|
||||||
|
". . +@7.@@c ^ / j #@! $@. . . . . . . . H+%@3 1 / ] S.&@.@+ . ' t *@e+] - =@-@9.. . . . . . ;@E.++] { R >@P . . . < u A . ",
|
||||||
|
" . . . +@,@j.d ^ 6 j '@ +!+. . . . . . . . R+)@J e+3.] !@C ~@{@L+] ] c :+i.. . . . . . V J+]@{ ] Z ^@i+A . . . . . . ",
|
||||||
|
" . . . A+/@(@g.^ 6 j K+_@f . . . . . . . . :@3+<@K 6 ] Y 5 / 1 | } [@. . . . . +@1.C+W+/ 2 T+}@o . . . ",
|
||||||
|
" . . . < |.u+T.{ 3.5 |@h 1@. . . . . . . . 2@3@X ^./ { 4@! 9+. . . . . . ;+5@!@] ] g.6@7@. . . ",
|
||||||
|
" . . . ' p+o+8@{ 3.5 l.9@0@. . . . . . . . 9+a@p.S+b@. . . . . . _.:.t+- ] ^.c@d@% . . ",
|
||||||
|
" . . . ' i+_ e@{ 6 2 4 f@i.A . . . . . . . 9.0 . . . . . ' t *@K / - l.(._.. . . ",
|
||||||
|
" . . . ' y.> R { 6 2 g@h@i@A . . . . . . . . . . . I+j@k.] ] '+R.>+. . . ",
|
||||||
|
" . . . % V.k@; [.6 2 l@m@i@A . . . . . . . o a@'@2 / w n@m < . . ",
|
||||||
|
" . . . A o@k@A.- 3.2 ~ m@,.A . . . A B C D ] { p@ +q@. . . ",
|
||||||
|
" . . . A ^+j@r@- 6 - h+6@<+A R+>@R ^ / s@j.o@. . . ",
|
||||||
|
" . . . A U t@h+- 6 - .+5@ @w+/ 5 u@~@+ . . ",
|
||||||
|
" . . . A ,.O+~ 2 / ^ ] ^ R f@H . . . ",
|
||||||
|
" . . A i@v@E 2 w@f+p+A . . ",
|
||||||
|
" . . A i@9@a@x@. . . ",
|
||||||
|
" . . . . . . ",
|
||||||
|
" . . ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" "};
|
||||||
|
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 34 KiB |
Before Width: | Height: | Size: 151 KiB After Width: | Height: | Size: 201 KiB |
|
@ -50,9 +50,9 @@ Var StartMenuGroup
|
||||||
# Installer attributes
|
# Installer attributes
|
||||||
OutFile @abs_top_srcdir@/@PACKAGE_TARNAME@-${VERSION}-win@WINDOWS_BITS@-setup.exe
|
OutFile @abs_top_srcdir@/@PACKAGE_TARNAME@-${VERSION}-win@WINDOWS_BITS@-setup.exe
|
||||||
!if "@WINDOWS_BITS@" == "64"
|
!if "@WINDOWS_BITS@" == "64"
|
||||||
InstallDir $PROGRAMFILES64\Bitcoin
|
InstallDir $PROGRAMFILES64\Lbrycrd
|
||||||
!else
|
!else
|
||||||
InstallDir $PROGRAMFILES\Bitcoin
|
InstallDir $PROGRAMFILES\Lbrycrd
|
||||||
!endif
|
!endif
|
||||||
CRCCheck on
|
CRCCheck on
|
||||||
XPStyle on
|
XPStyle on
|
||||||
|
|
|
@ -6,13 +6,16 @@ AlignTrailingComments: true
|
||||||
AllowAllParametersOfDeclarationOnNextLine: false
|
AllowAllParametersOfDeclarationOnNextLine: false
|
||||||
AllowShortBlocksOnASingleLine: false
|
AllowShortBlocksOnASingleLine: false
|
||||||
AllowShortFunctionsOnASingleLine: All
|
AllowShortFunctionsOnASingleLine: All
|
||||||
AllowShortIfStatementsOnASingleLine: false
|
AllowShortIfStatementsOnASingleLine: true
|
||||||
AllowShortLoopsOnASingleLine: false
|
AllowShortLoopsOnASingleLine: false
|
||||||
AlwaysBreakBeforeMultilineStrings: false
|
AlwaysBreakBeforeMultilineStrings: false
|
||||||
AlwaysBreakTemplateDeclarations: true
|
AlwaysBreakTemplateDeclarations: true
|
||||||
BinPackParameters: false
|
BinPackParameters: false
|
||||||
BreakBeforeBinaryOperators: false
|
BreakBeforeBinaryOperators: false
|
||||||
BreakBeforeBraces: Linux
|
BreakBeforeBraces: Custom
|
||||||
|
BraceWrapping:
|
||||||
|
AfterClass: true
|
||||||
|
AfterFunction: true
|
||||||
BreakBeforeTernaryOperators: false
|
BreakBeforeTernaryOperators: false
|
||||||
BreakConstructorInitializersBeforeComma: false
|
BreakConstructorInitializersBeforeComma: false
|
||||||
ColumnLimit: 0
|
ColumnLimit: 0
|
||||||
|
@ -23,7 +26,6 @@ ContinuationIndentWidth: 4
|
||||||
Cpp11BracedListStyle: true
|
Cpp11BracedListStyle: true
|
||||||
DerivePointerAlignment: false
|
DerivePointerAlignment: false
|
||||||
DisableFormat: false
|
DisableFormat: false
|
||||||
ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH, BOOST_REVERSE_FOREACH ]
|
|
||||||
IndentCaseLabels: false
|
IndentCaseLabels: false
|
||||||
IndentFunctionDeclarationAfterType: false
|
IndentFunctionDeclarationAfterType: false
|
||||||
IndentWidth: 4
|
IndentWidth: 4
|
||||||
|
|
|
@ -76,11 +76,11 @@ TESTS =
|
||||||
BENCHMARKS =
|
BENCHMARKS =
|
||||||
|
|
||||||
if BUILD_BITCOIND
|
if BUILD_BITCOIND
|
||||||
bin_PROGRAMS += bitcoind
|
bin_PROGRAMS += lbrycrdd
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if BUILD_BITCOIN_UTILS
|
if BUILD_BITCOIN_UTILS
|
||||||
bin_PROGRAMS += bitcoin-cli bitcoin-tx
|
bin_PROGRAMS += lbrycrd-cli lbrycrd-tx
|
||||||
endif
|
endif
|
||||||
|
|
||||||
.PHONY: FORCE check-symbols check-security
|
.PHONY: FORCE check-symbols check-security
|
||||||
|
@ -117,6 +117,9 @@ BITCOIN_CORE_H = \
|
||||||
memusage.h \
|
memusage.h \
|
||||||
merkleblock.h \
|
merkleblock.h \
|
||||||
miner.h \
|
miner.h \
|
||||||
|
nameclaim.h \
|
||||||
|
claimtrie.h \
|
||||||
|
lbry.h \
|
||||||
net.h \
|
net.h \
|
||||||
netbase.h \
|
netbase.h \
|
||||||
noui.h \
|
noui.h \
|
||||||
|
@ -183,9 +186,11 @@ libbitcoin_server_a_SOURCES = \
|
||||||
httpserver.cpp \
|
httpserver.cpp \
|
||||||
init.cpp \
|
init.cpp \
|
||||||
dbwrapper.cpp \
|
dbwrapper.cpp \
|
||||||
|
lbry.cpp \
|
||||||
main.cpp \
|
main.cpp \
|
||||||
merkleblock.cpp \
|
merkleblock.cpp \
|
||||||
miner.cpp \
|
miner.cpp \
|
||||||
|
claimtrie.cpp \
|
||||||
net.cpp \
|
net.cpp \
|
||||||
noui.cpp \
|
noui.cpp \
|
||||||
policy/fees.cpp \
|
policy/fees.cpp \
|
||||||
|
@ -193,6 +198,7 @@ libbitcoin_server_a_SOURCES = \
|
||||||
pow.cpp \
|
pow.cpp \
|
||||||
rest.cpp \
|
rest.cpp \
|
||||||
rpc/blockchain.cpp \
|
rpc/blockchain.cpp \
|
||||||
|
rpc/claimtrie.cpp \
|
||||||
rpc/mining.cpp \
|
rpc/mining.cpp \
|
||||||
rpc/misc.cpp \
|
rpc/misc.cpp \
|
||||||
rpc/net.cpp \
|
rpc/net.cpp \
|
||||||
|
@ -300,6 +306,7 @@ libbitcoin_common_a_SOURCES = \
|
||||||
core_write.cpp \
|
core_write.cpp \
|
||||||
key.cpp \
|
key.cpp \
|
||||||
keystore.cpp \
|
keystore.cpp \
|
||||||
|
nameclaim.cpp \
|
||||||
netbase.cpp \
|
netbase.cpp \
|
||||||
protocol.cpp \
|
protocol.cpp \
|
||||||
scheduler.cpp \
|
scheduler.cpp \
|
||||||
|
@ -344,16 +351,16 @@ nodist_libbitcoin_util_a_SOURCES = $(srcdir)/obj/build.h
|
||||||
#
|
#
|
||||||
|
|
||||||
# bitcoind binary #
|
# bitcoind binary #
|
||||||
bitcoind_SOURCES = bitcoind.cpp
|
lbrycrdd_SOURCES = bitcoind.cpp
|
||||||
bitcoind_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES)
|
lbrycrdd_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES)
|
||||||
bitcoind_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
|
lbrycrdd_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
|
||||||
bitcoind_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS)
|
lbrycrdd_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS)
|
||||||
|
|
||||||
if TARGET_WINDOWS
|
if TARGET_WINDOWS
|
||||||
bitcoind_SOURCES += bitcoind-res.rc
|
lbrycrdd_SOURCES += bitcoin-cli-res.rc
|
||||||
endif
|
endif
|
||||||
|
|
||||||
bitcoind_LDADD = \
|
lbrycrdd_LDADD = \
|
||||||
$(LIBBITCOIN_SERVER) \
|
$(LIBBITCOIN_SERVER) \
|
||||||
$(LIBBITCOIN_COMMON) \
|
$(LIBBITCOIN_COMMON) \
|
||||||
$(LIBUNIVALUE) \
|
$(LIBUNIVALUE) \
|
||||||
|
@ -365,44 +372,44 @@ bitcoind_LDADD = \
|
||||||
$(LIBSECP256K1)
|
$(LIBSECP256K1)
|
||||||
|
|
||||||
if ENABLE_ZMQ
|
if ENABLE_ZMQ
|
||||||
bitcoind_LDADD += $(LIBBITCOIN_ZMQ) $(ZMQ_LIBS)
|
lbrycrdd_LDADD += $(LIBBITCOIN_ZMQ) $(ZMQ_LIBS)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if ENABLE_WALLET
|
if ENABLE_WALLET
|
||||||
bitcoind_LDADD += libbitcoin_wallet.a
|
lbrycrdd_LDADD += libbitcoin_wallet.a
|
||||||
endif
|
endif
|
||||||
|
|
||||||
bitcoind_LDADD += $(BOOST_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS)
|
lbrycrdd_LDADD += $(BOOST_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS)
|
||||||
|
|
||||||
# bitcoin-cli binary #
|
#lbrycrd-cli binary #
|
||||||
bitcoin_cli_SOURCES = bitcoin-cli.cpp
|
lbrycrd_cli_SOURCES = bitcoin-cli.cpp
|
||||||
bitcoin_cli_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(EVENT_CFLAGS)
|
lbrycrd_cli_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(EVENT_CFLAGS)
|
||||||
bitcoin_cli_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
|
lbrycrd_cli_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
|
||||||
bitcoin_cli_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS)
|
lbrycrd_cli_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS)
|
||||||
|
|
||||||
if TARGET_WINDOWS
|
if TARGET_WINDOWS
|
||||||
bitcoin_cli_SOURCES += bitcoin-cli-res.rc
|
lbrycrd_cli_SOURCES += bitcoin-cli-res.rc
|
||||||
endif
|
endif
|
||||||
|
|
||||||
bitcoin_cli_LDADD = \
|
lbrycrd_cli_LDADD = \
|
||||||
$(LIBBITCOIN_CLI) \
|
$(LIBBITCOIN_CLI) \
|
||||||
$(LIBUNIVALUE) \
|
$(LIBUNIVALUE) \
|
||||||
$(LIBBITCOIN_UTIL)
|
$(LIBBITCOIN_UTIL)
|
||||||
|
|
||||||
bitcoin_cli_LDADD += $(BOOST_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(EVENT_LIBS)
|
lbrycrd_cli_LDADD += $(BOOST_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(EVENT_LIBS)
|
||||||
#
|
#
|
||||||
|
|
||||||
# bitcoin-tx binary #
|
# bitcoin-tx binary #
|
||||||
bitcoin_tx_SOURCES = bitcoin-tx.cpp
|
lbrycrd_tx_SOURCES = bitcoin-tx.cpp
|
||||||
bitcoin_tx_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES)
|
lbrycrd_tx_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES)
|
||||||
bitcoin_tx_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
|
lbrycrd_tx_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
|
||||||
bitcoin_tx_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS)
|
lbrycrd_tx_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS)
|
||||||
|
|
||||||
if TARGET_WINDOWS
|
if TARGET_WINDOWS
|
||||||
bitcoin_tx_SOURCES += bitcoin-tx-res.rc
|
lbrycrd_tx_SOURCES += bitcoin-tx-res.rc
|
||||||
endif
|
endif
|
||||||
|
|
||||||
bitcoin_tx_LDADD = \
|
lbrycrd_tx_LDADD = \
|
||||||
$(LIBUNIVALUE) \
|
$(LIBUNIVALUE) \
|
||||||
$(LIBBITCOIN_COMMON) \
|
$(LIBBITCOIN_COMMON) \
|
||||||
$(LIBBITCOIN_UTIL) \
|
$(LIBBITCOIN_UTIL) \
|
||||||
|
@ -410,7 +417,7 @@ bitcoin_tx_LDADD = \
|
||||||
$(LIBBITCOIN_CRYPTO) \
|
$(LIBBITCOIN_CRYPTO) \
|
||||||
$(LIBSECP256K1)
|
$(LIBSECP256K1)
|
||||||
|
|
||||||
bitcoin_tx_LDADD += $(BOOST_LIBS) $(CRYPTO_LIBS)
|
lbrycrd_tx_LDADD += $(BOOST_LIBS) $(CRYPTO_LIBS)
|
||||||
#
|
#
|
||||||
|
|
||||||
# bitcoinconsensus library #
|
# bitcoinconsensus library #
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
bin_PROGRAMS += qt/bitcoin-qt
|
bin_PROGRAMS += qt/lbrycrd-qt
|
||||||
EXTRA_LIBRARIES += qt/libbitcoinqt.a
|
EXTRA_LIBRARIES += qt/libbitcoinqt.a
|
||||||
|
|
||||||
# bitcoin qt core #
|
# bitcoin qt core #
|
||||||
|
@ -353,7 +353,7 @@ QT_FORMS_H=$(join $(dir $(QT_FORMS_UI)),$(addprefix ui_, $(notdir $(QT_FORMS_UI:
|
||||||
# Most files will depend on the forms and moc files as includes. Generate them
|
# Most files will depend on the forms and moc files as includes. Generate them
|
||||||
# before anything else.
|
# before anything else.
|
||||||
$(QT_MOC): $(QT_FORMS_H)
|
$(QT_MOC): $(QT_FORMS_H)
|
||||||
$(qt_libbitcoinqt_a_OBJECTS) $(qt_bitcoin_qt_OBJECTS) : | $(QT_MOC)
|
$(qt_libbitcoinqt_a_OBJECTS) $(qt_lbrycrd_qt_OBJECTS) : | $(QT_MOC)
|
||||||
|
|
||||||
#Generating these with a half-written protobuf header leads to wacky results.
|
#Generating these with a half-written protobuf header leads to wacky results.
|
||||||
#This makes sure it's done.
|
#This makes sure it's done.
|
||||||
|
@ -361,29 +361,29 @@ $(QT_MOC): $(PROTOBUF_H)
|
||||||
$(QT_MOC_CPP): $(PROTOBUF_H)
|
$(QT_MOC_CPP): $(PROTOBUF_H)
|
||||||
|
|
||||||
# bitcoin-qt binary #
|
# bitcoin-qt binary #
|
||||||
qt_bitcoin_qt_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BITCOIN_QT_INCLUDES) \
|
qt_lbrycrd_qt_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BITCOIN_QT_INCLUDES) \
|
||||||
$(QT_INCLUDES) $(PROTOBUF_CFLAGS) $(QR_CFLAGS)
|
$(QT_INCLUDES) $(PROTOBUF_CFLAGS) $(QR_CFLAGS)
|
||||||
qt_bitcoin_qt_CXXFLAGS = $(AM_CXXFLAGS) $(QT_PIE_FLAGS)
|
qt_lbrycrd_qt_CXXFLAGS = $(AM_CXXFLAGS) $(QT_PIE_FLAGS)
|
||||||
|
|
||||||
qt_bitcoin_qt_SOURCES = qt/bitcoin.cpp
|
qt_lbrycrd_qt_SOURCES = qt/bitcoin.cpp
|
||||||
if TARGET_DARWIN
|
if TARGET_DARWIN
|
||||||
qt_bitcoin_qt_SOURCES += $(BITCOIN_MM)
|
qt_lbrycrd_qt_SOURCES += $(BITCOIN_MM)
|
||||||
endif
|
endif
|
||||||
if TARGET_WINDOWS
|
if TARGET_WINDOWS
|
||||||
qt_bitcoin_qt_SOURCES += $(BITCOIN_RC)
|
qt_lbrycrd_qt_SOURCES += $(BITCOIN_RC)
|
||||||
endif
|
endif
|
||||||
qt_bitcoin_qt_LDADD = qt/libbitcoinqt.a $(LIBBITCOIN_SERVER)
|
qt_lbrycrd_qt_LDADD = qt/libbitcoinqt.a $(LIBBITCOIN_SERVER)
|
||||||
if ENABLE_WALLET
|
if ENABLE_WALLET
|
||||||
qt_bitcoin_qt_LDADD += $(LIBBITCOIN_WALLET)
|
qt_lbrycrd_qt_LDADD += $(LIBBITCOIN_WALLET)
|
||||||
endif
|
endif
|
||||||
if ENABLE_ZMQ
|
if ENABLE_ZMQ
|
||||||
qt_bitcoin_qt_LDADD += $(LIBBITCOIN_ZMQ) $(ZMQ_LIBS)
|
qt_lbrycrd_qt_LDADD += $(LIBBITCOIN_ZMQ) $(ZMQ_LIBS)
|
||||||
endif
|
endif
|
||||||
qt_bitcoin_qt_LDADD += $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CONSENSUS) $(LIBBITCOIN_CRYPTO) $(LIBUNIVALUE) $(LIBLEVELDB) $(LIBMEMENV) \
|
qt_lbrycrd_qt_LDADD += $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CONSENSUS) $(LIBBITCOIN_CRYPTO) $(LIBUNIVALUE) $(LIBLEVELDB) $(LIBMEMENV) \
|
||||||
$(BOOST_LIBS) $(QT_LIBS) $(QT_DBUS_LIBS) $(QR_LIBS) $(PROTOBUF_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) $(LIBSECP256K1) \
|
$(BOOST_LIBS) $(QT_LIBS) $(QT_DBUS_LIBS) $(QR_LIBS) $(PROTOBUF_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) $(LIBSECP256K1) \
|
||||||
$(EVENT_PTHREADS_LIBS) $(EVENT_LIBS)
|
$(EVENT_PTHREADS_LIBS) $(EVENT_LIBS)
|
||||||
qt_bitcoin_qt_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(QT_LDFLAGS) $(LIBTOOL_APP_LDFLAGS)
|
qt_lbrycrd_qt_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(QT_LDFLAGS) $(LIBTOOL_APP_LDFLAGS)
|
||||||
qt_bitcoin_qt_LIBTOOLFLAGS = --tag CXX
|
qt_lbrycrd_qt_LIBTOOLFLAGS = --tag CXX
|
||||||
|
|
||||||
#locale/foo.ts -> locale/foo.qm
|
#locale/foo.ts -> locale/foo.qm
|
||||||
QT_QM=$(QT_TS:.ts=.qm)
|
QT_QM=$(QT_TS:.ts=.qm)
|
||||||
|
@ -413,10 +413,10 @@ CLEAN_QT = $(nodist_qt_libbitcoinqt_a_SOURCES) $(QT_QM) $(QT_FORMS_H) qt/*.gcda
|
||||||
|
|
||||||
CLEANFILES += $(CLEAN_QT)
|
CLEANFILES += $(CLEAN_QT)
|
||||||
|
|
||||||
bitcoin_qt_clean: FORCE
|
lbrycrd_qt_clean: FORCE
|
||||||
rm -f $(CLEAN_QT) $(qt_libbitcoinqt_a_OBJECTS) $(qt_bitcoin_qt_OBJECTS) qt/bitcoin-qt$(EXEEXT) $(LIBBITCOINQT)
|
rm -f $(CLEAN_QT) $(qt_libbitcoinqt_a_OBJECTS) $(qt_lbrycrd_qt_OBJECTS) qt/lbrycrd-qt$(EXEEXT) $(LIBBITCOINQT)
|
||||||
|
|
||||||
bitcoin_qt : qt/bitcoin-qt$(EXEEXT)
|
lbrycrd_qt : qt/lbrycrd-qt$(EXEEXT)
|
||||||
|
|
||||||
ui_%.h: %.ui
|
ui_%.h: %.ui
|
||||||
@test -f $(UIC)
|
@test -f $(UIC)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
bin_PROGRAMS += qt/test/test_bitcoin-qt
|
bin_PROGRAMS += qt/test/test_lbrycrd-qt
|
||||||
TESTS += qt/test/test_bitcoin-qt
|
TESTS += qt/test/test_lbrycrd-qt
|
||||||
|
|
||||||
TEST_QT_MOC_CPP = qt/test/moc_uritests.cpp
|
TEST_QT_MOC_CPP = qt/test/moc_uritests.cpp
|
||||||
|
|
||||||
|
@ -12,42 +12,42 @@ TEST_QT_H = \
|
||||||
qt/test/paymentrequestdata.h \
|
qt/test/paymentrequestdata.h \
|
||||||
qt/test/paymentservertests.h
|
qt/test/paymentservertests.h
|
||||||
|
|
||||||
qt_test_test_bitcoin_qt_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BITCOIN_QT_INCLUDES) \
|
qt_test_test_lbrycrd_qt_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BITCOIN_QT_INCLUDES) \
|
||||||
$(QT_INCLUDES) $(QT_TEST_INCLUDES) $(PROTOBUF_CFLAGS)
|
$(QT_INCLUDES) $(QT_TEST_INCLUDES) $(PROTOBUF_CFLAGS)
|
||||||
|
|
||||||
qt_test_test_bitcoin_qt_SOURCES = \
|
qt_test_test_lbrycrd_qt_SOURCES = \
|
||||||
qt/test/test_main.cpp \
|
qt/test/test_main.cpp \
|
||||||
qt/test/uritests.cpp \
|
qt/test/uritests.cpp \
|
||||||
$(TEST_QT_H)
|
$(TEST_QT_H)
|
||||||
if ENABLE_WALLET
|
if ENABLE_WALLET
|
||||||
qt_test_test_bitcoin_qt_SOURCES += \
|
qt_test_test_lbrycrd_qt_SOURCES += \
|
||||||
qt/test/paymentservertests.cpp
|
qt/test/paymentservertests.cpp
|
||||||
endif
|
endif
|
||||||
|
|
||||||
nodist_qt_test_test_bitcoin_qt_SOURCES = $(TEST_QT_MOC_CPP)
|
nodist_qt_test_test_lbrycrd_qt_SOURCES = $(TEST_QT_MOC_CPP)
|
||||||
|
|
||||||
qt_test_test_bitcoin_qt_LDADD = $(LIBBITCOINQT) $(LIBBITCOIN_SERVER)
|
qt_test_test_lbrycrd_qt_LDADD = $(LIBBITCOINQT) $(LIBBITCOIN_SERVER)
|
||||||
if ENABLE_WALLET
|
if ENABLE_WALLET
|
||||||
qt_test_test_bitcoin_qt_LDADD += $(LIBBITCOIN_WALLET)
|
qt_test_test_lbrycrd_qt_LDADD += $(LIBBITCOIN_WALLET)
|
||||||
endif
|
endif
|
||||||
if ENABLE_ZMQ
|
if ENABLE_ZMQ
|
||||||
qt_test_test_bitcoin_qt_LDADD += $(LIBBITCOIN_ZMQ) $(ZMQ_LIBS)
|
qt_test_test_lbrycrd_qt_LDADD += $(LIBBITCOIN_ZMQ) $(ZMQ_LIBS)
|
||||||
endif
|
endif
|
||||||
qt_test_test_bitcoin_qt_LDADD += $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CONSENSUS) $(LIBBITCOIN_CRYPTO) $(LIBUNIVALUE) $(LIBLEVELDB) \
|
qt_test_test_lbrycrd_qt_LDADD += $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CONSENSUS) $(LIBBITCOIN_CRYPTO) $(LIBUNIVALUE) $(LIBLEVELDB) \
|
||||||
$(LIBMEMENV) $(BOOST_LIBS) $(QT_DBUS_LIBS) $(QT_TEST_LIBS) $(QT_LIBS) \
|
$(LIBMEMENV) $(BOOST_LIBS) $(QT_DBUS_LIBS) $(QT_TEST_LIBS) $(QT_LIBS) \
|
||||||
$(QR_LIBS) $(PROTOBUF_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) $(LIBSECP256K1) \
|
$(QR_LIBS) $(PROTOBUF_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) $(LIBSECP256K1) \
|
||||||
$(EVENT_PTHREADS_LIBS) $(EVENT_LIBS)
|
$(EVENT_PTHREADS_LIBS) $(EVENT_LIBS)
|
||||||
qt_test_test_bitcoin_qt_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(QT_LDFLAGS) $(LIBTOOL_APP_LDFLAGS)
|
qt_test_test_lbrycrd_qt_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(QT_LDFLAGS) $(LIBTOOL_APP_LDFLAGS)
|
||||||
qt_test_test_bitcoin_qt_CXXFLAGS = $(AM_CXXFLAGS) $(QT_PIE_FLAGS)
|
qt_test_test_lbrycrd_qt_CXXFLAGS = $(AM_CXXFLAGS) $(QT_PIE_FLAGS)
|
||||||
|
|
||||||
CLEAN_BITCOIN_QT_TEST = $(TEST_QT_MOC_CPP) qt/test/*.gcda qt/test/*.gcno
|
CLEAN_BITCOIN_QT_TEST = $(TEST_QT_MOC_CPP) qt/test/*.gcda qt/test/*.gcno
|
||||||
|
|
||||||
CLEANFILES += $(CLEAN_BITCOIN_QT_TEST)
|
CLEANFILES += $(CLEAN_BITCOIN_QT_TEST)
|
||||||
|
|
||||||
test_bitcoin_qt : qt/test/test_bitcoin-qt$(EXEEXT)
|
test_lbrycrd_qt : qt/test/test_lbrycrd-qt$(EXEEXT)
|
||||||
|
|
||||||
test_bitcoin_qt_check : qt/test/test_bitcoin-qt$(EXEEXT) FORCE
|
test_lbrycrd_qt_check : qt/test/test_lbrycrd-qt$(EXEEXT) FORCE
|
||||||
$(MAKE) check-TESTS TESTS=$^
|
$(MAKE) check-TESTS TESTS=$^
|
||||||
|
|
||||||
test_bitcoin_qt_clean: FORCE
|
test_lbrycrd_qt_clean: FORCE
|
||||||
rm -f $(CLEAN_BITCOIN_QT_TEST) $(qt_test_test_bitcoin_qt_OBJECTS)
|
rm -f $(CLEAN_BITCOIN_QT_TEST) $(qt_test_test_lbrycrd_qt_OBJECTS)
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
TESTS += test/test_bitcoin
|
TESTS += test/test_lbrycrd
|
||||||
bin_PROGRAMS += test/test_bitcoin
|
bin_PROGRAMS += test/test_lbrycrd
|
||||||
TEST_SRCDIR = test
|
TEST_SRCDIR = test
|
||||||
TEST_BINARY=test/test_bitcoin$(EXEEXT)
|
TEST_BINARY=test/test_lbrycrd$(EXEEXT)
|
||||||
|
|
||||||
|
|
||||||
EXTRA_DIST += \
|
EXTRA_DIST += \
|
||||||
|
@ -52,6 +52,7 @@ BITCOIN_TESTS =\
|
||||||
test/getarg_tests.cpp \
|
test/getarg_tests.cpp \
|
||||||
test/hash_tests.cpp \
|
test/hash_tests.cpp \
|
||||||
test/key_tests.cpp \
|
test/key_tests.cpp \
|
||||||
|
test/lbry_tests.cpp \
|
||||||
test/limitedmap_tests.cpp \
|
test/limitedmap_tests.cpp \
|
||||||
test/dbwrapper_tests.cpp \
|
test/dbwrapper_tests.cpp \
|
||||||
test/main_tests.cpp \
|
test/main_tests.cpp \
|
||||||
|
@ -59,6 +60,9 @@ BITCOIN_TESTS =\
|
||||||
test/merkle_tests.cpp \
|
test/merkle_tests.cpp \
|
||||||
test/miner_tests.cpp \
|
test/miner_tests.cpp \
|
||||||
test/multisig_tests.cpp \
|
test/multisig_tests.cpp \
|
||||||
|
test/claimtriecache_tests.cpp \
|
||||||
|
test/claimtriebranching_tests.cpp \
|
||||||
|
test/nameclaim_tests.cpp \
|
||||||
test/netbase_tests.cpp \
|
test/netbase_tests.cpp \
|
||||||
test/pmt_tests.cpp \
|
test/pmt_tests.cpp \
|
||||||
test/policyestimator_tests.cpp \
|
test/policyestimator_tests.cpp \
|
||||||
|
@ -95,23 +99,23 @@ BITCOIN_TESTS += \
|
||||||
test/rpc_wallet_tests.cpp
|
test/rpc_wallet_tests.cpp
|
||||||
endif
|
endif
|
||||||
|
|
||||||
test_test_bitcoin_SOURCES = $(BITCOIN_TESTS) $(JSON_TEST_FILES) $(RAW_TEST_FILES)
|
test_test_lbrycrd_SOURCES = $(BITCOIN_TESTS) $(JSON_TEST_FILES) $(RAW_TEST_FILES)
|
||||||
test_test_bitcoin_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) -I$(builddir)/test/ $(TESTDEFS)
|
test_test_lbrycrd_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) -I$(builddir)/test/ $(TESTDEFS)
|
||||||
test_test_bitcoin_LDADD = $(LIBBITCOIN_SERVER) $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CONSENSUS) $(LIBBITCOIN_CRYPTO) $(LIBUNIVALUE) $(LIBLEVELDB) $(LIBMEMENV) \
|
test_test_lbrycrd_LDADD = $(LIBBITCOIN_SERVER) $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CONSENSUS) $(LIBBITCOIN_CRYPTO) $(LIBUNIVALUE) $(LIBLEVELDB) $(LIBMEMENV) \
|
||||||
$(BOOST_LIBS) $(BOOST_UNIT_TEST_FRAMEWORK_LIB) $(LIBSECP256K1)
|
$(BOOST_LIBS) $(BOOST_UNIT_TEST_FRAMEWORK_LIB) $(LIBSECP256K1)
|
||||||
test_test_bitcoin_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
|
test_test_lbrycrd_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
|
||||||
if ENABLE_WALLET
|
if ENABLE_WALLET
|
||||||
test_test_bitcoin_LDADD += $(LIBBITCOIN_WALLET)
|
test_test_lbrycrd_LDADD += $(LIBBITCOIN_WALLET)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
test_test_bitcoin_LDADD += $(LIBBITCOIN_CONSENSUS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS)
|
test_test_lbrycrd_LDADD += $(LIBBITCOIN_CONSENSUS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS)
|
||||||
test_test_bitcoin_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) -static
|
test_test_lbrycrd_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) -static
|
||||||
|
|
||||||
if ENABLE_ZMQ
|
if ENABLE_ZMQ
|
||||||
test_test_bitcoin_LDADD += $(ZMQ_LIBS)
|
test_test_lbrycrd_LDADD += $(ZMQ_LIBS)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
nodist_test_test_bitcoin_SOURCES = $(GENERATED_TEST_FILES)
|
nodist_test_test_lbrycrd_SOURCES = $(GENERATED_TEST_FILES)
|
||||||
|
|
||||||
$(BITCOIN_TESTS): $(GENERATED_TEST_FILES)
|
$(BITCOIN_TESTS): $(GENERATED_TEST_FILES)
|
||||||
|
|
||||||
|
@ -119,13 +123,13 @@ CLEAN_BITCOIN_TEST = test/*.gcda test/*.gcno $(GENERATED_TEST_FILES)
|
||||||
|
|
||||||
CLEANFILES += $(CLEAN_BITCOIN_TEST)
|
CLEANFILES += $(CLEAN_BITCOIN_TEST)
|
||||||
|
|
||||||
bitcoin_test: $(TEST_BINARY)
|
lbrycrd_test: $(TEST_BINARY)
|
||||||
|
|
||||||
bitcoin_test_check: $(TEST_BINARY) FORCE
|
lbrycrd_test_check: $(TEST_BINARY) FORCE
|
||||||
$(MAKE) check-TESTS TESTS=$^
|
$(MAKE) check-TESTS TESTS=$^
|
||||||
|
|
||||||
bitcoin_test_clean : FORCE
|
lbrycrd_test_clean : FORCE
|
||||||
rm -f $(CLEAN_BITCOIN_TEST) $(test_test_bitcoin_OBJECTS) $(TEST_BINARY)
|
rm -f $(CLEAN_BITCOIN_TEST) $(test_test_lbrycrd_OBJECTS) $(TEST_BINARY)
|
||||||
|
|
||||||
check-local:
|
check-local:
|
||||||
@echo "Running test/bitcoin-util-test.py..."
|
@echo "Running test/bitcoin-util-test.py..."
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
|
|
||||||
#include "tinyformat.h"
|
#include "tinyformat.h"
|
||||||
|
|
||||||
const std::string CURRENCY_UNIT = "BTC";
|
const std::string CURRENCY_UNIT = "LBC";
|
||||||
|
|
||||||
CFeeRate::CFeeRate(const CAmount& nFeePaid, size_t nBytes_)
|
CFeeRate::CFeeRate(const CAmount& nFeePaid, size_t nBytes_)
|
||||||
{
|
{
|
||||||
|
|
|
@ -28,7 +28,7 @@ extern const std::string CURRENCY_UNIT;
|
||||||
* critical; in unusual circumstances like a(nother) overflow bug that allowed
|
* critical; in unusual circumstances like a(nother) overflow bug that allowed
|
||||||
* for the creation of coins out of thin air modification could lead to a fork.
|
* for the creation of coins out of thin air modification could lead to a fork.
|
||||||
* */
|
* */
|
||||||
static const CAmount MAX_MONEY = 21000000 * COIN;
|
static const CAmount MAX_MONEY = 21000000000 * COIN;
|
||||||
inline bool MoneyRange(const CAmount& nValue) { return (nValue >= 0 && nValue <= MAX_MONEY); }
|
inline bool MoneyRange(const CAmount& nValue) { return (nValue >= 0 && nValue <= MAX_MONEY); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -16,14 +16,14 @@ BEGIN
|
||||||
BEGIN
|
BEGIN
|
||||||
BLOCK "040904E4" // U.S. English - multilingual (hex)
|
BLOCK "040904E4" // U.S. English - multilingual (hex)
|
||||||
BEGIN
|
BEGIN
|
||||||
VALUE "CompanyName", "Bitcoin"
|
VALUE "CompanyName", "LBRY, Inc"
|
||||||
VALUE "FileDescription", "bitcoin-cli (JSON-RPC client for " PACKAGE_NAME ")"
|
VALUE "FileDescription", "lbrycrd-cli (JSON-RPC client for " PACKAGE_NAME ")"
|
||||||
VALUE "FileVersion", VER_FILEVERSION_STR
|
VALUE "FileVersion", VER_FILEVERSION_STR
|
||||||
VALUE "InternalName", "bitcoin-cli"
|
VALUE "InternalName", "lbrycrd-cli"
|
||||||
VALUE "LegalCopyright", COPYRIGHT_STR
|
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 "LegalTrademarks1", "Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php."
|
||||||
VALUE "OriginalFilename", "bitcoin-cli.exe"
|
VALUE "OriginalFilename", "lbrycrd-cli.exe"
|
||||||
VALUE "ProductName", "bitcoin-cli"
|
VALUE "ProductName", "lbrycrd-cli"
|
||||||
VALUE "ProductVersion", VER_PRODUCTVERSION_STR
|
VALUE "ProductVersion", VER_PRODUCTVERSION_STR
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
|
|
|
@ -77,9 +77,9 @@ static bool AppInitRPC(int argc, char* argv[])
|
||||||
std::string strUsage = strprintf(_("%s RPC client version"), _(PACKAGE_NAME)) + " " + FormatFullVersion() + "\n";
|
std::string strUsage = strprintf(_("%s RPC client version"), _(PACKAGE_NAME)) + " " + FormatFullVersion() + "\n";
|
||||||
if (!mapArgs.count("-version")) {
|
if (!mapArgs.count("-version")) {
|
||||||
strUsage += "\n" + _("Usage:") + "\n" +
|
strUsage += "\n" + _("Usage:") + "\n" +
|
||||||
" bitcoin-cli [options] <command> [params] " + strprintf(_("Send command to %s"), _(PACKAGE_NAME)) + "\n" +
|
" lbrycrd-cli [options] <command> [params] " + strprintf(_("Send command to %s"), _(PACKAGE_NAME)) + "\n" +
|
||||||
" bitcoin-cli [options] help " + _("List commands") + "\n" +
|
" lbrycrd-cli [options] help " + _("List commands") + "\n" +
|
||||||
" bitcoin-cli [options] help <command> " + _("Get help for a command") + "\n";
|
" lbrycrd-cli [options] help <command> " + _("Get help for a command") + "\n";
|
||||||
|
|
||||||
strUsage += "\n" + HelpMessageCli();
|
strUsage += "\n" + HelpMessageCli();
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,14 +16,14 @@ BEGIN
|
||||||
BEGIN
|
BEGIN
|
||||||
BLOCK "040904E4" // U.S. English - multilingual (hex)
|
BLOCK "040904E4" // U.S. English - multilingual (hex)
|
||||||
BEGIN
|
BEGIN
|
||||||
VALUE "CompanyName", "Bitcoin"
|
VALUE "CompanyName", "LBRY, Inc"
|
||||||
VALUE "FileDescription", "bitcoin-tx (CLI Bitcoin transaction editor utility)"
|
VALUE "FileDescription", "lbrycrd-tx (CLI LBRYcrd transaction editor utility)"
|
||||||
VALUE "FileVersion", VER_FILEVERSION_STR
|
VALUE "FileVersion", VER_FILEVERSION_STR
|
||||||
VALUE "InternalName", "bitcoin-tx"
|
VALUE "InternalName", "lbrycrd-tx"
|
||||||
VALUE "LegalCopyright", COPYRIGHT_STR
|
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 "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 "OriginalFilename", "lbrycrd-tx.exe"
|
||||||
VALUE "ProductName", "bitcoin-tx"
|
VALUE "ProductName", "lbrycrd-tx"
|
||||||
VALUE "ProductVersion", VER_PRODUCTVERSION_STR
|
VALUE "ProductVersion", VER_PRODUCTVERSION_STR
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
|
|
|
@ -51,10 +51,10 @@ static bool AppInitRawTx(int argc, char* argv[])
|
||||||
if (argc<2 || mapArgs.count("-?") || mapArgs.count("-h") || mapArgs.count("-help"))
|
if (argc<2 || mapArgs.count("-?") || mapArgs.count("-h") || mapArgs.count("-help"))
|
||||||
{
|
{
|
||||||
// First part of help message is specific to this utility
|
// First part of help message is specific to this utility
|
||||||
std::string strUsage = strprintf(_("%s bitcoin-tx utility version"), _(PACKAGE_NAME)) + " " + FormatFullVersion() + "\n\n" +
|
std::string strUsage = strprintf(_("%s lbrycrd-tx utility version"), _(PACKAGE_NAME)) + " " + FormatFullVersion() + "\n\n" +
|
||||||
_("Usage:") + "\n" +
|
_("Usage:") + "\n" +
|
||||||
" bitcoin-tx [options] <hex-tx> [commands] " + _("Update hex-encoded bitcoin transaction") + "\n" +
|
" lbrycrd-tx [options] <hex-tx> [commands] " + _("Update hex-encoded lbrycrd transaction") + "\n" +
|
||||||
" bitcoin-tx [options] -create [commands] " + _("Create hex-encoded bitcoin transaction") + "\n" +
|
" lbrycrd-tx [options] -create [commands] " + _("Create hex-encoded lbrycrd transaction") + "\n" +
|
||||||
"\n";
|
"\n";
|
||||||
|
|
||||||
fprintf(stdout, "%s", strUsage.c_str());
|
fprintf(stdout, "%s", strUsage.c_str());
|
||||||
|
|
|
@ -16,14 +16,14 @@ BEGIN
|
||||||
BEGIN
|
BEGIN
|
||||||
BLOCK "040904E4" // U.S. English - multilingual (hex)
|
BLOCK "040904E4" // U.S. English - multilingual (hex)
|
||||||
BEGIN
|
BEGIN
|
||||||
VALUE "CompanyName", "Bitcoin"
|
VALUE "CompanyName", "LBRY, Inc"
|
||||||
VALUE "FileDescription", "bitcoind (Bitcoin node with a JSON-RPC server)"
|
VALUE "FileDescription", "lbrycrdd (LBRYcrd node with a JSON-RPC server)"
|
||||||
VALUE "FileVersion", VER_FILEVERSION_STR
|
VALUE "FileVersion", VER_FILEVERSION_STR
|
||||||
VALUE "InternalName", "bitcoind"
|
VALUE "InternalName", "lbrycrdd"
|
||||||
VALUE "LegalCopyright", COPYRIGHT_STR
|
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 "LegalTrademarks1", "Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php."
|
||||||
VALUE "OriginalFilename", "bitcoind.exe"
|
VALUE "OriginalFilename", "lbrycrdd.exe"
|
||||||
VALUE "ProductName", "bitcoind"
|
VALUE "ProductName", "lbrycrdd"
|
||||||
VALUE "ProductVersion", VER_PRODUCTVERSION_STR
|
VALUE "ProductVersion", VER_PRODUCTVERSION_STR
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
|
|
|
@ -87,7 +87,7 @@ bool AppInit(int argc, char* argv[])
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
strUsage += "\n" + _("Usage:") + "\n" +
|
strUsage += "\n" + _("Usage:") + "\n" +
|
||||||
" bitcoind [options] " + strprintf(_("Start %s Daemon"), _(PACKAGE_NAME)) + "\n";
|
" lbrycrdd [options] " + strprintf(_("Start %s Daemon"), _(PACKAGE_NAME)) + "\n";
|
||||||
|
|
||||||
strUsage += "\n" + HelpMessage(HMM_BITCOIND);
|
strUsage += "\n" + HelpMessage(HMM_BITCOIND);
|
||||||
}
|
}
|
||||||
|
@ -121,19 +121,19 @@ bool AppInit(int argc, char* argv[])
|
||||||
// Command-line RPC
|
// Command-line RPC
|
||||||
bool fCommandLine = false;
|
bool fCommandLine = false;
|
||||||
for (int i = 1; i < argc; i++)
|
for (int i = 1; i < argc; i++)
|
||||||
if (!IsSwitchChar(argv[i][0]) && !boost::algorithm::istarts_with(argv[i], "bitcoin:"))
|
if (!IsSwitchChar(argv[i][0]) && !boost::algorithm::istarts_with(argv[i], "lbrycrd:"))
|
||||||
fCommandLine = true;
|
fCommandLine = true;
|
||||||
|
|
||||||
if (fCommandLine)
|
if (fCommandLine)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Error: There is no RPC client functionality in bitcoind anymore. Use the bitcoin-cli utility instead.\n");
|
fprintf(stderr, "Error: There is no RPC client functionality in lbrycrdd anymore. Use the lbrycrd-cli utility instead.\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
fDaemon = GetBoolArg("-daemon", false);
|
fDaemon = GetBoolArg("-daemon", false);
|
||||||
if (fDaemon)
|
if (fDaemon)
|
||||||
{
|
{
|
||||||
fprintf(stdout, "Bitcoin server starting\n");
|
fprintf(stdout, "LBRYcrd server starting\n");
|
||||||
|
|
||||||
// Daemonize
|
// Daemonize
|
||||||
pid_t pid = fork();
|
pid_t pid = fork();
|
||||||
|
|
14
src/chain.h
|
@ -139,6 +139,7 @@ public:
|
||||||
//! block header
|
//! block header
|
||||||
int nVersion;
|
int nVersion;
|
||||||
uint256 hashMerkleRoot;
|
uint256 hashMerkleRoot;
|
||||||
|
uint256 hashClaimTrie;
|
||||||
unsigned int nTime;
|
unsigned int nTime;
|
||||||
unsigned int nBits;
|
unsigned int nBits;
|
||||||
unsigned int nNonce;
|
unsigned int nNonce;
|
||||||
|
@ -163,6 +164,7 @@ public:
|
||||||
|
|
||||||
nVersion = 0;
|
nVersion = 0;
|
||||||
hashMerkleRoot = uint256();
|
hashMerkleRoot = uint256();
|
||||||
|
hashClaimTrie = uint256();
|
||||||
nTime = 0;
|
nTime = 0;
|
||||||
nBits = 0;
|
nBits = 0;
|
||||||
nNonce = 0;
|
nNonce = 0;
|
||||||
|
@ -179,6 +181,7 @@ public:
|
||||||
|
|
||||||
nVersion = block.nVersion;
|
nVersion = block.nVersion;
|
||||||
hashMerkleRoot = block.hashMerkleRoot;
|
hashMerkleRoot = block.hashMerkleRoot;
|
||||||
|
hashClaimTrie = block.hashClaimTrie;
|
||||||
nTime = block.nTime;
|
nTime = block.nTime;
|
||||||
nBits = block.nBits;
|
nBits = block.nBits;
|
||||||
nNonce = block.nNonce;
|
nNonce = block.nNonce;
|
||||||
|
@ -209,6 +212,7 @@ public:
|
||||||
if (pprev)
|
if (pprev)
|
||||||
block.hashPrevBlock = pprev->GetBlockHash();
|
block.hashPrevBlock = pprev->GetBlockHash();
|
||||||
block.hashMerkleRoot = hashMerkleRoot;
|
block.hashMerkleRoot = hashMerkleRoot;
|
||||||
|
block.hashClaimTrie = hashClaimTrie;
|
||||||
block.nTime = nTime;
|
block.nTime = nTime;
|
||||||
block.nBits = nBits;
|
block.nBits = nBits;
|
||||||
block.nNonce = nNonce;
|
block.nNonce = nNonce;
|
||||||
|
@ -220,6 +224,11 @@ public:
|
||||||
return *phashBlock;
|
return *phashBlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint256 GetBlockPoWHash() const
|
||||||
|
{
|
||||||
|
return GetBlockHeader().GetPoWHash();
|
||||||
|
}
|
||||||
|
|
||||||
int64_t GetBlockTime() const
|
int64_t GetBlockTime() const
|
||||||
{
|
{
|
||||||
return (int64_t)nTime;
|
return (int64_t)nTime;
|
||||||
|
@ -243,9 +252,10 @@ public:
|
||||||
|
|
||||||
std::string ToString() const
|
std::string ToString() const
|
||||||
{
|
{
|
||||||
return strprintf("CBlockIndex(pprev=%p, nHeight=%d, merkle=%s, hashBlock=%s)",
|
return strprintf("CBlockIndex(pprev=%p, nHeight=%d, merkle=%s, claimtrie=%s, hashBlock=%s)",
|
||||||
pprev, nHeight,
|
pprev, nHeight,
|
||||||
hashMerkleRoot.ToString(),
|
hashMerkleRoot.ToString(),
|
||||||
|
hashClaimTrie.ToString(),
|
||||||
GetBlockHash().ToString());
|
GetBlockHash().ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -319,6 +329,7 @@ public:
|
||||||
READWRITE(this->nVersion);
|
READWRITE(this->nVersion);
|
||||||
READWRITE(hashPrev);
|
READWRITE(hashPrev);
|
||||||
READWRITE(hashMerkleRoot);
|
READWRITE(hashMerkleRoot);
|
||||||
|
READWRITE(hashClaimTrie);
|
||||||
READWRITE(nTime);
|
READWRITE(nTime);
|
||||||
READWRITE(nBits);
|
READWRITE(nBits);
|
||||||
READWRITE(nNonce);
|
READWRITE(nNonce);
|
||||||
|
@ -330,6 +341,7 @@ public:
|
||||||
block.nVersion = nVersion;
|
block.nVersion = nVersion;
|
||||||
block.hashPrevBlock = hashPrev;
|
block.hashPrevBlock = hashPrev;
|
||||||
block.hashMerkleRoot = hashMerkleRoot;
|
block.hashMerkleRoot = hashMerkleRoot;
|
||||||
|
block.hashClaimTrie = hashClaimTrie;
|
||||||
block.nTime = nTime;
|
block.nTime = nTime;
|
||||||
block.nBits = nBits;
|
block.nBits = nBits;
|
||||||
block.nNonce = nNonce;
|
block.nNonce = nNonce;
|
||||||
|
|
|
@ -13,10 +13,44 @@
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
#include <boost/assign/list_of.hpp>
|
#include <boost/assign/list_of.hpp>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "chainparamsseeds.h"
|
#include "chainparamsseeds.h"
|
||||||
|
#include "arith_uint256.h"
|
||||||
|
|
||||||
static CBlock CreateGenesisBlock(const char* pszTimestamp, const CScript& genesisOutputScript, uint32_t nTime, uint32_t nNonce, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward)
|
//#define FIND_GENESIS
|
||||||
|
|
||||||
|
#define GENESIS_MERKLE_ROOT "b8211c82c3d15bcd78bba57005b86fed515149a53a425eb592c07af99fe559cc"
|
||||||
|
|
||||||
|
#define MAINNET_GENESIS_HASH "9c89283ba0f3227f6c03b70216b9f665f0118d5e0fa729cedf4fb34d6a34f463"
|
||||||
|
#define MAINNET_GENESIS_NONCE 1287
|
||||||
|
|
||||||
|
#define TESTNET_GENESIS_HASH "9c89283ba0f3227f6c03b70216b9f665f0118d5e0fa729cedf4fb34d6a34f463"
|
||||||
|
#define TESTNET_GENESIS_NONCE 1287
|
||||||
|
|
||||||
|
#define REGTEST_GENESIS_HASH "6e3fcf1299d4ec5d79c3a4c91d624a4acf9e2e173d95a1a0504f677669687556"
|
||||||
|
#define REGTEST_GENESIS_NONCE 1
|
||||||
|
|
||||||
|
bool CheckProofOfWork2(uint256 hash, unsigned int nBits, const Consensus::Params& params)
|
||||||
|
{
|
||||||
|
bool fNegative;
|
||||||
|
bool fOverflow;
|
||||||
|
arith_uint256 bnTarget;
|
||||||
|
|
||||||
|
bnTarget.SetCompact(nBits, &fNegative, &fOverflow);
|
||||||
|
|
||||||
|
// Check range
|
||||||
|
if (fNegative || bnTarget == 0 || fOverflow || bnTarget > UintToArith256(params.powLimit))
|
||||||
|
return error("CheckProofOfWork(): nBits below minimum work");
|
||||||
|
|
||||||
|
// Check proof of work matches claimed amount
|
||||||
|
if (UintToArith256(hash) > bnTarget)
|
||||||
|
return error("CheckProofOfWork(): hash doesn't match nBits");
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static CBlock CreateGenesisBlock(const char* pszTimestamp, const CScript& genesisOutputScript, uint32_t nTime, uint32_t nNonce, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward, const Consensus::Params& consensus)
|
||||||
{
|
{
|
||||||
CMutableTransaction txNew;
|
CMutableTransaction txNew;
|
||||||
txNew.nVersion = 1;
|
txNew.nVersion = 1;
|
||||||
|
@ -24,6 +58,9 @@ static CBlock CreateGenesisBlock(const char* pszTimestamp, const CScript& genesi
|
||||||
txNew.vout.resize(1);
|
txNew.vout.resize(1);
|
||||||
txNew.vin[0].scriptSig = CScript() << 486604799 << CScriptNum(4) << std::vector<unsigned char>((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp));
|
txNew.vin[0].scriptSig = CScript() << 486604799 << CScriptNum(4) << std::vector<unsigned char>((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp));
|
||||||
txNew.vout[0].nValue = genesisReward;
|
txNew.vout[0].nValue = genesisReward;
|
||||||
|
//txNew.vout[0].scriptPubKey = CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG;
|
||||||
|
//txNew.vout[0].scriptPubKey = CScript() << ParseHex("0425caecb9fbf6cf50979644e85c11e3ec9007fd477fab9683648c6539e59b59c3a4d9b9c0b552c37eee6476f3e0d8425ac0346fe69ad61628b8c340d42fbfa3fd") << OP_CHECKSIG;
|
||||||
|
//txNew.vout[0].scriptPubKey = CScript() << OP_DUP << OP_HASH160 << ParseHex("e5ff2d9e3a254622ae493573169c0fa94c82fe4f") << OP_EQUALVERIFY << OP_CHECKSIG;
|
||||||
txNew.vout[0].scriptPubKey = genesisOutputScript;
|
txNew.vout[0].scriptPubKey = genesisOutputScript;
|
||||||
|
|
||||||
CBlock genesis;
|
CBlock genesis;
|
||||||
|
@ -34,6 +71,21 @@ static CBlock CreateGenesisBlock(const char* pszTimestamp, const CScript& genesi
|
||||||
genesis.vtx.push_back(txNew);
|
genesis.vtx.push_back(txNew);
|
||||||
genesis.hashPrevBlock.SetNull();
|
genesis.hashPrevBlock.SetNull();
|
||||||
genesis.hashMerkleRoot = BlockMerkleRoot(genesis);
|
genesis.hashMerkleRoot = BlockMerkleRoot(genesis);
|
||||||
|
genesis.hashClaimTrie = uint256S("0x0000000000000000000000000000000000000000000000000000000000000001");
|
||||||
|
|
||||||
|
#ifdef FIND_GENESIS
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
genesis.nNonce += 1;
|
||||||
|
if (CheckProofOfWork2(genesis.GetPoWHash(), nBits, consensus))
|
||||||
|
{
|
||||||
|
std::cout << "nonce: " << genesis.nNonce << std::endl;
|
||||||
|
std::cout << "hex: " << genesis.GetHash().GetHex() << std::endl;
|
||||||
|
std::cout << "pow hash: " << genesis.GetPoWHash().GetHex() << std::endl;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
return genesis;
|
return genesis;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,11 +100,11 @@ static CBlock CreateGenesisBlock(const char* pszTimestamp, const CScript& genesi
|
||||||
* CTxOut(nValue=50.00000000, scriptPubKey=0x5F1DF16B2B704C8A578D0B)
|
* CTxOut(nValue=50.00000000, scriptPubKey=0x5F1DF16B2B704C8A578D0B)
|
||||||
* vMerkleTree: 4a5e1e
|
* vMerkleTree: 4a5e1e
|
||||||
*/
|
*/
|
||||||
static CBlock CreateGenesisBlock(uint32_t nTime, uint32_t nNonce, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward)
|
static CBlock CreateGenesisBlock(uint32_t nTime, uint32_t nNonce, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward, const Consensus::Params& consensus)
|
||||||
{
|
{
|
||||||
const char* pszTimestamp = "The Times 03/Jan/2009 Chancellor on brink of second bailout for banks";
|
const char* pszTimestamp = "insert timestamp string";//"The Times 03/Jan/2009 Chancellor on brink of second bailout for banks";
|
||||||
const CScript genesisOutputScript = CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG;
|
const CScript genesisOutputScript = CScript() << OP_DUP << OP_HASH160 << ParseHex("345991dbf57bfb014b87006acdfafbfc5fe8292f") << OP_EQUALVERIFY << OP_CHECKSIG;
|
||||||
return CreateGenesisBlock(pszTimestamp, genesisOutputScript, nTime, nNonce, nBits, nVersion, genesisReward);
|
return CreateGenesisBlock(pszTimestamp, genesisOutputScript, nTime, nNonce, nBits, nVersion, genesisReward, consensus);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -69,16 +121,19 @@ static CBlock CreateGenesisBlock(uint32_t nTime, uint32_t nNonce, uint32_t nBits
|
||||||
class CMainParams : public CChainParams {
|
class CMainParams : public CChainParams {
|
||||||
public:
|
public:
|
||||||
CMainParams() {
|
CMainParams() {
|
||||||
strNetworkID = "main";
|
strNetworkID = "lbrycrd";
|
||||||
consensus.nSubsidyHalvingInterval = 210000;
|
consensus.nSubsidyLevelInterval = 1<<5;
|
||||||
consensus.nMajorityEnforceBlockUpgrade = 750;
|
consensus.nMajorityEnforceBlockUpgrade = 750;
|
||||||
consensus.nMajorityRejectBlockOutdated = 950;
|
consensus.nMajorityRejectBlockOutdated = 950;
|
||||||
consensus.nMajorityWindow = 1000;
|
consensus.nMajorityWindow = 1000;
|
||||||
consensus.BIP34Height = 227931;
|
consensus.BIP34Height = 1;
|
||||||
consensus.BIP34Hash = uint256S("0x000000000000024b89b42a942fe0d9fea3bb44ab7bd1b19115dd6a759c0808b8");
|
consensus.BIP34Hash = uint256S("0xdecb9e2cca03a419fd9cca0cb2b1d5ad11b088f22f8f38556d93ac4358b86c24");
|
||||||
consensus.powLimit = uint256S("00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
|
consensus.powLimit = uint256S("0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
|
||||||
consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; // two weeks
|
consensus.nPowTargetTimespan = 150; //retarget every block
|
||||||
consensus.nPowTargetSpacing = 10 * 60;
|
consensus.nPowTargetSpacing = 150;
|
||||||
|
consensus.nOriginalClaimExpirationTime = 262974;
|
||||||
|
consensus.nExtendedClaimExpirationTime = 2102400;
|
||||||
|
consensus.nExtendedClaimExpirationForkHeight = 400155;
|
||||||
consensus.fPowAllowMinDifficultyBlocks = false;
|
consensus.fPowAllowMinDifficultyBlocks = false;
|
||||||
consensus.fPowNoRetargeting = false;
|
consensus.fPowNoRetargeting = false;
|
||||||
consensus.nRuleChangeActivationThreshold = 1916; // 95% of 2016
|
consensus.nRuleChangeActivationThreshold = 1916; // 95% of 2016
|
||||||
|
@ -97,30 +152,35 @@ public:
|
||||||
* The characters are rarely used upper ASCII, not valid as UTF-8, and produce
|
* The characters are rarely used upper ASCII, not valid as UTF-8, and produce
|
||||||
* a large 32-bit integer with any alignment.
|
* a large 32-bit integer with any alignment.
|
||||||
*/
|
*/
|
||||||
pchMessageStart[0] = 0xf9;
|
pchMessageStart[0] = 0xfa;
|
||||||
pchMessageStart[1] = 0xbe;
|
pchMessageStart[1] = 0xe4;
|
||||||
pchMessageStart[2] = 0xb4;
|
pchMessageStart[2] = 0xaa;
|
||||||
pchMessageStart[3] = 0xd9;
|
pchMessageStart[3] = 0xf1;
|
||||||
nDefaultPort = 8333;
|
nDefaultPort = 9246;
|
||||||
nPruneAfterHeight = 100000;
|
nPruneAfterHeight = 100000;
|
||||||
|
|
||||||
genesis = CreateGenesisBlock(1231006505, 2083236893, 0x1d00ffff, 1, 50 * COIN);
|
genesis = CreateGenesisBlock(1446058291, MAINNET_GENESIS_NONCE, 0x1f00ffff, 1, 400000000 * COIN, consensus);
|
||||||
consensus.hashGenesisBlock = genesis.GetHash();
|
consensus.hashGenesisBlock = genesis.GetHash();
|
||||||
assert(consensus.hashGenesisBlock == uint256S("0x000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"));
|
#ifdef FIND_GENESIS
|
||||||
assert(genesis.hashMerkleRoot == uint256S("0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"));
|
std::cout << "hex: " << consensus.hashGenesisBlock.GetHex() << std::endl;
|
||||||
|
std::cout << "merkle root: " << genesis.hashMerkleRoot.GetHex() << std::endl;
|
||||||
|
#else
|
||||||
|
assert(consensus.hashGenesisBlock == uint256S(MAINNET_GENESIS_HASH));
|
||||||
|
assert(genesis.hashMerkleRoot == uint256S(GENESIS_MERKLE_ROOT));
|
||||||
|
#endif
|
||||||
|
vSeeds.clear();
|
||||||
|
vFixedSeeds.clear();
|
||||||
|
|
||||||
vSeeds.push_back(CDNSSeedData("bitcoin.sipa.be", "seed.bitcoin.sipa.be")); // Pieter Wuille
|
vSeeds.push_back(CDNSSeedData("lbry.io", "dnsseed1.lbry.io")); // lbry.io
|
||||||
vSeeds.push_back(CDNSSeedData("bluematt.me", "dnsseed.bluematt.me")); // Matt Corallo
|
vSeeds.push_back(CDNSSeedData("lbry.io", "dnsseed2.lbry.io")); // lbry.io
|
||||||
vSeeds.push_back(CDNSSeedData("dashjr.org", "dnsseed.bitcoin.dashjr.org")); // Luke Dashjr
|
vSeeds.push_back(CDNSSeedData("lbry.io", "dnsseed3.lbry.io")); // lbry.io
|
||||||
vSeeds.push_back(CDNSSeedData("bitcoinstats.com", "seed.bitcoinstats.com")); // Christian Decker
|
|
||||||
vSeeds.push_back(CDNSSeedData("xf2.org", "bitseed.xf2.org")); // Jeff Garzik
|
|
||||||
vSeeds.push_back(CDNSSeedData("bitcoin.jonasschnelli.ch", "seed.bitcoin.jonasschnelli.ch")); // Jonas Schnelli
|
|
||||||
|
|
||||||
base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1,0);
|
|
||||||
base58Prefixes[SCRIPT_ADDRESS] = std::vector<unsigned char>(1,5);
|
base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1,0x55);
|
||||||
base58Prefixes[SECRET_KEY] = std::vector<unsigned char>(1,128);
|
base58Prefixes[SCRIPT_ADDRESS] = std::vector<unsigned char>(1,0x7a);
|
||||||
base58Prefixes[EXT_PUBLIC_KEY] = boost::assign::list_of(0x04)(0x88)(0xB2)(0x1E).convert_to_container<std::vector<unsigned char> >();
|
base58Prefixes[SECRET_KEY] = std::vector<unsigned char>(1,0x1c);
|
||||||
base58Prefixes[EXT_SECRET_KEY] = boost::assign::list_of(0x04)(0x88)(0xAD)(0xE4).convert_to_container<std::vector<unsigned char> >();
|
base58Prefixes[EXT_PUBLIC_KEY] = boost::assign::list_of(0x01)(0x9C)(0x35)(0x4f).convert_to_container<std::vector<unsigned char> >();
|
||||||
|
base58Prefixes[EXT_SECRET_KEY] = boost::assign::list_of(0x01)(0x9C)(0x31)(0x18).convert_to_container<std::vector<unsigned char> >();
|
||||||
|
|
||||||
vFixedSeeds = std::vector<SeedSpec6>(pnSeed6_main, pnSeed6_main + ARRAYLEN(pnSeed6_main));
|
vFixedSeeds = std::vector<SeedSpec6>(pnSeed6_main, pnSeed6_main + ARRAYLEN(pnSeed6_main));
|
||||||
|
|
||||||
|
@ -132,23 +192,11 @@ public:
|
||||||
|
|
||||||
checkpointData = (CCheckpointData) {
|
checkpointData = (CCheckpointData) {
|
||||||
boost::assign::map_list_of
|
boost::assign::map_list_of
|
||||||
( 11111, uint256S("0x0000000069e244f73d78e8fd29ba2fd2ed618bd6fa2ee92559f542fdb26e7c1d"))
|
( 4000, uint256S("0xa6bbb48f5343eb9b0287c22f3ea8b29f36cf10794a37f8a925a894d6f4519913")),
|
||||||
( 33333, uint256S("0x000000002dd5588a74784eaa7ab0507a18ad16a236e7b1ce69f00d7ddfb5d0a6"))
|
1467272478, // * UNIX timestamp of last checkpoint block
|
||||||
( 74000, uint256S("0x0000000000573993a3c9e41ce34471c079dcf5f52a0e824a81e7f953b8661a20"))
|
4146, // * total number of transactions between genesis and last checkpoint
|
||||||
(105000, uint256S("0x00000000000291ce28027faea320c8d2b054b2e0fe44a773f3eefb151d6bdc97"))
|
|
||||||
(134444, uint256S("0x00000000000005b12ffd4cd315cd34ffd4a594f430ac814c91184a0d42d2b0fe"))
|
|
||||||
(168000, uint256S("0x000000000000099e61ea72015e79632f216fe6cb33d7899acb35b75c8303b763"))
|
|
||||||
(193000, uint256S("0x000000000000059f452a5f7340de6682a977387c17010ff6e6c3bd83ca8b1317"))
|
|
||||||
(210000, uint256S("0x000000000000048b95347e83192f69cf0366076336c639f9b7228e9ba171342e"))
|
|
||||||
(216116, uint256S("0x00000000000001b4f4b433e81ee46494af945cf96014816a4e2370f11b23df4e"))
|
|
||||||
(225430, uint256S("0x00000000000001c108384350f74090433e7fcf79a606b8e797f065b130575932"))
|
|
||||||
(250000, uint256S("0x000000000000003887df1f29024b06fc2200b55f8af8f35453d7be294df2d214"))
|
|
||||||
(279000, uint256S("0x0000000000000001ae8c72a0b0c301f67e3afca10e819efa9041e458e9bd7e40"))
|
|
||||||
(295000, uint256S("0x00000000000000004d9b4ef50f0f9d686fd69db2e03af35a100370c64632a983")),
|
|
||||||
1397080064, // * UNIX timestamp of last checkpoint block
|
|
||||||
36544669, // * total number of transactions between genesis and last checkpoint
|
|
||||||
// (the tx=... number in the SetBestChain debug.log lines)
|
// (the tx=... number in the SetBestChain debug.log lines)
|
||||||
60000.0 // * estimated number of transactions per day after checkpoint
|
600.0 // * estimated number of transactions per day after checkpoint
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -160,16 +208,19 @@ static CMainParams mainParams;
|
||||||
class CTestNetParams : public CChainParams {
|
class CTestNetParams : public CChainParams {
|
||||||
public:
|
public:
|
||||||
CTestNetParams() {
|
CTestNetParams() {
|
||||||
strNetworkID = "test";
|
strNetworkID = "lbrycrdtest";
|
||||||
consensus.nSubsidyHalvingInterval = 210000;
|
consensus.nSubsidyLevelInterval = 1 << 5;
|
||||||
consensus.nMajorityEnforceBlockUpgrade = 51;
|
consensus.nMajorityEnforceBlockUpgrade = 51;
|
||||||
consensus.nMajorityRejectBlockOutdated = 75;
|
consensus.nMajorityRejectBlockOutdated = 75;
|
||||||
consensus.nMajorityWindow = 100;
|
consensus.nMajorityWindow = 100;
|
||||||
consensus.BIP34Height = 21111;
|
consensus.BIP34Height = 21111;
|
||||||
consensus.BIP34Hash = uint256S("0x0000000023b3a96d3484e5abb3755c413e7d41500f8e2a5c3f0dd01299cd8ef8");
|
consensus.BIP34Hash = uint256S("0x0000000023b3a96d3484e5abb3755c413e7d41500f8e2a5c3f0dd01299cd8ef8");
|
||||||
consensus.powLimit = uint256S("00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
|
consensus.powLimit = uint256S("0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
|
||||||
consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; // two weeks
|
consensus.nPowTargetTimespan = 150;
|
||||||
consensus.nPowTargetSpacing = 10 * 60;
|
consensus.nPowTargetSpacing = 150;
|
||||||
|
consensus.nOriginalClaimExpirationTime = 262974;
|
||||||
|
consensus.nExtendedClaimExpirationTime = 2102400;
|
||||||
|
consensus.nExtendedClaimExpirationForkHeight = 278160;
|
||||||
consensus.fPowAllowMinDifficultyBlocks = true;
|
consensus.fPowAllowMinDifficultyBlocks = true;
|
||||||
consensus.fPowNoRetargeting = false;
|
consensus.fPowNoRetargeting = false;
|
||||||
consensus.nRuleChangeActivationThreshold = 1512; // 75% for testchains
|
consensus.nRuleChangeActivationThreshold = 1512; // 75% for testchains
|
||||||
|
@ -183,23 +234,27 @@ public:
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nStartTime = 1456790400; // March 1st, 2016
|
consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nStartTime = 1456790400; // March 1st, 2016
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nTimeout = 1493596800; // May 1st, 2017
|
consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nTimeout = 1493596800; // May 1st, 2017
|
||||||
|
|
||||||
pchMessageStart[0] = 0x0b;
|
pchMessageStart[0] = 0xfa;
|
||||||
pchMessageStart[1] = 0x11;
|
pchMessageStart[1] = 0xe4;
|
||||||
pchMessageStart[2] = 0x09;
|
pchMessageStart[2] = 0xaa;
|
||||||
pchMessageStart[3] = 0x07;
|
pchMessageStart[3] = 0xe1;
|
||||||
nDefaultPort = 18333;
|
nDefaultPort = 19246;
|
||||||
nPruneAfterHeight = 1000;
|
nPruneAfterHeight = 1000;
|
||||||
|
|
||||||
genesis = CreateGenesisBlock(1296688602, 414098458, 0x1d00ffff, 1, 50 * COIN);
|
genesis = CreateGenesisBlock(1446058291, TESTNET_GENESIS_NONCE, 0x1f00ffff, 1, 400000000 * COIN, consensus);
|
||||||
consensus.hashGenesisBlock = genesis.GetHash();
|
consensus.hashGenesisBlock = genesis.GetHash();
|
||||||
assert(consensus.hashGenesisBlock == uint256S("0x000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943"));
|
#ifdef FIND_GENESIS
|
||||||
assert(genesis.hashMerkleRoot == uint256S("0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"));
|
std::cout << "testnet genesis hash: " << genesis.GetHash().GetHex() << std::endl;
|
||||||
|
std::cout << "testnet merkle hash: " << genesis.hashMerkleRoot.GetHex() << std::endl;
|
||||||
|
#else
|
||||||
|
assert(consensus.hashGenesisBlock == uint256S(TESTNET_GENESIS_HASH));
|
||||||
|
assert(genesis.hashMerkleRoot == uint256S(GENESIS_MERKLE_ROOT));
|
||||||
|
#endif
|
||||||
|
|
||||||
vFixedSeeds.clear();
|
vFixedSeeds.clear();
|
||||||
vSeeds.clear();
|
vSeeds.clear();
|
||||||
vSeeds.push_back(CDNSSeedData("bitcoin.petertodd.org", "testnet-seed.bitcoin.petertodd.org"));
|
vSeeds.push_back(CDNSSeedData("lbry.io", "testdnsseed1.lbry.io"));
|
||||||
vSeeds.push_back(CDNSSeedData("bluematt.me", "testnet-seed.bluematt.me"));
|
vSeeds.push_back(CDNSSeedData("lbry.io", "testdnsseed2.lbry.io"));
|
||||||
vSeeds.push_back(CDNSSeedData("bitcoin.schildbach.de", "testnet-seed.bitcoin.schildbach.de"));
|
|
||||||
|
|
||||||
base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1,111);
|
base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1,111);
|
||||||
base58Prefixes[SCRIPT_ADDRESS] = std::vector<unsigned char>(1,196);
|
base58Prefixes[SCRIPT_ADDRESS] = std::vector<unsigned char>(1,196);
|
||||||
|
@ -217,10 +272,10 @@ public:
|
||||||
|
|
||||||
checkpointData = (CCheckpointData) {
|
checkpointData = (CCheckpointData) {
|
||||||
boost::assign::map_list_of
|
boost::assign::map_list_of
|
||||||
( 546, uint256S("000000002a936ca763904c3c35fce2f3556c559c0214345d31b1bcebf76acb70")),
|
( 0, uint256S(TESTNET_GENESIS_HASH)),
|
||||||
1337966069,
|
0,
|
||||||
1488,
|
0,
|
||||||
300
|
0
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -233,18 +288,21 @@ static CTestNetParams testNetParams;
|
||||||
class CRegTestParams : public CChainParams {
|
class CRegTestParams : public CChainParams {
|
||||||
public:
|
public:
|
||||||
CRegTestParams() {
|
CRegTestParams() {
|
||||||
strNetworkID = "regtest";
|
strNetworkID = "lbrycrdreg";
|
||||||
consensus.nSubsidyHalvingInterval = 150;
|
consensus.nSubsidyLevelInterval = 1 << 5;
|
||||||
consensus.nMajorityEnforceBlockUpgrade = 750;
|
consensus.nMajorityEnforceBlockUpgrade = 750;
|
||||||
consensus.nMajorityRejectBlockOutdated = 950;
|
consensus.nMajorityRejectBlockOutdated = 950;
|
||||||
consensus.nMajorityWindow = 1000;
|
consensus.nMajorityWindow = 1000;
|
||||||
consensus.BIP34Height = -1; // BIP34 has not necessarily activated on regtest
|
consensus.BIP34Height = -1; // BIP34 has not necessarily activated on regtest
|
||||||
consensus.BIP34Hash = uint256();
|
consensus.BIP34Hash = uint256();
|
||||||
consensus.powLimit = uint256S("7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
|
consensus.powLimit = uint256S("7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
|
||||||
consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; // two weeks
|
consensus.nPowTargetTimespan = 1;//14 * 24 * 60 * 60; // two weeks
|
||||||
consensus.nPowTargetSpacing = 10 * 60;
|
consensus.nPowTargetSpacing = 1;
|
||||||
consensus.fPowAllowMinDifficultyBlocks = true;
|
consensus.nOriginalClaimExpirationTime = 500;
|
||||||
consensus.fPowNoRetargeting = true;
|
consensus.nExtendedClaimExpirationTime = 600;
|
||||||
|
consensus.nExtendedClaimExpirationForkHeight = 800;
|
||||||
|
consensus.fPowAllowMinDifficultyBlocks = false;
|
||||||
|
consensus.fPowNoRetargeting = false;
|
||||||
consensus.nRuleChangeActivationThreshold = 108; // 75% for testchains
|
consensus.nRuleChangeActivationThreshold = 108; // 75% for testchains
|
||||||
consensus.nMinerConfirmationWindow = 144; // Faster than normal for regtest (144 instead of 2016)
|
consensus.nMinerConfirmationWindow = 144; // Faster than normal for regtest (144 instead of 2016)
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].bit = 28;
|
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].bit = 28;
|
||||||
|
@ -255,16 +313,21 @@ public:
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nTimeout = 999999999999ULL;
|
consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nTimeout = 999999999999ULL;
|
||||||
|
|
||||||
pchMessageStart[0] = 0xfa;
|
pchMessageStart[0] = 0xfa;
|
||||||
pchMessageStart[1] = 0xbf;
|
pchMessageStart[1] = 0xe4;
|
||||||
pchMessageStart[2] = 0xb5;
|
pchMessageStart[2] = 0xaa;
|
||||||
pchMessageStart[3] = 0xda;
|
pchMessageStart[3] = 0xd1;
|
||||||
nDefaultPort = 18444;
|
nDefaultPort = 29246;
|
||||||
nPruneAfterHeight = 1000;
|
nPruneAfterHeight = 1000;
|
||||||
|
|
||||||
genesis = CreateGenesisBlock(1296688602, 2, 0x207fffff, 1, 50 * COIN);
|
genesis = CreateGenesisBlock(1446058291, REGTEST_GENESIS_NONCE, 0x207fffff, 1, 400000000 * COIN, consensus);
|
||||||
consensus.hashGenesisBlock = genesis.GetHash();
|
consensus.hashGenesisBlock = genesis.GetHash();
|
||||||
assert(consensus.hashGenesisBlock == uint256S("0x0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206"));
|
#ifdef FIND_GENESIS
|
||||||
assert(genesis.hashMerkleRoot == uint256S("0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"));
|
std::cout << "regtest genensis hash: " << genesis.GetHash().GetHex() << std::endl;
|
||||||
|
std::cout << "regtest hashmerkleroot: " << genesis.hashMerkleRoot.GetHex() << std::endl;
|
||||||
|
#else
|
||||||
|
assert(consensus.hashGenesisBlock == uint256S(REGTEST_GENESIS_HASH));
|
||||||
|
assert(genesis.hashMerkleRoot == uint256S(GENESIS_MERKLE_ROOT));
|
||||||
|
#endif
|
||||||
|
|
||||||
vFixedSeeds.clear(); //!< Regtest mode doesn't have any fixed seeds.
|
vFixedSeeds.clear(); //!< Regtest mode doesn't have any fixed seeds.
|
||||||
vSeeds.clear(); //!< Regtest mode doesn't have any DNS seeds.
|
vSeeds.clear(); //!< Regtest mode doesn't have any DNS seeds.
|
||||||
|
@ -277,7 +340,7 @@ public:
|
||||||
|
|
||||||
checkpointData = (CCheckpointData){
|
checkpointData = (CCheckpointData){
|
||||||
boost::assign::map_list_of
|
boost::assign::map_list_of
|
||||||
( 0, uint256S("0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206")),
|
( 0, uint256S(REGTEST_GENESIS_HASH)),
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0
|
0
|
||||||
|
|
|
@ -32,7 +32,7 @@ class CBaseMainParams : public CBaseChainParams
|
||||||
public:
|
public:
|
||||||
CBaseMainParams()
|
CBaseMainParams()
|
||||||
{
|
{
|
||||||
nRPCPort = 8332;
|
nRPCPort = 9245;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
static CBaseMainParams mainParams;
|
static CBaseMainParams mainParams;
|
||||||
|
@ -45,7 +45,7 @@ class CBaseTestNetParams : public CBaseChainParams
|
||||||
public:
|
public:
|
||||||
CBaseTestNetParams()
|
CBaseTestNetParams()
|
||||||
{
|
{
|
||||||
nRPCPort = 18332;
|
nRPCPort = 19245;
|
||||||
strDataDir = "testnet3";
|
strDataDir = "testnet3";
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -8,952 +8,11 @@
|
||||||
* IPv4 as well as onion addresses are wrapped inside a IPv6 address accordingly.
|
* IPv4 as well as onion addresses are wrapped inside a IPv6 address accordingly.
|
||||||
*/
|
*/
|
||||||
static SeedSpec6 pnSeed6_main[] = {
|
static SeedSpec6 pnSeed6_main[] = {
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x02,0x91,0xc9}, 8333},
|
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8a,0x44,0xc6,0x8e}, 9246},
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x16,0x8e,0xd6}, 8333},
|
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8a,0xc5,0xe0,0xfc}, 9246}
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x35,0xac,0xc5}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xbd,0xa1,0xa4}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xe6,0x8c,0xa6}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xe7,0x03,0x82}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xff,0x50,0x67}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0e,0xca,0xe6,0x31}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x12,0x55,0x0b,0x82}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0x5b,0x61,0x19}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0x5e,0x64,0x7a}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0x5f,0x63,0x84}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x73,0x08,0xce}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x7f,0x80,0xbf}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x9a,0xb2,0x19}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xcf,0x67,0x2b}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xcf,0x68,0x69}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xd2,0xe6,0x96}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xe0,0x12,0x54}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xf6,0xa8,0x6a}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1b,0xfe,0x40,0x2f}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0x06,0x47,0x7b}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0x06,0x47,0x7c}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0x0e,0x86,0x0d}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0x1e,0x24,0xdc}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0xa4,0x06,0x68}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0xaa,0x6a,0xcb}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0xb9,0x86,0xc9}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0xcc,0x80,0x63}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0xcc,0x80,0xdb}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x01,0xdb,0x58}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x61,0x84,0x6d}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x78,0xa0,0x37}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x78,0xa9,0x7b}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x8b,0x20,0x2e}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0xdd,0xa3,0xda}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x26,0x82,0xc0,0x48}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x29,0x4b,0x60,0x50}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x03,0x00,0x31}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x21,0x48,0xb9}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x21,0x60,0x81}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x38,0x04,0x3f}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x4f,0x00,0x7f}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x4f,0x50,0x66}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x4f,0x61,0x1e}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x4f,0x84,0xdb}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x15,0x61,0x87}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x1c,0xcd,0x43}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x1c,0xce,0xbc}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x1d,0x14,0xd1}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x32,0xea,0xb3}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x65,0xa0,0xa8}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xa6,0xa1,0x23}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xa6,0xa1,0x67}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xb6,0x84,0x64}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xda,0xe3,0x5c}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xe2,0x6d,0x14}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xe3,0x42,0x84}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xe3,0x42,0x8a}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xe5,0xa5,0x9a}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xe5,0xa5,0x9b}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xe5,0xee,0xbb}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xea,0x68,0x30}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xef,0x6b,0x4a}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xf4,0x00,0x8a}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xfe,0x48,0xc3}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x05,0x0d,0x2c}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x07,0x25,0x72}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x1e,0x25,0x67}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x27,0x69,0x3c}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x6a,0x28,0xe7}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x1d,0x00,0x25}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x34,0x4c,0xc0,0xf6}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x98,0xc0,0xb3}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xa9,0x40,0xae}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xaf,0xa0,0x16}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xc7,0x80,0x00}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3a,0x60,0xab,0x81}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3a,0xa1,0xee,0x39}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3c,0xfb,0xc3,0xdd}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3d,0x23,0xe1,0x13}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0x2b,0x82,0xb2}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0x41,0x27,0x0c}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0x6b,0xc8,0x1e}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0x85,0xc2,0x02}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0xb5,0xee,0xba}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0xb7,0x16,0x32}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0xd2,0x55,0x78}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0xd2,0xa2,0x59}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0xee,0x22,0x7d}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x40,0x19,0xab,0x49}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x40,0x1b,0xa6,0x1e}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x40,0x35,0x89,0x65}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x40,0x47,0x48,0x2c}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x40,0x53,0xe1,0x92}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x40,0x79,0x03,0xa3}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x40,0xcb,0x66,0x56}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x41,0x5e,0x83,0x3b}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x41,0xbc,0x88,0xe9}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0x0b,0xa2,0xda}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0x17,0xe4,0x85}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0x5a,0x89,0x59}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0x72,0x21,0x31}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0x96,0x69,0x4d}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0xac,0x0a,0x04}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0xc2,0x26,0xfa}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0xc2,0x26,0xfd}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0xc2,0x26,0xfe}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0xe7,0x61,0xac}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0xf0,0xed,0x9b}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0x9f,0x0d,0x22}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xcd,0x4a,0xce}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xdd,0xc1,0x37}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xe3,0x48,0x11}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x44,0x41,0x78,0x35}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x44,0x41,0xcd,0xe2}, 9000},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x44,0x90,0x04,0x22}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x27,0x31,0xc7}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x32,0xab,0xcd}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x41,0x29,0x15}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x71,0x62,0x3d}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x77,0x61,0x27}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x92,0x46,0x7c}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0xc1,0x47,0x02}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x46,0x2e,0x0a,0xed}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x46,0x50,0xc8,0xbb}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x46,0xb9,0x61,0x75}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x47,0xfe,0xa0,0x19}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0x1c,0xcb,0x05}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0x34,0x82,0x6e}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0x53,0xc2,0x7a}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0x80,0x20,0xa7}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0xb3,0x88,0x50}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0xeb,0x26,0x46}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4a,0x32,0x2c,0xc1}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4a,0x48,0x3c,0x53}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4a,0x50,0xea,0x74}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4a,0xcf,0xe9,0xc1}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4b,0x70,0xe9,0x80}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4b,0x76,0xa6,0xc5}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4b,0x8c,0x00,0xf1}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4b,0x9f,0xf0,0x42}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4b,0xae,0x05,0x1a}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0x48,0xa0,0xfc}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0x48,0xa0,0xfe}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0x4a,0xaa,0x70}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0x4f,0xc9,0x36}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0xaf,0xa6,0xa4}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0xb3,0x69,0x1b}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0x44,0x25,0xc8}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0xea,0x31,0xc4}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0xf7,0xe5,0x5d}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x18,0x48,0x4e}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x2f,0x20,0x93}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x54,0x64,0x5f}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x79,0x45,0x17}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x81,0xa7,0x05}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0xc1,0x60,0x9b}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4f,0x13,0x25,0xb3}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4f,0x84,0xe6,0x90}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4f,0x85,0x2b,0x3f}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4f,0x86,0xc9,0x42}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4f,0xa9,0x23,0xeb}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0x39,0xe3,0x0e}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0x40,0x41,0x57}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0x56,0x5c,0x46}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0x64,0xcb,0x97}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0x65,0x20,0x79}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0xa1,0xb2,0x49}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0xf0,0x81,0xaa}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x07,0x0b,0x32}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x07,0x0b,0x37}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x11,0x11,0x28}, 9333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x1e,0x27,0x53}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x5a,0x24,0x07}, 9444},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x88,0xe0,0x4d}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0xa2,0xe7,0xd3}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0xb8,0x00,0x8f}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0xc6,0x80,0x56}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x0b,0x21,0xe5}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x4f,0x80,0x86}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x76,0xe9,0x6f}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x87,0x8b,0x1e}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xc7,0x66,0x0a}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xdd,0x6a,0x11}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xdd,0x6c,0x15}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xdd,0x6c,0x1b}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x89,0x29,0x03}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x8e,0xc5,0xa8}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x8f,0x82,0x13}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x96,0x09,0xc4}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xb7,0x11,0xbf}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xe3,0xad,0x53}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xe6,0x05,0x0f}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xe9,0x69,0x97}, 443},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xf6,0x4b,0x08}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xfa,0x85,0x9e}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xff,0x42,0x76}, 8334},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x18,0x45,0x3b}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x2a,0xc1,0x06}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x2d,0x62,0x57}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x36,0x80,0x0b}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0xd4,0xc8,0x18}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0xd7,0xc6,0x6d}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0xe6,0x04,0xb1}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0x5f,0xe4,0x53}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0x5f,0xe4,0x7b}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0x72,0x80,0x86}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0xd6,0x42,0xa8}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0xd6,0x93,0xa2}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0xf3,0xa8,0x04}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x56,0x01,0x00,0x12}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0x4f,0x4d,0x6a}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0x5b,0x9c,0x6e}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0xec,0xc4,0xde}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x55,0x4b,0x98}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x57,0x01,0xe6}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x57,0x5c,0x66}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x59,0x45,0xca}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x61,0x48,0xe5}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0xa4,0x75,0x63}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0xc6,0x20,0x83}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0xca,0xe6,0x57}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0xd6,0xc1,0x9a}, 8343},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0xd6,0xc2,0xe2}, 8343},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0x0a,0x9b,0x58}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0x2e,0x65,0x2c}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0xa3,0xe0,0xd4}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0xae,0xf8,0x14}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0xca,0xe7,0xc6}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0xd4,0x4b,0x06}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5a,0x95,0x26,0xac}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5a,0xa9,0x6a,0x8b}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x40,0x65,0x96}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x41,0xc4,0xb3}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x79,0x50,0x11}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x7e,0x4d,0x4d}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x91,0x4c,0x9c}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x98,0x96,0x23}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xc0,0x89,0x11}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xc4,0xaa,0x6e}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xc5,0x2c,0x85}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xcf,0x44,0x90}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xd2,0x69,0x1c}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xd3,0x66,0x65}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xd3,0x6a,0x22}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xd6,0xc8,0xcd}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xdc,0x2b,0x92}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xde,0x47,0x59}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xe0,0x8c,0xf2}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xe5,0x4c,0x0e}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5c,0x1b,0x07,0xd1}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5c,0x33,0xa7,0x58}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5c,0xf7,0xe5,0xa3}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0x54,0x72,0x6a}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0x71,0x24,0xac}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0xbc,0xe0,0xfd}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0x4b,0xef,0x45}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0xbe,0xe3,0x70}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0xd6,0x02,0x4a}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0xe0,0xa2,0x41}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0xec,0xc6,0xfd}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0xf2,0xe5,0x9e}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0x54,0x8a,0x63}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0x5f,0xa8,0x57}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0x6e,0xea,0x5d}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0x82,0x09,0xc8}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0xa5,0xa8,0xa8}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0xaa,0xeb,0xfe}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0xd3,0x82,0x9a}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x60,0x2e,0x44,0x68}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x60,0x7f,0xca,0x94}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x61,0x4c,0xab,0x23}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0xa0,0xa0,0x43}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x63,0x7e,0xc5,0xbb}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x63,0xc6,0xad,0x01}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x64,0xae,0x8a}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0xa4,0xc9,0xd0}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x67,0xe0,0xa5,0x30}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0x80,0xe1,0xdf}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0x80,0xe4,0xfc}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0x83,0xc0,0x5e}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0x9b,0x2d,0xc9}, 8334},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xc2,0x1c,0xc3}, 8663},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xd3,0x01,0x1b}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xdd,0x26,0xb1}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xec,0x09,0x4f}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xec,0x81,0xb2}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xec,0xba,0xf9}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xec,0xc2,0x0f}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xee,0x80,0xd6}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xee,0x82,0xb6}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x26,0xea,0x54}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0xb9,0x24,0xcc}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0xb9,0x26,0x43}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0x06,0x04,0x91}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0x96,0x02,0x06}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0x96,0x28,0xea}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0xaa,0x0d,0xb8}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0xb5,0xfa,0xd8}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0xbf,0x65,0x6f}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0xbf,0x6a,0x73}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6c,0x3b,0x0c,0xa3}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6c,0xa1,0x81,0xf7}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xc1,0xa0,0x8c}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xc5,0x0d,0x36}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xe6,0x07,0xf8}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xea,0x6a,0xbf}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xec,0x89,0x50}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xfb,0xa1,0x79}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x70,0x41,0xe7,0xe2}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x73,0x46,0xa6,0x39}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x73,0x9f,0x2a,0x50}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x75,0x12,0x49,0x22}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x43,0xc9,0x28}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x64,0x56,0xf6}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x6e,0x68,0x98}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0xe0,0x40,0x8d}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x37,0xc1,0x88}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7a,0x6a,0xa9,0xb2}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7b,0xcb,0xae,0x0f}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7b,0xff,0xe8,0x5e}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7c,0x94,0xa5,0xa5}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7c,0xe8,0x8d,0x1f}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0x1e,0x5c,0x45}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0x27,0x8d,0xb6}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0x54,0xa7,0x14}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0x6f,0x49,0x0a}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0x7f,0x26,0xc3}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0x8c,0xe0,0xa2}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0xc7,0x65,0x68}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0xe9,0xe0,0x23}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0xfd,0x03,0xc1}, 20020},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x82,0xb4,0xe4,0x8a}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x82,0xb9,0x90,0xd5}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x82,0xff,0x49,0xcf}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x85,0xda,0xe9,0x0b}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x86,0xf9,0x80,0x17}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x88,0x9f,0xea,0xea}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x89,0x74,0xa0,0xb0}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0xa2,0x02,0x91}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8b,0xa2,0x17,0x75}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8d,0x86,0x45,0xfd}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8d,0xff,0xa2,0xd7}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x90,0x7a,0xa3,0xbb}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x91,0x83,0x03,0x36}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x91,0xff,0x04,0x5e}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x92,0x00,0x20,0x65}, 8337},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x93,0x53,0x48,0x5b}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x94,0x67,0x1c,0x44}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x95,0x05,0x20,0x66}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x95,0xd2,0xa4,0xc3}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x96,0x65,0xa3,0xf1}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x97,0xec,0x0b,0xbd}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x98,0x03,0x88,0x38}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9a,0x14,0xd0,0x19}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9e,0xb5,0x68,0x95}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9f,0xfd,0x60,0xe2}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa0,0x24,0x82,0xb4}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xd1,0x01,0xe9}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xd1,0x04,0x7d}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xd1,0x6a,0x7b}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xd2,0xc6,0xb8}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xf8,0x63,0xa4}, 53011},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xf8,0x66,0x75}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xfb,0x6c,0x35}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa3,0x2c,0x02,0x30}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa3,0x9e,0x24,0x11}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa6,0xe6,0x47,0x43}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa7,0xa0,0x24,0x3e}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa7,0xa0,0xa9,0x5c}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa8,0x5d,0x81,0xdc}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa9,0x37,0x63,0x54}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa9,0xe4,0x42,0x2b}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0x09,0xa9,0xf2}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0x20,0x0b,0xc2}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xe6,0xe4,0x88}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xf6,0x6b,0x22}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xfe,0xeb,0x22}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xae,0x00,0x80,0xde}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xae,0x19,0x82,0x94}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xae,0x32,0x40,0x65}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xaf,0x8c,0xe8,0x8d}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x24,0x25,0x3e}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x2e,0x09,0x60}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x7c,0x6e,0x1b}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb1,0x27,0x10,0x66}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x11,0xad,0x02}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x3e,0x05,0xf8}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x3e,0x46,0x10}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x3e,0xcb,0xb9}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x4f,0xa0,0x76}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0xa9,0xce,0xf4}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0xc1,0xea,0x3e}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0xc7,0x60,0x6c}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0xfe,0x12,0x60}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0xfe,0x22,0xa1}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0xff,0x29,0x7b}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb4,0xd2,0x22,0x3a}, 9801},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb6,0x5c,0xe2,0xd4}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb6,0xab,0xf6,0x8e}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb8,0x17,0x08,0x09}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb8,0x3a,0xa2,0x23}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb8,0x9a,0x09,0xaa}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x08,0xee,0xa5}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x18,0x61,0x0b}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x1f,0x89,0x8b}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x26,0x2c,0x40}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x35,0x80,0xb4}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x35,0x81,0xf4}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x4d,0x81,0x77}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x4d,0x81,0x9c}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x52,0xcb,0x5c}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x14,0x61,0x12}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x7e,0x08,0x0e}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x8a,0x21,0xef}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x9b,0x88,0x46}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0xa6,0xe5,0x70}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0xb6,0x6c,0x81}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0xe2,0xe1,0xae}, 8010},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0xf2,0xab,0x08}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0xf3,0x04,0x8b}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbe,0x0a,0x09,0xea}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbe,0x0a,0x0a,0x93}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbe,0x51,0xa0,0xb8}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbe,0x55,0xc9,0x25}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0x22,0xe3,0xe6}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0x4d,0xbd,0xc8}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0x7c,0xe0,0x07}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0x92,0x89,0x01}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0xcb,0xe4,0x47}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0xce,0xca,0x14}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x00,0x6d,0x03}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x29,0xe5,0x82}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x29,0xe5,0x9c}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x31,0x2b,0xdb}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x93,0x47,0x78}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0xb3,0x41,0xe9}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0xb7,0x63,0x2e}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0xc0,0x25,0x87}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0xea,0xe0,0xc3}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0x3a,0x6c,0xd5}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0xbb,0x60,0x02}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0xff,0x1f,0x3b}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0x24,0x06,0x65}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0x3a,0xee,0xf3}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0xc5,0xaf,0xbe}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0xef,0x01,0x42}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0x30,0xc4,0xe6}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0x32,0xc0,0xa0}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0x39,0xd2,0x1b}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0x54,0xc3,0xb3}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0xa7,0x8c,0x08}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0xcc,0xe0,0x6a}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc7,0x7f,0xe2,0xf5}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc7,0xc9,0x6e,0x08}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc7,0xe9,0xea,0x5a}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc8,0x74,0x62,0xb9}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xca,0x3c,0x46,0x12}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcb,0x97,0x8c,0x0e}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcc,0x70,0xcb,0x34}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcd,0xc8,0xf7,0x95}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcf,0xe2,0x8d,0xfd}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcf,0xff,0x2a,0xca}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd0,0x35,0xa4,0x13}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd0,0x42,0x44,0x7f}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd0,0x42,0x44,0x82}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd0,0x47,0xab,0xe8}, 8341},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd0,0x4c,0xc8,0xc8}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd0,0x52,0x62,0xbd}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd0,0x55,0xc1,0x1f}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd0,0x6f,0x30,0x29}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd0,0x6f,0x30,0x2d}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0x22,0xe8,0x48}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0x51,0x09,0xdf}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0x5a,0xe0,0x02}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0x5a,0xe0,0x04}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0x7e,0x62,0xae}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0x88,0x48,0x45}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0xc3,0x04,0x4a}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0xc5,0x0d,0x3e}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd3,0x48,0xe3,0x08}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x33,0x90,0x2a}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x47,0xe9,0x7f}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x7e,0x0e,0x7a}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x9f,0x2c,0x32}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x05,0x24,0x3a}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x39,0x21,0x0a}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x42,0xcd,0xc2}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x88,0x49,0x7d}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x9b,0x03,0xd8}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x9b,0x07,0x18}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0xa7,0x11,0x06}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0xdf,0x8a,0x0d}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0x0f,0x4e,0xb6}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0x26,0x81,0xa4}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0x30,0xa8,0x08}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0xa9,0x8d,0xa9}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0xf5,0xce,0xb5}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0xf9,0xcc,0xa1}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0xfa,0x8a,0xe6}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x0b,0xe1,0xbd}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x0c,0x22,0x9e}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x0c,0xca,0x21}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x14,0xab,0x2b}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x17,0x01,0x7e}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x17,0x0b,0x8a}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x6f,0x42,0x4f}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x9b,0xca,0xbf}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x9e,0x09,0x66}, 8333},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0xac,0x20,0x12}, 20993},
|
|
||||||
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xdc,0xf5,0xc4,0x25}, 8333},
|
|
||||||
{{0x20,0x01,0x12,0x91,0x02,0xbf,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00}, 8333},
|
|
||||||
{{0x20,0x01,0x16,0x20,0x0f,0x00,0x02,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x20,0x01,0x16,0x20,0x0f,0x00,0x82,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x20,0x01,0x19,0xf0,0x50,0x00,0x8d,0xe8,0x54,0x00,0x00,0xff,0xfe,0x12,0x55,0xe4}, 8333},
|
|
||||||
{{0x20,0x01,0x19,0xf0,0x6c,0x00,0x91,0x03,0x54,0x00,0x00,0xff,0xfe,0x10,0xa8,0xd3}, 8333},
|
|
||||||
{{0x20,0x01,0x1b,0x60,0x00,0x03,0x01,0x72,0x14,0x2b,0x6d,0xff,0xfe,0x7a,0x01,0x17}, 8333},
|
|
||||||
{{0x20,0x01,0x04,0x10,0xa0,0x00,0x40,0x50,0x84,0x63,0x90,0xb0,0xff,0xfb,0x4e,0x58}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0x28,0x61,0x35,0x20,0x10,0x02,0x1e,0x0b,0xff,0xfe,0xe8,0xa3,0xc0}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x10,0x08,0x07,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7c}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x01,0x45,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x01,0x6c,0xd3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x01,0x8b,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x01,0xaf,0xda,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8200},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x01,0xb2,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x01,0xc1,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x01,0xc8,0xd7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x01,0xf5,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x01,0xf7,0xcc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x02,0x10,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x02,0x37,0xc3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8200},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x02,0x47,0x97,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x02,0x53,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x02,0x9c,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x02,0x9d,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x02,0xa2,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x02,0xa3,0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x02,0xb2,0xb8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x02,0xc1,0xd9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x02,0x0c,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x02,0xc9,0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x02,0xf1,0xa5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x52,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x5f}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x52,0x0c,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0xf5}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x52,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0xe2}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x08,0x3e,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x08,0x62,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x08,0x67,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x08,0xb3,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x08,0xbc,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x08,0xbe,0x9a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x08,0xd9,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x08,0xeb,0x8b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x0a,0x13,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x0a,0x2b,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x0a,0x2d,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x0a,0x45,0x58,0x00,0x00,0x00,0x00,0x1d,0xf2,0x76,0xd3}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x0a,0x4a,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x0a,0x63,0x5b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x0a,0x63,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x0a,0x6c,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x0a,0xf9,0xcd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x0d,0x20,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0x00,0x0e,0x02,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xd0,0xfc,0x8c,0xa2,0x00,0x7a,0x24,0xaf,0xff,0xfe,0x9d,0xc6,0x9b}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xf0,0x00,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07}, 8333},
|
|
||||||
{{0x20,0x01,0x41,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x20,0x01,0x44,0xb8,0x41,0xbd,0x61,0x01,0x14,0x8e,0x40,0x22,0x49,0x50,0xe8,0x61}, 8333},
|
|
||||||
{{0x20,0x01,0x04,0x70,0x00,0x01,0x02,0xf9,0x00,0x00,0x00,0x01,0x10,0x7a,0xa3,0x01}, 8333},
|
|
||||||
{{0x20,0x01,0x04,0x70,0x1f,0x0b,0x0a,0xd6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x20,0x01,0x04,0x70,0x1f,0x11,0x12,0xd5,0x00,0x00,0x00,0x00,0x0a,0xe1,0x56,0x11}, 8333},
|
|
||||||
{{0x20,0x01,0x04,0x70,0x1f,0x14,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x20,0x01,0x04,0x70,0x00,0x27,0x00,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x20,0x01,0x04,0x70,0x00,0x41,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x20,0x01,0x04,0x70,0x50,0x7d,0x00,0x00,0x6a,0xb5,0x99,0xff,0xfe,0x73,0xac,0x18}, 8333},
|
|
||||||
{{0x20,0x01,0x04,0x70,0x58,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a}, 8333},
|
|
||||||
{{0x20,0x01,0x04,0x70,0x00,0x5f,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x32}, 8333},
|
|
||||||
{{0x20,0x01,0x04,0x70,0x00,0x66,0x01,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x20,0x01,0x04,0x70,0x6c,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0xfe}, 8333},
|
|
||||||
{{0x20,0x01,0x04,0x70,0x00,0x6f,0x03,0x27,0x91,0x3b,0x07,0xfe,0x85,0x45,0xa4,0xf5}, 8333},
|
|
||||||
{{0x20,0x01,0x04,0x70,0x7d,0xda,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x20,0x01,0x04,0x70,0x95,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x20,0x01,0x04,0x70,0xb1,0xd0,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00}, 8333},
|
|
||||||
{{0x20,0x01,0x04,0x70,0xd0,0x0d,0x00,0x00,0x36,0x64,0xa9,0xff,0xfe,0x9a,0x51,0x50}, 8333},
|
|
||||||
{{0x20,0x01,0x04,0x70,0xfa,0xb7,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x20,0x01,0x48,0x00,0x78,0x19,0x01,0x04,0xbe,0x76,0x4e,0xff,0xfe,0x05,0xc8,0x28}, 8333},
|
|
||||||
{{0x20,0x01,0x48,0x00,0x78,0x19,0x01,0x04,0xbe,0x76,0x4e,0xff,0xfe,0x05,0xc9,0xa0}, 8333},
|
|
||||||
{{0x20,0x01,0x48,0x01,0x78,0x19,0x00,0x74,0xb7,0x45,0xb9,0xd5,0xff,0x10,0xa6,0x1a}, 8333},
|
|
||||||
{{0x20,0x01,0x48,0x01,0x78,0x19,0x00,0x74,0xb7,0x45,0xb9,0xd5,0xff,0x10,0xaa,0xec}, 8333},
|
|
||||||
{{0x20,0x01,0x48,0x01,0x78,0x28,0x01,0x04,0xbe,0x76,0x4e,0xff,0xfe,0x10,0x13,0x25}, 8333},
|
|
||||||
{{0x20,0x01,0x48,0x02,0x78,0x00,0x00,0x01,0xbe,0x76,0x4e,0xff,0xfe,0x20,0xf0,0x23}, 8333},
|
|
||||||
{{0x20,0x01,0x48,0x02,0x78,0x00,0x00,0x02,0x30,0xd7,0x17,0x75,0xff,0x20,0x18,0x58}, 8333},
|
|
||||||
{{0x20,0x01,0x48,0x02,0x78,0x00,0x00,0x02,0xbe,0x76,0x4e,0xff,0xfe,0x20,0x6c,0x26}, 8333},
|
|
||||||
{{0x20,0x01,0x48,0x02,0x78,0x02,0x01,0x01,0xbe,0x76,0x4e,0xff,0xfe,0x20,0x02,0x56}, 8333},
|
|
||||||
{{0x20,0x01,0x48,0x02,0x78,0x02,0x01,0x03,0xbe,0x76,0x4e,0xff,0xfe,0x20,0x2d,0xe8}, 8333},
|
|
||||||
{{0x20,0x01,0x48,0x30,0x11,0x00,0x02,0xe8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x20,0x01,0x4b,0x98,0x0d,0xc2,0x00,0x41,0x02,0x16,0x3e,0xff,0xfe,0x56,0xf6,0x59}, 8333},
|
|
||||||
{{0x20,0x01,0x4b,0xa0,0xff,0xfa,0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x93}, 8333},
|
|
||||||
{{0x20,0x01,0x4b,0xa0,0xff,0xff,0x01,0xbe,0x00,0x01,0x10,0x05,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x20,0x01,0x4d,0xd0,0xff,0x00,0x86,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03}, 8333},
|
|
||||||
{{0x20,0x01,0x4d,0xd0,0xff,0x00,0x9a,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09}, 8333},
|
|
||||||
{{0x20,0x01,0x05,0xc0,0x14,0x00,0x00,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0xc7}, 8333},
|
|
||||||
{{0x20,0x01,0x06,0x10,0x1b,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03}, 8333},
|
|
||||||
{{0x20,0x01,0x06,0x10,0x06,0x00,0x0a,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x20,0x01,0x06,0x7c,0x26,0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
|
|
||||||
{{0x20,0x01,0x08,0xd8,0x08,0x40,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x01,0xae}, 8333},
|
|
||||||
{{0x20,0x01,0x08,0xd8,0x09,0x65,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x93,0x43}, 8333},
|
|
||||||
{{0x20,0x01,0x09,0x80,0x46,0x50,0x00,0x01,0x02,0xe0,0x53,0xff,0xfe,0x13,0x24,0x49}, 8333},
|
|
||||||
{{0x20,0x01,0x09,0x81,0x00,0x46,0x00,0x01,0xba,0x27,0xeb,0xff,0xfe,0x5b,0xed,0xee}, 8333},
|
|
||||||
{{0x20,0x01,0x09,0xc8,0x53,0xe9,0x36,0x9a,0x02,0x26,0x2d,0xff,0xfe,0x1b,0x74,0x72}, 8333},
|
|
||||||
{{0x20,0x01,0x09,0xd8,0xca,0xfe,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x87}, 8333},
|
|
||||||
{{0x20,0x01,0x0b,0x10,0x00,0x11,0x00,0x21,0x3e,0x07,0x54,0xff,0xfe,0x48,0x72,0x48}, 8333},
|
|
||||||
{{0x20,0x01,0x0b,0xa8,0x01,0xf1,0xf3,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x20,0x01,0x0b,0xc8,0x23,0x10,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x20,0x01,0x0b,0xc8,0x34,0x27,0x01,0x01,0x7a,0x4f,0x08,0xbe,0x26,0x11,0x6e,0x79}, 8333},
|
|
||||||
{{0x20,0x01,0x0b,0xc8,0x35,0x05,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x20,0x01,0x0c,0xc0,0xa0,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x1d}, 8333},
|
|
||||||
{{0x20,0x01,0x0e,0x42,0x01,0x02,0x12,0x09,0x01,0x53,0x01,0x21,0x00,0x76,0x01,0x71}, 8333},
|
|
||||||
{{0x20,0x02,0x17,0xea,0x14,0xeb,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0xea,0x14,0xeb}, 8333},
|
|
||||||
{{0x20,0x02,0x02,0xf8,0x2b,0xc5,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0xf8,0x2b,0xc5}, 8333},
|
|
||||||
{{0x20,0x02,0x40,0x47,0x48,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x47,0x48,0x2c}, 8333},
|
|
||||||
{{0x20,0x02,0x45,0xc3,0x8c,0xca,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0xc3,0x8c,0xca}, 8333},
|
|
||||||
{{0x20,0x02,0x46,0xbb,0x8a,0x41,0x00,0x00,0x02,0x26,0xb0,0xff,0xfe,0xed,0x5f,0x12}, 8888},
|
|
||||||
{{0x20,0x02,0x46,0xbb,0x8c,0x3c,0x00,0x00,0x8d,0x55,0x8f,0xbb,0x15,0xfa,0xf4,0xe0}, 8765},
|
|
||||||
{{0x20,0x02,0x4c,0x48,0xa0,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x48,0xa0,0xfe}, 8333},
|
|
||||||
{{0x20,0x02,0x4d,0x44,0x25,0xc8,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x44,0x25,0xc8}, 8333},
|
|
||||||
{{0x20,0x02,0x50,0x5f,0xaa,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x5f,0xaa,0xa2}, 8333},
|
|
||||||
{{0x20,0x02,0x5b,0xc1,0x79,0x9d,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0xc1,0x79,0x9d}, 8333},
|
|
||||||
{{0x20,0x02,0x6d,0xec,0x54,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0xec,0x54,0x72}, 8333},
|
|
||||||
{{0x20,0x02,0x8c,0x6d,0x65,0x21,0x96,0x17,0x12,0xbf,0x48,0xff,0xfe,0xd8,0x17,0x24}, 8333},
|
|
||||||
{{0x20,0x02,0xac,0x52,0x94,0xe2,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x52,0x94,0xe2}, 8333},
|
|
||||||
{{0x20,0x02,0xaf,0x7e,0x3e,0xca,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x7e,0x3e,0xca}, 8333},
|
|
||||||
{{0x20,0x02,0xb0,0x09,0x20,0xc5,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x09,0x20,0xc5}, 8333},
|
|
||||||
{{0x20,0x02,0xc0,0x6f,0x39,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x6f,0x39,0xa0}, 8333},
|
|
||||||
{{0x20,0x02,0xc2,0x3a,0x73,0x8a,0x00,0x00,0x00,0x00,0x00,0x00,0xc2,0x3a,0x73,0x8a}, 8333},
|
|
||||||
{{0x20,0x02,0xc7,0x0f,0x74,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0xc7,0x0f,0x74,0x42}, 8333},
|
|
||||||
{{0x20,0x02,0xce,0xc5,0xbe,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0xce,0xc5,0xbe,0x4f}, 8333},
|
|
||||||
{{0x20,0x02,0xd1,0x49,0x9e,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0xd1,0x49,0x9e,0x3a}, 8333},
|
|
||||||
{{0x20,0x02,0xd9,0x17,0x0c,0xa5,0x00,0x00,0x00,0x00,0x00,0x00,0xd9,0x17,0x0c,0xa5}, 8333},
|
|
||||||
{{0x24,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x50,0x15,0x3f}, 8333},
|
|
||||||
{{0x24,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x6e,0x82,0x3e}, 8333},
|
|
||||||
{{0x24,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0xa8,0x19,0x34}, 8333},
|
|
||||||
{{0x24,0x00,0x89,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x26,0xc4,0xd6}, 8333},
|
|
||||||
{{0x24,0x00,0x89,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0xc8,0x42,0x80}, 8333},
|
|
||||||
{{0x24,0x00,0x89,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0xc8,0x66,0x0f}, 8333},
|
|
||||||
{{0x24,0x01,0x18,0x00,0x78,0x00,0x01,0x02,0xbe,0x76,0x4e,0xff,0xfe,0x1c,0x05,0x59}, 8333},
|
|
||||||
{{0x24,0x01,0x18,0x00,0x78,0x00,0x01,0x02,0xbe,0x76,0x4e,0xff,0xfe,0x1c,0x0a,0x7d}, 8333},
|
|
||||||
{{0x24,0x05,0xaa,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40}, 8333},
|
|
||||||
{{0x26,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x18,0x59,0xb2}, 8333},
|
|
||||||
{{0x26,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x26,0xbf,0xb6}, 8333},
|
|
||||||
{{0x26,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x33,0x88,0xe3}, 8333},
|
|
||||||
{{0x26,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x6e,0x72,0x97}, 8333},
|
|
||||||
{{0x26,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x84,0x8a,0x6e}, 8333},
|
|
||||||
{{0x26,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x18,0x6a,0xdf}, 8333},
|
|
||||||
{{0x26,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x26,0xc4,0xb8}, 8333},
|
|
||||||
{{0x26,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x3b,0x1f,0x76}, 8333},
|
|
||||||
{{0x26,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x50,0x5e,0x06}, 8333},
|
|
||||||
{{0x26,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x61,0x28,0x9b}, 8333},
|
|
||||||
{{0x26,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x69,0x89,0xe9}, 8333},
|
|
||||||
{{0x26,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x84,0xac,0x15}, 8333},
|
|
||||||
{{0x26,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x98,0x68,0xbb}, 8333},
|
|
||||||
{{0x26,0x00,0x3c,0x02,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x26,0x07,0x13}, 8333},
|
|
||||||
{{0x26,0x00,0x3c,0x02,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x26,0xc4,0x9e}, 8333},
|
|
||||||
{{0x26,0x00,0x3c,0x02,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x84,0x97,0xd8}, 8333},
|
|
||||||
{{0x26,0x00,0x3c,0x02,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0xc8,0x8f,0xeb}, 8333},
|
|
||||||
{{0x26,0x00,0x3c,0x03,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x18,0xda,0x80}, 8333},
|
|
||||||
{{0x26,0x00,0x3c,0x03,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x26,0xc4,0x9b}, 8333},
|
|
||||||
{{0x26,0x00,0x3c,0x03,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x50,0x5f,0xa7}, 8333},
|
|
||||||
{{0x26,0x00,0x3c,0x03,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x67,0x0d,0x2e}, 8333},
|
|
||||||
{{0x26,0x00,0x3c,0x03,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x6e,0x18,0x03}, 8333},
|
|
||||||
{{0x26,0x00,0x3c,0x03,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0xc8,0x4b,0xbe}, 8333},
|
|
||||||
{{0x26,0x00,0x3c,0x03,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0xe4,0x4e,0x16}, 8333},
|
|
||||||
{{0x26,0x01,0x01,0x8d,0x83,0x00,0x58,0xa6,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0xe4}, 8333},
|
|
||||||
{{0x26,0x01,0x02,0x40,0x46,0x00,0x40,0xc0,0x02,0x50,0x56,0xff,0xfe,0xa4,0x63,0x05}, 8333},
|
|
||||||
{{0x26,0x01,0x05,0x81,0xc2,0x00,0xa7,0x19,0x54,0x2c,0x9c,0xd5,0x48,0x52,0xf7,0xd9}, 8333},
|
|
||||||
{{0x26,0x01,0x06,0x47,0x49,0x00,0x85,0xf1,0xca,0x2a,0x14,0xff,0xfe,0x51,0xbb,0x35}, 8333},
|
|
||||||
{{0x26,0x01,0x00,0xc2,0xc0,0x02,0xb3,0x00,0x54,0xa0,0x15,0xb5,0x19,0xf7,0x53,0x0d}, 8333},
|
|
||||||
{{0x26,0x02,0x03,0x06,0xcc,0xff,0xad,0x7f,0xb1,0x16,0x52,0xbe,0x64,0xba,0xdb,0x3a}, 8333},
|
|
||||||
{{0x26,0x02,0x00,0xae,0x19,0x82,0x94,0x00,0x08,0x46,0xf7,0x8c,0x0f,0xec,0x4d,0x57}, 8333},
|
|
||||||
{{0x26,0x02,0xff,0xc5,0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x2d,0x61}, 8333},
|
|
||||||
{{0x26,0x02,0xff,0xc5,0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x92,0x11}, 8333},
|
|
||||||
{{0x26,0x02,0xff,0xc5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x75,0xd5,0xc1,0xc3}, 8333},
|
|
||||||
{{0x26,0x02,0xff,0xc5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xc5,0xb8,0x44}, 8333},
|
|
||||||
{{0x26,0x02,0xff,0xe8,0x01,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x04,0x57,0x93,0x6b}, 8333},
|
|
||||||
{{0x26,0x02,0xff,0xe8,0x01,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x9d,0x20,0x2e,0x3c}, 8333},
|
|
||||||
{{0x26,0x02,0xff,0xea,0x10,0x01,0x07,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x8b}, 8333},
|
|
||||||
{{0x26,0x02,0xff,0xea,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0xc4,0xd9,0xfd}, 8333},
|
|
||||||
{{0x26,0x04,0x00,0x00,0x00,0xc1,0x01,0x00,0x1e,0xc1,0xde,0xff,0xfe,0x54,0x22,0x35}, 8333},
|
|
||||||
{{0x26,0x04,0x01,0x80,0x00,0x01,0x01,0xaf,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0xa9}, 8333},
|
|
||||||
{{0x26,0x04,0x01,0x80,0x00,0x03,0x07,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xc9,0xde}, 8333},
|
|
||||||
{{0x26,0x04,0x40,0x80,0x11,0x14,0x00,0x00,0x32,0x85,0xa9,0xff,0xfe,0x93,0x85,0x0c}, 8333},
|
|
||||||
{{0x26,0x04,0x60,0x00,0xff,0xc0,0x00,0x3c,0x64,0xa3,0x94,0xd0,0x4f,0x1d,0x1d,0xa8}, 8333},
|
|
||||||
{{0x26,0x05,0x60,0x00,0xf3,0x80,0x9a,0x01,0xba,0x09,0x8a,0xff,0xfe,0xd4,0x35,0x11}, 8333},
|
|
||||||
{{0x26,0x05,0x60,0x01,0xe0,0x0f,0x7b,0x00,0xc5,0x87,0x6d,0x91,0x6e,0xff,0xee,0xba}, 8333},
|
|
||||||
{{0x26,0x05,0xf7,0x00,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x25,0xc3,0x2a,0x3e}, 8333},
|
|
||||||
{{0x26,0x06,0x60,0x00,0xa4,0x41,0x99,0x03,0x50,0x54,0x00,0xff,0xfe,0x78,0x66,0xff}, 8333},
|
|
||||||
{{0x26,0x07,0x53,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x83}, 9334},
|
|
||||||
{{0x26,0x07,0x53,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa1}, 8333},
|
|
||||||
{{0x26,0x07,0x53,0x00,0x00,0x60,0x1c,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x26,0x07,0x53,0x00,0x00,0x60,0x2b,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x26,0x07,0x53,0x00,0x00,0x60,0x33,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x26,0x07,0x53,0x00,0x00,0x60,0x03,0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x26,0x07,0x53,0x00,0x00,0x60,0x4a,0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
|
|
||||||
{{0x26,0x07,0x53,0x00,0x00,0x60,0x65,0xe4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
|
|
||||||
{{0x26,0x07,0x53,0x00,0x00,0x60,0x69,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
|
|
||||||
{{0x26,0x07,0x53,0x00,0x00,0x60,0x71,0x1a,0x00,0x78,0x00,0x00,0x00,0x00,0xa7,0xb5}, 8333},
|
|
||||||
{{0x26,0x07,0x53,0x00,0x00,0x60,0x07,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x26,0x07,0x53,0x00,0x00,0x60,0x08,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x26,0x07,0x53,0x00,0x00,0x60,0x95,0x2e,0x37,0x33,0x00,0x00,0x00,0x00,0x14,0x14}, 8333},
|
|
||||||
{{0x26,0x07,0xf1,0xc0,0x08,0x48,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x94,0x3c}, 8333},
|
|
||||||
{{0x26,0x07,0xf2,0xe0,0x00,0x0f,0x05,0xdf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x26,0x07,0xf7,0x48,0x12,0x00,0x00,0xf8,0x02,0x1e,0x67,0xff,0xfe,0x99,0x8f,0x07}, 8333},
|
|
||||||
{{0x26,0x07,0xf9,0x48,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07}, 8333},
|
|
||||||
{{0x26,0x07,0xff,0x68,0x01,0x00,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x31}, 8333},
|
|
||||||
{{0x28,0x03,0x69,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x17}, 8333},
|
|
||||||
{{0x2a,0x00,0x10,0x98,0x00,0x00,0x00,0x80,0x10,0x00,0x00,0x25,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x2a,0x00,0x11,0x78,0x00,0x02,0x00,0x43,0x50,0x54,0x00,0xff,0xfe,0x84,0xf8,0x6f}, 8333},
|
|
||||||
{{0x2a,0x00,0x11,0x78,0x00,0x02,0x00,0x43,0x50,0x54,0x00,0xff,0xfe,0xe7,0x2e,0xb6}, 8333},
|
|
||||||
{{0x2a,0x00,0x11,0x78,0x00,0x02,0x00,0x43,0x89,0x83,0xcc,0x27,0x0d,0x72,0xd9,0x7a}, 8333},
|
|
||||||
{{0x2a,0x00,0x13,0x28,0xe1,0x00,0xcc,0x42,0x02,0x30,0x48,0xff,0xfe,0x92,0x05,0x5c}, 8333},
|
|
||||||
{{0x2a,0x00,0x14,0xf0,0xe0,0x00,0x80,0xd2,0xcd,0x1a,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x2a,0x00,0x16,0x30,0x00,0x02,0x18,0x02,0x01,0x88,0x01,0x22,0x00,0x91,0x00,0x11}, 8333},
|
|
||||||
{{0x2a,0x00,0x18,0xe0,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x2a,0x00,0x18,0xe0,0x00,0x00,0xdc,0xc5,0x01,0x09,0x02,0x34,0x01,0x06,0x01,0x91}, 8333},
|
|
||||||
{{0x2a,0x00,0x1a,0x28,0x11,0x57,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0xc7}, 8333},
|
|
||||||
{{0x2a,0x00,0x1c,0xa8,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0xa5,0xfc,0x40,0xd1}, 8333},
|
|
||||||
{{0x2a,0x00,0x1c,0xa8,0x00,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x6d,0xce,0x2c}, 8333},
|
|
||||||
{{0x2a,0x00,0x71,0x43,0x01,0x00,0x00,0x00,0x02,0x16,0x3e,0xff,0xfe,0x2e,0x74,0xa3}, 8333},
|
|
||||||
{{0x2a,0x00,0x71,0x43,0x01,0x00,0x00,0x00,0x02,0x16,0x3e,0xff,0xfe,0xd3,0x5c,0x21}, 8333},
|
|
||||||
{{0x2a,0x00,0x7c,0x80,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x23}, 8333},
|
|
||||||
{{0x2a,0x00,0xdc,0xc0,0x0e,0xda,0x00,0x98,0x01,0x83,0x01,0x93,0xc3,0x82,0x6b,0xdb}, 8333},
|
|
||||||
{{0x2a,0x00,0xdc,0xc0,0x0e,0xda,0x00,0x98,0x01,0x83,0x01,0x93,0xf7,0x2e,0xd9,0x43}, 8333},
|
|
||||||
{{0x2a,0x00,0xf8,0x20,0x00,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0xaf,0x00,0x01}, 8333},
|
|
||||||
{{0x2a,0x00,0xf9,0x40,0x00,0x02,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x00,0x10,0x1d}, 8333},
|
|
||||||
{{0x2a,0x00,0xf9,0x40,0x00,0x02,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x00,0x06,0xac}, 8333},
|
|
||||||
{{0x2a,0x01,0x01,0xb0,0x79,0x99,0x04,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x31}, 8333},
|
|
||||||
{{0x2a,0x01,0x02,0x38,0x42,0xdd,0xf9,0x00,0x7a,0x6c,0x2b,0xc6,0x40,0x41,0x0c,0x43}, 8333},
|
|
||||||
{{0x2a,0x01,0x02,0x38,0x43,0x13,0x63,0x00,0x21,0x89,0x1c,0x97,0x69,0x6b,0x05,0xea}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0x88,0x00,0x66,0x10,0x00,0x5c,0x33,0x91,0xf9,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0x88,0x00,0x66,0x10,0x00,0xb0,0x1c,0x17,0x8d,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x00,0x34,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x00,0x34,0xe4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x00,0x44,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x00,0x51,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x00,0x51,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x10,0x51,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x10,0x51,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x20,0x43,0xe4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x20,0x62,0xe6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x20,0x70,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x20,0x82,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x21,0x23,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x21,0x02,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x30,0x11,0xea,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x30,0x33,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x30,0x40,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x30,0x63,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x30,0x63,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x30,0x93,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x31,0x33,0xad,0xfe,0xa1,0x00,0x00,0x00,0x00,0x06,0x66}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x40,0x21,0x95,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x40,0x63,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x40,0x93,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x40,0x93,0xb0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x41,0x11,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x41,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x41,0x53,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x50,0x33,0x6a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x50,0x72,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x50,0x83,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 9001},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x51,0x21,0xca,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x51,0x41,0xc2,0x00,0x00,0x54,0x04,0xa6,0x7e,0xf2,0x50}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x51,0x51,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x51,0x52,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x54}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x51,0x63,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 9001},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x60,0x51,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x60,0x72,0xc5,0x00,0x00,0x00,0x00,0x28,0x58,0xe1,0xc5}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x60,0x72,0xc5,0x00,0x00,0x00,0x00,0x59,0x3b,0x60,0xd5}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x60,0x81,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x61,0x13,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x61,0x22,0x8f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x61,0x51,0xc4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x61,0x60,0xa7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x61,0x70,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x61,0x91,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x62,0x21,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x62,0x21,0x8c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x62,0x44,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x62,0x51,0xa3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x71,0x0b,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x90,0x14,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x90,0x44,0x95,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x90,0x64,0xc9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x90,0x91,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x91,0x21,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x91,0x40,0xe8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x91,0x44,0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x91,0x82,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x91,0x83,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x92,0x11,0xb2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x92,0x21,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x92,0x22,0xb3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x92,0x44,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x01,0x92,0x00,0xdb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x02,0x00,0x10,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x02,0x00,0x23,0xd1,0x00,0x00,0x00,0x00,0xde,0xad,0xbe,0xef}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x02,0x00,0x50,0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x02,0x00,0x51,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x02,0x00,0x53,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x02,0x00,0x53,0xe3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x02,0x00,0x63,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x02,0x00,0x63,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x02,0x00,0x63,0xaf,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x19}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x02,0x00,0x71,0xe3,0x78,0xb4,0xf3,0xff,0xfe,0xad,0xe8,0xcf}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x02,0x01,0x21,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x02,0x01,0x02,0x33,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x03}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x02,0x01,0x03,0xe3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x02,0x01,0x60,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x02,0x01,0x60,0xd5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x02,0x02,0x02,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x02,0x02,0x31,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x02,0x02,0x31,0xe3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x02,0x02,0x31,0xef,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x02,0x02,0x33,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x02,0x02,0x53,0xc3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x02,0x02,0x63,0xf4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x02,0x02,0x72,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x02,0x10,0x22,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x02,0x10,0x24,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x02,0x11,0x14,0xcf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x02,0x11,0x18,0x1b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x02,0x12,0x28,0x9e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x02,0x12,0x33,0xdb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 18333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x00,0xa0,0x11,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x00,0xa0,0x31,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x00,0xa0,0x32,0x8c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x00,0xa0,0x52,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x0c,0x17,0x19,0xb9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x0c,0x17,0x1a,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x0c,0x17,0x1a,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x0c,0x17,0x02,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x0c,0x17,0x04,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x0c,0x17,0x07,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x0c,0x17,0x0b,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x04,0xf8,0x0d,0x16,0x93,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x01,0x06,0x08,0xff,0xff,0xa0,0x09,0x8b,0xf5,0x87,0x9d,0xe5,0x1a,0xf8,0x37}, 8333},
|
|
||||||
{{0x2a,0x01,0x06,0x80,0x00,0x10,0x00,0x10,0xf2,0xde,0xf1,0xff,0xfe,0xc9,0x0d,0xc0}, 8333},
|
|
||||||
{{0x2a,0x01,0x07,0xc8,0xaa,0xac,0x01,0xf6,0x50,0x54,0x00,0xff,0xfe,0x30,0xe5,0x85}, 8333},
|
|
||||||
{{0x2a,0x01,0x07,0xc8,0xaa,0xac,0x02,0x0b,0x50,0x54,0x00,0xff,0xfe,0x24,0x43,0x5e}, 8333},
|
|
||||||
{{0x2a,0x01,0x07,0xc8,0xaa,0xac,0x04,0x3d,0x50,0x54,0x00,0xff,0xfe,0x4e,0x3d,0xd4}, 8333},
|
|
||||||
{{0x2a,0x01,0x07,0xc8,0xaa,0xad,0x02,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x2a,0x01,0x07,0xc8,0xaa,0xb6,0x00,0xea,0x50,0x54,0x00,0xff,0xfe,0xff,0xea,0xc3}, 8333},
|
|
||||||
{{0x2a,0x01,0x07,0xc8,0xaa,0xb9,0x00,0x5a,0x50,0x54,0x00,0xff,0xfe,0x89,0x7b,0x26}, 8333},
|
|
||||||
{{0x2a,0x01,0x07,0xc8,0xaa,0xbc,0x02,0xc8,0x50,0x54,0x00,0xff,0xfe,0x35,0x65,0x81}, 8333},
|
|
||||||
{{0x2a,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x18,0x30,0x1e}, 8333},
|
|
||||||
{{0x2a,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x18,0x39,0x42}, 8333},
|
|
||||||
{{0x2a,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x26,0x8c,0x87}, 8333},
|
|
||||||
{{0x2a,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x50,0x62,0x06}, 8333},
|
|
||||||
{{0x2a,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x67,0x55,0x9d}, 8333},
|
|
||||||
{{0x2a,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x84,0x43,0x4f}, 8333},
|
|
||||||
{{0x2a,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x89,0x11,0x43}, 8333},
|
|
||||||
{{0x2a,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x98,0x25,0x05}, 8333},
|
|
||||||
{{0x2a,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0xdb,0x35,0x2e}, 8333},
|
|
||||||
{{0x2a,0x01,0x7e,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0xc8,0xd7,0xb5}, 8333},
|
|
||||||
{{0x2a,0x01,0x0e,0x34,0xee,0x33,0x16,0x40,0xc5,0x04,0xf6,0x77,0xb2,0x8a,0xba,0x42}, 8333},
|
|
||||||
{{0x2a,0x01,0x0e,0x35,0x2e,0x7e,0x0b,0xc0,0xe0,0x79,0xf5,0x5e,0xce,0xf3,0xb5,0xd7}, 8333},
|
|
||||||
{{0x2a,0x01,0x0e,0x35,0x2e,0xe5,0x06,0x10,0x02,0x1f,0xd0,0xff,0xfe,0x4e,0x74,0x60}, 8333},
|
|
||||||
{{0x2a,0x01,0x0e,0x35,0x8a,0x3f,0x47,0xc0,0xc6,0x17,0xfe,0xff,0xfe,0x3c,0x9f,0xbd}, 8333},
|
|
||||||
{{0x2a,0x01,0x0e,0x35,0x8a,0xca,0x06,0xa0,0x02,0x11,0x0a,0xff,0xfe,0x5e,0x29,0x5e}, 8333},
|
|
||||||
{{0x2a,0x02,0x01,0x80,0x00,0x0a,0x00,0x18,0x00,0x81,0x00,0x07,0x00,0x11,0x00,0x50}, 8333},
|
|
||||||
{{0x2a,0x02,0x18,0x10,0x1d,0x87,0x6a,0x00,0x56,0x04,0xa6,0xff,0xfe,0x60,0xd8,0x7d}, 8333},
|
|
||||||
{{0x2a,0x02,0x21,0x68,0x11,0x44,0x5c,0x01,0xd6,0x3d,0x7e,0xff,0xfe,0xdd,0x4f,0x8e}, 8333},
|
|
||||||
{{0x2a,0x02,0x24,0x98,0x6d,0x7b,0x70,0x01,0xb5,0x08,0xb3,0x9d,0x2c,0xea,0x5b,0x7a}, 8333},
|
|
||||||
{{0x2a,0x02,0x25,0x28,0x05,0x03,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15}, 8333},
|
|
||||||
{{0x2a,0x02,0x25,0x28,0x00,0xfa,0x1a,0x56,0x02,0x16,0x44,0xff,0xfe,0x6a,0xd1,0x12}, 8333},
|
|
||||||
{{0x2a,0x02,0x27,0xf8,0x20,0x12,0x00,0x00,0xe9,0xf7,0x26,0x8f,0xc4,0x41,0x61,0x29}, 8333},
|
|
||||||
{{0x2a,0x02,0x03,0x48,0x00,0x86,0x30,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x2a,0x02,0x47,0x80,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x8a,0x01}, 8333},
|
|
||||||
{{0x2a,0x02,0x05,0x78,0x50,0x02,0x01,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x02,0x60,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x19,0x0b,0x69,0xe3}, 8333},
|
|
||||||
{{0x2a,0x02,0x60,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xe8,0x93,0xd9,0xd6}, 8333},
|
|
||||||
{{0x2a,0x02,0x07,0x70,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x39}, 8333},
|
|
||||||
{{0x2a,0x02,0x7a,0xa0,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xde,0xb3,0x81,0xa2}, 8333},
|
|
||||||
{{0x2a,0x02,0x80,0x10,0xb0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x60,0x59,0xb5}, 8333},
|
|
||||||
{{0x2a,0x02,0x81,0x0d,0x21,0xc0,0x0f,0x00,0xa2,0x48,0x1c,0xff,0xfe,0xb8,0x53,0x48}, 8333},
|
|
||||||
{{0x2a,0x02,0x0a,0x50,0x00,0x00,0x00,0x00,0x02,0x1b,0x24,0xff,0xfe,0x93,0x4e,0x39}, 8333},
|
|
||||||
{{0x2a,0x02,0x0a,0x80,0x00,0x00,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x02,0xc2,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x01,0x58,0x30,0x00,0x01}, 8333},
|
|
||||||
{{0x2a,0x02,0xc2,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x05,0x46,0x92,0x00,0x01}, 8333},
|
|
||||||
{{0x2a,0x02,0xc2,0x00,0x00,0x00,0x00,0x10,0x00,0x03,0x00,0x00,0x71,0x58,0x00,0x01}, 8333},
|
|
||||||
{{0x2a,0x02,0xc2,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x22,0x44,0x00,0x01}, 8333},
|
|
||||||
{{0x2a,0x02,0xc2,0x00,0x00,0x01,0x00,0x10,0x00,0x02,0x00,0x03,0x33,0x39,0x00,0x01}, 8333},
|
|
||||||
{{0x2a,0x02,0xc2,0x00,0x00,0x01,0x00,0x10,0x00,0x02,0x00,0x03,0x78,0x44,0x00,0x01}, 8333},
|
|
||||||
{{0x2a,0x02,0xc2,0x00,0x00,0x01,0x00,0x10,0x00,0x02,0x00,0x05,0x62,0x88,0x00,0x01}, 8333},
|
|
||||||
{{0x2a,0x02,0xc2,0x00,0x00,0x01,0x00,0x10,0x00,0x03,0x00,0x00,0x59,0x12,0x00,0x01}, 8333},
|
|
||||||
{{0x2a,0x03,0x40,0x00,0x00,0x02,0x04,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08}, 8333},
|
|
||||||
{{0x2a,0x03,0x40,0x00,0x00,0x06,0x80,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
|
|
||||||
{{0x2a,0x03,0x40,0x00,0x00,0x06,0x80,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0xd0}, 8333},
|
|
||||||
{{0x2a,0x03,0x49,0x00,0xff,0xfc,0x00,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
|
|
||||||
{{0x2a,0x03,0xb0,0xc0,0x00,0x01,0x00,0xd0,0x00,0x00,0x00,0x00,0x00,0x0d,0x50,0x01}, 8333},
|
|
||||||
{{0x2a,0x03,0x0f,0x80,0xed,0x15,0x01,0x49,0x01,0x54,0x01,0x55,0x02,0x35,0x00,0x01}, 8333},
|
|
||||||
{{0x2a,0x03,0x0f,0x80,0xed,0x15,0x01,0x49,0x01,0x54,0x01,0x55,0x02,0x41,0x00,0x01}, 8333},
|
|
||||||
{{0x2a,0x03,0x0f,0x80,0xed,0x16,0x0c,0xa7,0xea,0x75,0xb1,0x2d,0x02,0xaf,0x9e,0x2a}, 8333},
|
|
||||||
{{0x2a,0x04,0x19,0x80,0x31,0x00,0x1a,0xab,0x02,0x90,0xfa,0xff,0xfe,0x70,0xa3,0xd8}, 8333},
|
|
||||||
{{0x2a,0x04,0x19,0x80,0x31,0x00,0x1a,0xab,0xe6,0x1d,0x2d,0xff,0xfe,0x29,0xf5,0x90}, 8333},
|
|
||||||
{{0x2a,0x04,0x2f,0x80,0x00,0x06,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89}, 8333},
|
|
||||||
{{0x2a,0x04,0xac,0x00,0x00,0x01,0x4a,0x0b,0x50,0x54,0x00,0xff,0xfe,0x00,0x5a,0xf5}, 8333},
|
|
||||||
{{0x2a,0x04,0xad,0x80,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0xda}, 8333},
|
|
||||||
{{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xd9,0x4a,0xaf,0xa2,0x8c,0x9d,0xf6,0x22,0x18,0x28}, 8333},
|
|
||||||
{{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xdb,0x58,0x10,0x81,0x48,0x69,0x2c,0xb3,0x0d,0x6d}, 8333},
|
|
||||||
{{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xe2,0x7f,0xf3,0x20,0xef,0x72,0xaf,0x4d,0x29,0x3c}, 8333},
|
|
||||||
{{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xef,0x3c,0x49,0x0b,0xc1,0x74,0xc2,0x92,0x86,0xe1}, 8333},
|
|
||||||
{{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xe8,0x27,0xf9,0x43,0xad,0x67,0xfd,0x74,0x25,0x43}, 8333},
|
|
||||||
{{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xff,0xd9,0x7d,0x26,0x57,0x03,0xb0,0x49,0x67,0x4f}, 8333},
|
|
||||||
{{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xf9,0xbe,0x9e,0xf0,0x33,0x40,0x2e,0x79,0xc9,0x18}, 8333},
|
|
||||||
{{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x07,0x9c,0x11,0x9b,0x2d,0xf7,0xd7,0xf2,0x5e,0x9b}, 8333},
|
|
||||||
{{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x00,0x7d,0xc3,0xfd,0xcb,0x7a,0xff,0x07,0xdc,0x48}, 8333},
|
|
||||||
{{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x03,0x34,0x0e,0x44,0x07,0x5c,0xcb,0x4b,0xe7,0xcb}, 8333},
|
|
||||||
{{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x06,0x69,0x75,0xcb,0x88,0x3c,0x63,0xa6,0x11,0xff}, 8333},
|
|
||||||
{{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x0a,0x26,0x27,0x21,0xbf,0x0a,0x38,0xe7,0xfe,0xc1}, 8333},
|
|
||||||
{{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x0a,0x26,0x27,0x21,0xae,0x94,0xd5,0xc2,0x72,0x24}, 8333},
|
|
||||||
{{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x0a,0xbf,0x87,0xf8,0x8f,0x6b,0x04,0xb5,0xc3,0xfa}, 8333},
|
|
||||||
{{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x0b,0x29,0x34,0x96,0x29,0xe8,0x67,0x22,0x0c,0x61}, 8333},
|
|
||||||
{{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x11,0x08,0x94,0x72,0x0f,0x2c,0xb6,0xc9,0x6f,0x22}, 8333},
|
|
||||||
{{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x12,0xc9,0x76,0x66,0x08,0x77,0xf0,0x71,0x81,0xdc}, 8333},
|
|
||||||
{{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x30,0x7b,0x87,0xc2,0x7e,0xd8,0xe9,0xbb,0x14,0xed}, 8333},
|
|
||||||
{{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x3e,0xaa,0xb7,0xd0,0x79,0x79,0xf3,0x0b,0xd2,0x63}, 8333},
|
|
||||||
{{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x6f,0x34,0x7f,0xc7,0xce,0xa3,0x04,0x59,0x06,0x32}, 4176},
|
|
||||||
{{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x68,0xac,0xad,0xae,0x93,0x23,0x0a,0x51,0x3c,0x5c}, 8333},
|
|
||||||
{{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x72,0x87,0x94,0x82,0x36,0x22,0x83,0x23,0xb5,0xc5}, 8333},
|
|
||||||
{{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x7a,0x4c,0x71,0x22,0xb9,0x53,0x89,0x19,0x12,0x43}, 8333},
|
|
||||||
{{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x8d,0xbe,0xe1,0x25,0x73,0x45,0xf5,0xe6,0x10,0xad}, 8333},
|
|
||||||
{{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xa5,0xa5,0xf4,0x4c,0x8f,0xfb,0xb7,0x84,0x36,0xee}, 8333},
|
|
||||||
{{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xaa,0xb7,0x04,0x8c,0x87,0xc6,0x38,0x3b,0x0a,0xf6}, 8333},
|
|
||||||
{{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xac,0x1f,0x82,0x69,0x5d,0x88,0xa1,0x54,0xf5,0x90}, 8333},
|
|
||||||
{{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xb3,0xd1,0xf8,0xbe,0xa7,0x6b,0x46,0xbe,0xe8,0x84}, 8333}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static SeedSpec6 pnSeed6_test[] = {
|
static SeedSpec6 pnSeed6_test[] = {
|
||||||
{{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x99,0xcb,0x26,0x31,0xba,0x48,0x51,0x31,0x39,0x0d}, 18333},
|
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9f,0xcb,0x9a,0xdb}, 19246}
|
||||||
{{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x44,0xf4,0xf4,0xf0,0xbf,0xf7,0x7e,0x6d,0xc4,0xe8}, 18333},
|
|
||||||
{{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x6a,0x8b,0xd2,0x78,0x3f,0x7a,0xf8,0x92,0x8f,0x80}, 18333},
|
|
||||||
{{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xe6,0x4e,0xa4,0x47,0x4e,0x2a,0xfe,0xe8,0x95,0xcc}, 18333},
|
|
||||||
{{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x9f,0xae,0x9f,0x59,0x0b,0x3f,0x31,0x3a,0x8a,0x5f}, 18333},
|
|
||||||
{{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x47,0xb1,0xe4,0x55,0xd1,0xb0,0x14,0x3f,0xb6,0xdb}, 18333},
|
|
||||||
{{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xa0,0x60,0x9e,0x46,0x54,0xdb,0x61,0x3b,0xb2,0x6f}, 18333}
|
|
||||||
};
|
};
|
||||||
#endif // BITCOIN_CHAINPARAMSSEEDS_H
|
#endif // BITCOIN_CHAINPARAMSSEEDS_H
|
||||||
|
|
2733
src/claimtrie.cpp
Normal file
631
src/claimtrie.h
Normal file
|
@ -0,0 +1,631 @@
|
||||||
|
#ifndef BITCOIN_CLAIMTRIE_H
|
||||||
|
#define BITCOIN_CLAIMTRIE_H
|
||||||
|
|
||||||
|
#include "amount.h"
|
||||||
|
#include "serialize.h"
|
||||||
|
#include "uint256.h"
|
||||||
|
#include "util.h"
|
||||||
|
#include "dbwrapper.h"
|
||||||
|
#include "chainparams.h"
|
||||||
|
#include "primitives/transaction.h"
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
// leveldb keys
|
||||||
|
#define HASH_BLOCK 'h'
|
||||||
|
#define CURRENT_HEIGHT 't'
|
||||||
|
#define TRIE_NODE 'n'
|
||||||
|
#define CLAIM_BY_ID 'i'
|
||||||
|
#define CLAIM_QUEUE_ROW 'r'
|
||||||
|
#define CLAIM_QUEUE_NAME_ROW 'm'
|
||||||
|
#define EXP_QUEUE_ROW 'e'
|
||||||
|
#define SUPPORT 's'
|
||||||
|
#define SUPPORT_QUEUE_ROW 'u'
|
||||||
|
#define SUPPORT_QUEUE_NAME_ROW 'p'
|
||||||
|
#define SUPPORT_EXP_QUEUE_ROW 'x'
|
||||||
|
|
||||||
|
uint256 getValueHash(COutPoint outPoint, int nHeightOfLastTakeover);
|
||||||
|
|
||||||
|
class CClaimValue
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
COutPoint outPoint;
|
||||||
|
uint160 claimId;
|
||||||
|
CAmount nAmount;
|
||||||
|
CAmount nEffectiveAmount;
|
||||||
|
int nHeight;
|
||||||
|
int nValidAtHeight;
|
||||||
|
|
||||||
|
CClaimValue() {};
|
||||||
|
|
||||||
|
CClaimValue(COutPoint outPoint, uint160 claimId, CAmount nAmount, int nHeight,
|
||||||
|
int nValidAtHeight)
|
||||||
|
: outPoint(outPoint), claimId(claimId)
|
||||||
|
, nAmount(nAmount), nEffectiveAmount(nAmount)
|
||||||
|
, nHeight(nHeight), nValidAtHeight(nValidAtHeight)
|
||||||
|
{}
|
||||||
|
|
||||||
|
ADD_SERIALIZE_METHODS;
|
||||||
|
|
||||||
|
template <typename Stream, typename Operation>
|
||||||
|
inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
|
||||||
|
READWRITE(outPoint);
|
||||||
|
READWRITE(claimId);
|
||||||
|
READWRITE(nAmount);
|
||||||
|
READWRITE(nHeight);
|
||||||
|
READWRITE(nValidAtHeight);
|
||||||
|
READWRITE(nEffectiveAmount);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator<(const CClaimValue& other) const
|
||||||
|
{
|
||||||
|
if (nEffectiveAmount < other.nEffectiveAmount)
|
||||||
|
return true;
|
||||||
|
else if (nEffectiveAmount == other.nEffectiveAmount)
|
||||||
|
{
|
||||||
|
if (nHeight > other.nHeight)
|
||||||
|
return true;
|
||||||
|
else if (nHeight == other.nHeight)
|
||||||
|
{
|
||||||
|
if (outPoint != other.outPoint && !(outPoint < other.outPoint))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator==(const CClaimValue& other) const
|
||||||
|
{
|
||||||
|
return outPoint == other.outPoint && claimId == other.claimId && nAmount == other.nAmount && nHeight == other.nHeight && nValidAtHeight == other.nValidAtHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator!=(const CClaimValue& other) const
|
||||||
|
{
|
||||||
|
return !(*this == other);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class CSupportValue
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
COutPoint outPoint;
|
||||||
|
uint160 supportedClaimId;
|
||||||
|
CAmount nAmount;
|
||||||
|
int nHeight;
|
||||||
|
int nValidAtHeight;
|
||||||
|
|
||||||
|
CSupportValue() {};
|
||||||
|
CSupportValue(COutPoint outPoint, uint160 supportedClaimId,
|
||||||
|
CAmount nAmount, int nHeight, int nValidAtHeight)
|
||||||
|
: outPoint(outPoint), supportedClaimId(supportedClaimId)
|
||||||
|
, nAmount(nAmount), nHeight(nHeight)
|
||||||
|
, nValidAtHeight(nValidAtHeight)
|
||||||
|
{}
|
||||||
|
|
||||||
|
ADD_SERIALIZE_METHODS;
|
||||||
|
|
||||||
|
template <typename Stream, typename Operation>
|
||||||
|
inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
|
||||||
|
READWRITE(outPoint);
|
||||||
|
READWRITE(supportedClaimId);
|
||||||
|
READWRITE(nAmount);
|
||||||
|
READWRITE(nHeight);
|
||||||
|
READWRITE(nValidAtHeight);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator==(const CSupportValue& other) const
|
||||||
|
{
|
||||||
|
return outPoint == other.outPoint && supportedClaimId == other.supportedClaimId && nAmount == other.nAmount && nHeight == other.nHeight && nValidAtHeight == other.nValidAtHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator!=(const CSupportValue& other) const
|
||||||
|
{
|
||||||
|
return !(*this == other);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class CClaimTrieNode;
|
||||||
|
class CClaimTrie;
|
||||||
|
|
||||||
|
typedef std::vector<CSupportValue> supportMapEntryType;
|
||||||
|
|
||||||
|
typedef std::map<unsigned char, CClaimTrieNode*> nodeMapType;
|
||||||
|
|
||||||
|
typedef std::pair<std::string, CClaimTrieNode> namedNodeType;
|
||||||
|
|
||||||
|
class CClaimTrieNode
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CClaimTrieNode() : nHeightOfLastTakeover(0) {}
|
||||||
|
CClaimTrieNode(uint256 hash) : hash(hash), nHeightOfLastTakeover(0) {}
|
||||||
|
uint256 hash;
|
||||||
|
nodeMapType children;
|
||||||
|
int nHeightOfLastTakeover;
|
||||||
|
std::vector<CClaimValue> claims;
|
||||||
|
|
||||||
|
bool insertClaim(CClaimValue claim);
|
||||||
|
bool removeClaim(const COutPoint& outPoint, CClaimValue& claim);
|
||||||
|
bool getBestClaim(CClaimValue& claim) const;
|
||||||
|
bool empty() const {return children.empty() && claims.empty();}
|
||||||
|
bool haveClaim(const COutPoint& outPoint) const;
|
||||||
|
void reorderClaims(supportMapEntryType& supports);
|
||||||
|
|
||||||
|
ADD_SERIALIZE_METHODS;
|
||||||
|
|
||||||
|
template <typename Stream, typename Operation>
|
||||||
|
inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
|
||||||
|
READWRITE(hash);
|
||||||
|
READWRITE(claims);
|
||||||
|
READWRITE(nHeightOfLastTakeover);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator==(const CClaimTrieNode& other) const
|
||||||
|
{
|
||||||
|
return hash == other.hash && claims == other.claims;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator!=(const CClaimTrieNode& other) const
|
||||||
|
{
|
||||||
|
return !(*this == other);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct nodenamecompare
|
||||||
|
{
|
||||||
|
bool operator() (const std::string& i, const std::string& j) const
|
||||||
|
{
|
||||||
|
if (i.size() == j.size())
|
||||||
|
return i < j;
|
||||||
|
return i.size() < j.size();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct outPointHeightType
|
||||||
|
{
|
||||||
|
COutPoint outPoint;
|
||||||
|
int nHeight;
|
||||||
|
|
||||||
|
outPointHeightType() {}
|
||||||
|
|
||||||
|
outPointHeightType(COutPoint outPoint, int nHeight)
|
||||||
|
: outPoint(outPoint), nHeight(nHeight) {}
|
||||||
|
|
||||||
|
ADD_SERIALIZE_METHODS;
|
||||||
|
|
||||||
|
template <typename Stream, typename Operation>
|
||||||
|
inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion)
|
||||||
|
{
|
||||||
|
READWRITE(outPoint);
|
||||||
|
READWRITE(nHeight);
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
struct nameOutPointHeightType
|
||||||
|
{
|
||||||
|
std::string name;
|
||||||
|
COutPoint outPoint;
|
||||||
|
int nHeight;
|
||||||
|
|
||||||
|
nameOutPointHeightType() {}
|
||||||
|
|
||||||
|
nameOutPointHeightType(std::string name, COutPoint outPoint, int nHeight)
|
||||||
|
: name(name), outPoint(outPoint), nHeight(nHeight) {}
|
||||||
|
|
||||||
|
ADD_SERIALIZE_METHODS;
|
||||||
|
|
||||||
|
template <typename Stream, typename Operation>
|
||||||
|
inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion)
|
||||||
|
{
|
||||||
|
READWRITE(name);
|
||||||
|
READWRITE(outPoint);
|
||||||
|
READWRITE(nHeight);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct nameOutPointType
|
||||||
|
{
|
||||||
|
std::string name;
|
||||||
|
COutPoint outPoint;
|
||||||
|
|
||||||
|
nameOutPointType() {}
|
||||||
|
|
||||||
|
nameOutPointType(std::string name, COutPoint outPoint)
|
||||||
|
: name(name), outPoint(outPoint) {}
|
||||||
|
|
||||||
|
ADD_SERIALIZE_METHODS;
|
||||||
|
|
||||||
|
template <typename Stream, typename Operation>
|
||||||
|
inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion)
|
||||||
|
{
|
||||||
|
READWRITE(name);
|
||||||
|
READWRITE(outPoint);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class CClaimIndexElement
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ADD_SERIALIZE_METHODS;
|
||||||
|
|
||||||
|
template <typename Stream, typename Operation>
|
||||||
|
inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
|
||||||
|
READWRITE(name);
|
||||||
|
READWRITE(claim);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string name;
|
||||||
|
CClaimValue claim;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef std::pair<std::string, CClaimValue> claimQueueEntryType;
|
||||||
|
|
||||||
|
typedef std::pair<std::string, CSupportValue> supportQueueEntryType;
|
||||||
|
|
||||||
|
typedef std::map<std::string, supportMapEntryType> supportMapType;
|
||||||
|
|
||||||
|
typedef std::vector<outPointHeightType> queueNameRowType;
|
||||||
|
typedef std::map<std::string, queueNameRowType> queueNameType;
|
||||||
|
|
||||||
|
typedef std::vector<nameOutPointHeightType> insertUndoType;
|
||||||
|
|
||||||
|
typedef std::vector<nameOutPointType> expirationQueueRowType;
|
||||||
|
typedef std::map<int, expirationQueueRowType> expirationQueueType;
|
||||||
|
|
||||||
|
typedef std::vector<claimQueueEntryType> claimQueueRowType;
|
||||||
|
typedef std::map<int, claimQueueRowType> claimQueueType;
|
||||||
|
|
||||||
|
typedef std::vector<supportQueueEntryType> supportQueueRowType;
|
||||||
|
typedef std::map<int, supportQueueRowType> supportQueueType;
|
||||||
|
|
||||||
|
typedef std::map<std::string, CClaimTrieNode*, nodenamecompare> nodeCacheType;
|
||||||
|
|
||||||
|
typedef std::map<std::string, uint256> hashMapType;
|
||||||
|
|
||||||
|
typedef std::set<CClaimValue> claimIndexClaimListType;
|
||||||
|
typedef std::vector<CClaimIndexElement> claimIndexElementListType;
|
||||||
|
|
||||||
|
struct claimsForNameType
|
||||||
|
{
|
||||||
|
std::vector<CClaimValue> claims;
|
||||||
|
std::vector<CSupportValue> supports;
|
||||||
|
int nLastTakeoverHeight;
|
||||||
|
|
||||||
|
claimsForNameType(std::vector<CClaimValue> claims, std::vector<CSupportValue> supports, int nLastTakeoverHeight)
|
||||||
|
: claims(claims), supports(supports), nLastTakeoverHeight(nLastTakeoverHeight) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
class CClaimTrieCache;
|
||||||
|
|
||||||
|
class CClaimTrie
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CClaimTrie(bool fMemory = false, bool fWipe = false, int nProportionalDelayFactor = 32)
|
||||||
|
: db(GetDataDir() / "claimtrie", 100, fMemory, fWipe, false)
|
||||||
|
, nCurrentHeight(0), nExpirationTime(Params().GetConsensus().nOriginalClaimExpirationTime)
|
||||||
|
, nProportionalDelayFactor(nProportionalDelayFactor)
|
||||||
|
, root(uint256S("0000000000000000000000000000000000000000000000000000000000000001"))
|
||||||
|
{}
|
||||||
|
|
||||||
|
uint256 getMerkleHash();
|
||||||
|
|
||||||
|
bool empty() const;
|
||||||
|
void clear();
|
||||||
|
|
||||||
|
bool checkConsistency() const;
|
||||||
|
|
||||||
|
bool WriteToDisk();
|
||||||
|
bool ReadFromDisk(bool check = false);
|
||||||
|
|
||||||
|
std::vector<namedNodeType> flattenTrie() const;
|
||||||
|
bool getInfoForName(const std::string& name, CClaimValue& claim) const;
|
||||||
|
bool getLastTakeoverForName(const std::string& name, int& lastTakeoverHeight) const;
|
||||||
|
|
||||||
|
claimsForNameType getClaimsForName(const std::string& name) const;
|
||||||
|
CAmount getEffectiveAmountForClaim(const std::string& name, uint160 claimId) const;
|
||||||
|
CAmount getEffectiveAmountForClaimWithSupports(const std::string& name, uint160 claimId,
|
||||||
|
std::vector<CSupportValue>& supports) const;
|
||||||
|
|
||||||
|
bool queueEmpty() const;
|
||||||
|
bool supportEmpty() const;
|
||||||
|
bool supportQueueEmpty() const;
|
||||||
|
bool expirationQueueEmpty() const;
|
||||||
|
bool supportExpirationQueueEmpty() const;
|
||||||
|
|
||||||
|
void setExpirationTime(int t);
|
||||||
|
|
||||||
|
void addToClaimIndex(const std::string& name, const CClaimValue& claim);
|
||||||
|
void removeFromClaimIndex(const CClaimValue& claim);
|
||||||
|
|
||||||
|
bool getClaimById(const uint160 claimId, std::string& name, CClaimValue& claim) const;
|
||||||
|
bool getQueueRow(int nHeight, claimQueueRowType& row) const;
|
||||||
|
bool getQueueNameRow(const std::string& name, queueNameRowType& row) const;
|
||||||
|
bool getExpirationQueueRow(int nHeight, expirationQueueRowType& row) const;
|
||||||
|
bool getSupportNode(std::string name, supportMapEntryType& node) const;
|
||||||
|
bool getSupportQueueRow(int nHeight, supportQueueRowType& row) const;
|
||||||
|
bool getSupportQueueNameRow(const std::string& name, queueNameRowType& row) const;
|
||||||
|
bool getSupportExpirationQueueRow(int nHeight, expirationQueueRowType& row) const;
|
||||||
|
|
||||||
|
|
||||||
|
bool haveClaim(const std::string& name, const COutPoint& outPoint) const;
|
||||||
|
bool haveClaimInQueue(const std::string& name, const COutPoint& outPoint,
|
||||||
|
int& nValidAtHeight) const;
|
||||||
|
|
||||||
|
bool haveSupport(const std::string& name, const COutPoint& outPoint) const;
|
||||||
|
bool haveSupportInQueue(const std::string& name, const COutPoint& outPoint,
|
||||||
|
int& nValidAtHeight) const;
|
||||||
|
|
||||||
|
unsigned int getTotalNamesInTrie() const;
|
||||||
|
unsigned int getTotalClaimsInTrie() const;
|
||||||
|
CAmount getTotalValueOfClaimsInTrie(bool fControllingOnly) const;
|
||||||
|
|
||||||
|
friend class CClaimTrieCache;
|
||||||
|
|
||||||
|
CDBWrapper db;
|
||||||
|
int nCurrentHeight;
|
||||||
|
int nExpirationTime;
|
||||||
|
int nProportionalDelayFactor;
|
||||||
|
private:
|
||||||
|
void clear(CClaimTrieNode* current);
|
||||||
|
|
||||||
|
const CClaimTrieNode* getNodeForName(const std::string& name) const;
|
||||||
|
|
||||||
|
bool update(nodeCacheType& cache, hashMapType& hashes,
|
||||||
|
std::map<std::string, int>& takeoverHeights,
|
||||||
|
const uint256& hashBlock, claimQueueType& queueCache,
|
||||||
|
queueNameType& queueNameCache,
|
||||||
|
expirationQueueType& expirationQueueCache, int nNewHeight,
|
||||||
|
supportMapType& supportCache,
|
||||||
|
supportQueueType& supportQueueCache,
|
||||||
|
queueNameType& supportQueueNameCache,
|
||||||
|
expirationQueueType& supportExpirationQueueCache);
|
||||||
|
bool updateName(const std::string& name, CClaimTrieNode* updatedNode);
|
||||||
|
bool updateHash(const std::string& name, uint256& hash);
|
||||||
|
bool updateTakeoverHeight(const std::string& name, int nTakeoverHeight);
|
||||||
|
bool recursiveNullify(CClaimTrieNode* node, std::string& name);
|
||||||
|
|
||||||
|
bool recursiveCheckConsistency(const CClaimTrieNode* node) const;
|
||||||
|
|
||||||
|
bool InsertFromDisk(const std::string& name, CClaimTrieNode* node);
|
||||||
|
|
||||||
|
unsigned int getTotalNamesRecursive(const CClaimTrieNode* current) const;
|
||||||
|
unsigned int getTotalClaimsRecursive(const CClaimTrieNode* current) const;
|
||||||
|
CAmount getTotalValueOfClaimsRecursive(const CClaimTrieNode* current,
|
||||||
|
bool fControllingOnly) const;
|
||||||
|
bool recursiveFlattenTrie(const std::string& name,
|
||||||
|
const CClaimTrieNode* current,
|
||||||
|
std::vector<namedNodeType>& nodes) const;
|
||||||
|
|
||||||
|
void markNodeDirty(const std::string& name, CClaimTrieNode* node);
|
||||||
|
void updateQueueRow(int nHeight, claimQueueRowType& row);
|
||||||
|
void updateQueueNameRow(const std::string& name,
|
||||||
|
queueNameRowType& row);
|
||||||
|
void updateExpirationRow(int nHeight, expirationQueueRowType& row);
|
||||||
|
void updateSupportMap(const std::string& name, supportMapEntryType& node);
|
||||||
|
void updateSupportQueue(int nHeight, supportQueueRowType& row);
|
||||||
|
void updateSupportNameQueue(const std::string& name,
|
||||||
|
queueNameRowType& row);
|
||||||
|
void updateSupportExpirationQueue(int nHeight, expirationQueueRowType& row);
|
||||||
|
|
||||||
|
void BatchWriteNode(CDBBatch& batch, const std::string& name,
|
||||||
|
const CClaimTrieNode* pNode) const;
|
||||||
|
void BatchEraseNode(CDBBatch& batch, const std::string& nome) const;
|
||||||
|
void BatchWriteClaimIndex(CDBBatch& batch) const;
|
||||||
|
void BatchWriteQueueRows(CDBBatch& batch);
|
||||||
|
void BatchWriteQueueNameRows(CDBBatch& batch);
|
||||||
|
void BatchWriteExpirationQueueRows(CDBBatch& batch);
|
||||||
|
void BatchWriteSupportNodes(CDBBatch& batch);
|
||||||
|
void BatchWriteSupportQueueRows(CDBBatch& batch);
|
||||||
|
void BatchWriteSupportQueueNameRows(CDBBatch& batch);
|
||||||
|
void BatchWriteSupportExpirationQueueRows(CDBBatch& batch);
|
||||||
|
template<typename K> bool keyTypeEmpty(char key, K& dummy) const;
|
||||||
|
|
||||||
|
CClaimTrieNode root;
|
||||||
|
uint256 hashBlock;
|
||||||
|
|
||||||
|
claimQueueType dirtyQueueRows;
|
||||||
|
queueNameType dirtyQueueNameRows;
|
||||||
|
expirationQueueType dirtyExpirationQueueRows;
|
||||||
|
|
||||||
|
supportQueueType dirtySupportQueueRows;
|
||||||
|
queueNameType dirtySupportQueueNameRows;
|
||||||
|
expirationQueueType dirtySupportExpirationQueueRows;
|
||||||
|
|
||||||
|
nodeCacheType dirtyNodes;
|
||||||
|
supportMapType dirtySupportNodes;
|
||||||
|
};
|
||||||
|
|
||||||
|
class CClaimTrieProofNode
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CClaimTrieProofNode() {};
|
||||||
|
CClaimTrieProofNode(std::vector<std::pair<unsigned char, uint256> > children,
|
||||||
|
bool hasValue, uint256 valHash)
|
||||||
|
: children(children), hasValue(hasValue), valHash(valHash)
|
||||||
|
{};
|
||||||
|
std::vector<std::pair<unsigned char, uint256> > children;
|
||||||
|
bool hasValue;
|
||||||
|
uint256 valHash;
|
||||||
|
};
|
||||||
|
|
||||||
|
class CClaimTrieProof
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CClaimTrieProof() {};
|
||||||
|
CClaimTrieProof(std::vector<CClaimTrieProofNode> nodes, bool hasValue, COutPoint outPoint, int nHeightOfLastTakeover) : nodes(nodes), hasValue(hasValue), outPoint(outPoint), nHeightOfLastTakeover(nHeightOfLastTakeover) {}
|
||||||
|
std::vector<CClaimTrieProofNode> nodes;
|
||||||
|
bool hasValue;
|
||||||
|
COutPoint outPoint;
|
||||||
|
int nHeightOfLastTakeover;
|
||||||
|
};
|
||||||
|
|
||||||
|
class CClaimTrieCache
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CClaimTrieCache(CClaimTrie* base, bool fRequireTakeoverHeights = true)
|
||||||
|
: base(base),
|
||||||
|
fRequireTakeoverHeights(fRequireTakeoverHeights)
|
||||||
|
{
|
||||||
|
assert(base);
|
||||||
|
nCurrentHeight = base->nCurrentHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint256 getMerkleHash() const;
|
||||||
|
|
||||||
|
bool empty() const;
|
||||||
|
bool flush();
|
||||||
|
bool dirty() const { return !dirtyHashes.empty(); }
|
||||||
|
|
||||||
|
bool addClaim(const std::string& name, const COutPoint& outPoint,
|
||||||
|
uint160 claimId, CAmount nAmount, int nHeight) const;
|
||||||
|
bool undoAddClaim(const std::string& name, const COutPoint& outPoint,
|
||||||
|
int nHeight) const;
|
||||||
|
bool spendClaim(const std::string& name, const COutPoint& outPoint,
|
||||||
|
int nHeight, int& nValidAtHeight) const;
|
||||||
|
bool undoSpendClaim(const std::string& name, const COutPoint& outPoint,
|
||||||
|
uint160 claimId, CAmount nAmount, int nHeight,
|
||||||
|
int nValidAtHeight) const;
|
||||||
|
|
||||||
|
bool addSupport(const std::string& name, const COutPoint& outPoint,
|
||||||
|
CAmount nAmount, uint160 supportedClaimId,
|
||||||
|
int nHeight) const;
|
||||||
|
bool undoAddSupport(const std::string& name, const COutPoint& outPoint,
|
||||||
|
int nHeight) const;
|
||||||
|
bool spendSupport(const std::string& name, const COutPoint& outPoint,
|
||||||
|
int nHeight, int& nValidAtHeight) const;
|
||||||
|
bool undoSpendSupport(const std::string& name, const COutPoint& outPoint,
|
||||||
|
uint160 supportedClaimId, CAmount nAmount,
|
||||||
|
int nHeight, int nValidAtHeight) const;
|
||||||
|
|
||||||
|
uint256 getBestBlock();
|
||||||
|
void setBestBlock(const uint256& hashBlock);
|
||||||
|
|
||||||
|
bool incrementBlock(insertUndoType& insertUndo,
|
||||||
|
claimQueueRowType& expireUndo,
|
||||||
|
insertUndoType& insertSupportUndo,
|
||||||
|
supportQueueRowType& expireSupportUndo,
|
||||||
|
std::vector<std::pair<std::string, int> >& takeoverHeightUndo) const;
|
||||||
|
bool decrementBlock(insertUndoType& insertUndo,
|
||||||
|
claimQueueRowType& expireUndo,
|
||||||
|
insertUndoType& insertSupportUndo,
|
||||||
|
supportQueueRowType& expireSupportUndo,
|
||||||
|
std::vector<std::pair<std::string, int> >& takeoverHeightUndo) const;
|
||||||
|
|
||||||
|
~CClaimTrieCache() { clear(); }
|
||||||
|
|
||||||
|
bool insertClaimIntoTrie(const std::string& name, CClaimValue claim,
|
||||||
|
bool fCheckTakeover = false) const;
|
||||||
|
bool removeClaimFromTrie(const std::string& name, const COutPoint& outPoint,
|
||||||
|
CClaimValue& claim,
|
||||||
|
bool fCheckTakeover = false) const;
|
||||||
|
CClaimTrieProof getProofForName(const std::string& name) const;
|
||||||
|
|
||||||
|
bool finalizeDecrement() const;
|
||||||
|
|
||||||
|
void removeAndAddSupportToExpirationQueue(expirationQueueRowType &row, int height, bool increment) const;
|
||||||
|
void removeAndAddToExpirationQueue(expirationQueueRowType &row, int height, bool increment) const;
|
||||||
|
|
||||||
|
bool forkForExpirationChange(bool increment) const;
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
CClaimTrie* base;
|
||||||
|
|
||||||
|
bool fRequireTakeoverHeights;
|
||||||
|
|
||||||
|
mutable nodeCacheType cache;
|
||||||
|
mutable nodeCacheType block_originals;
|
||||||
|
mutable std::set<std::string> dirtyHashes;
|
||||||
|
mutable hashMapType cacheHashes;
|
||||||
|
mutable claimQueueType claimQueueCache;
|
||||||
|
mutable queueNameType claimQueueNameCache;
|
||||||
|
mutable expirationQueueType expirationQueueCache;
|
||||||
|
mutable supportMapType supportCache;
|
||||||
|
mutable supportQueueType supportQueueCache;
|
||||||
|
mutable queueNameType supportQueueNameCache;
|
||||||
|
mutable expirationQueueType supportExpirationQueueCache;
|
||||||
|
mutable std::set<std::string> namesToCheckForTakeover;
|
||||||
|
mutable std::map<std::string, int> cacheTakeoverHeights;
|
||||||
|
mutable int nCurrentHeight; // Height of the block that is being worked on, which is
|
||||||
|
// one greater than the height of the chain's tip
|
||||||
|
mutable claimIndexElementListType claimsToAdd;
|
||||||
|
mutable claimIndexClaimListType claimsToDelete;
|
||||||
|
|
||||||
|
uint256 hashBlock;
|
||||||
|
|
||||||
|
uint256 computeHash() const;
|
||||||
|
|
||||||
|
bool reorderTrieNode(const std::string& name, bool fCheckTakeover) const;
|
||||||
|
bool recursiveComputeMerkleHash(CClaimTrieNode* tnCurrent,
|
||||||
|
std::string sPos) const;
|
||||||
|
bool recursivePruneName(CClaimTrieNode* tnCurrent, unsigned int nPos,
|
||||||
|
std::string sName,
|
||||||
|
bool* pfNullified = NULL) const;
|
||||||
|
|
||||||
|
bool clear() const;
|
||||||
|
|
||||||
|
bool removeClaim(const std::string& name, const COutPoint& outPoint,
|
||||||
|
int nHeight, int& nValidAtHeight, bool fCheckTakeover) const;
|
||||||
|
|
||||||
|
bool addClaimToQueues(const std::string& name, CClaimValue& claim) const;
|
||||||
|
bool removeClaimFromQueue(const std::string& name, const COutPoint& outPoint,
|
||||||
|
CClaimValue& claim) const;
|
||||||
|
void addToExpirationQueue(int nExpirationHeight, nameOutPointType& entry) const;
|
||||||
|
void removeFromExpirationQueue(const std::string& name, const COutPoint& outPoint,
|
||||||
|
int nHeight) const;
|
||||||
|
|
||||||
|
claimQueueType::iterator getQueueCacheRow(int nHeight,
|
||||||
|
bool createIfNotExists) const;
|
||||||
|
queueNameType::iterator getQueueCacheNameRow(const std::string& name,
|
||||||
|
bool createIfNotExists) const;
|
||||||
|
expirationQueueType::iterator getExpirationQueueCacheRow(int nHeight,
|
||||||
|
bool createIfNotExists) const;
|
||||||
|
|
||||||
|
bool removeSupport(const std::string& name, const COutPoint& outPoint,
|
||||||
|
int nHeight, int& nValidAtHeight,
|
||||||
|
bool fCheckTakeover) const;
|
||||||
|
bool removeSupportFromMap(const std::string& name, const COutPoint& outPoint,
|
||||||
|
CSupportValue& support,
|
||||||
|
bool fCheckTakeover) const;
|
||||||
|
|
||||||
|
bool insertSupportIntoMap(const std::string& name,
|
||||||
|
CSupportValue support,
|
||||||
|
bool fCheckTakeover) const;
|
||||||
|
|
||||||
|
supportQueueType::iterator getSupportQueueCacheRow(int nHeight,
|
||||||
|
bool createIfNotExists) const;
|
||||||
|
queueNameType::iterator getSupportQueueCacheNameRow(const std::string& name,
|
||||||
|
bool createIfNotExists) const;
|
||||||
|
expirationQueueType::iterator getSupportExpirationQueueCacheRow(int nHeight,
|
||||||
|
bool createIfNotExists) const;
|
||||||
|
|
||||||
|
bool addSupportToQueues(const std::string& name, CSupportValue& support) const;
|
||||||
|
bool removeSupportFromQueue(const std::string& name, const COutPoint& outPoint,
|
||||||
|
CSupportValue& support) const;
|
||||||
|
|
||||||
|
void addSupportToExpirationQueue(int nExpirationHeight,
|
||||||
|
nameOutPointType& entry) const;
|
||||||
|
void removeSupportFromExpirationQueue(const std::string& name,
|
||||||
|
const COutPoint& outPoint,
|
||||||
|
int nHeight) const;
|
||||||
|
|
||||||
|
bool getSupportsForName(const std::string& name,
|
||||||
|
supportMapEntryType& node) const;
|
||||||
|
|
||||||
|
bool getLastTakeoverForName(const std::string& name, int& lastTakeoverHeight) const;
|
||||||
|
|
||||||
|
int getDelayForName(const std::string& name) const;
|
||||||
|
|
||||||
|
uint256 getLeafHashForProof(const std::string& currentPosition, unsigned char nodeChar,
|
||||||
|
const CClaimTrieNode* currentNode) const;
|
||||||
|
|
||||||
|
CClaimTrieNode* addNodeToCache(const std::string& position, CClaimTrieNode* original) const;
|
||||||
|
|
||||||
|
bool getOriginalInfoForName(const std::string& name, CClaimValue& claim) const;
|
||||||
|
|
||||||
|
int getNumBlocksOfContinuousOwnership(const std::string& name) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // BITCOIN_CLAIMTRIE_H
|
|
@ -13,7 +13,7 @@
|
||||||
* for both bitcoind and bitcoin-core, to make it harder for attackers to
|
* for both bitcoind and bitcoin-core, to make it harder for attackers to
|
||||||
* target servers or GUI users specifically.
|
* target servers or GUI users specifically.
|
||||||
*/
|
*/
|
||||||
const std::string CLIENT_NAME("Satoshi");
|
const std::string CLIENT_NAME("LBRY");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Client version number
|
* Client version number
|
||||||
|
|
|
@ -16,11 +16,11 @@
|
||||||
//! These need to be macros, as clientversion.cpp's and bitcoin*-res.rc's voodoo requires it
|
//! These need to be macros, as clientversion.cpp's and bitcoin*-res.rc's voodoo requires it
|
||||||
#define CLIENT_VERSION_MAJOR 0
|
#define CLIENT_VERSION_MAJOR 0
|
||||||
#define CLIENT_VERSION_MINOR 12
|
#define CLIENT_VERSION_MINOR 12
|
||||||
#define CLIENT_VERSION_REVISION 99
|
#define CLIENT_VERSION_REVISION 2
|
||||||
#define CLIENT_VERSION_BUILD 0
|
#define CLIENT_VERSION_BUILD 3
|
||||||
|
|
||||||
//! Set to true for release, false for prerelease or test build
|
//! 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)
|
* Copyright year (2009-this)
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
#define BITCOIN_CONSENSUS_CONSENSUS_H
|
#define BITCOIN_CONSENSUS_CONSENSUS_H
|
||||||
|
|
||||||
/** The maximum allowed size for a serialized block, in bytes (network rule) */
|
/** The maximum allowed size for a serialized block, in bytes (network rule) */
|
||||||
static const unsigned int MAX_BLOCK_SIZE = 1000000;
|
static const unsigned int MAX_BLOCK_SIZE = 2000000;
|
||||||
/** The maximum allowed number of signature check operations in a block (network rule) */
|
/** The maximum allowed number of signature check operations in a block (network rule) */
|
||||||
static const unsigned int MAX_BLOCK_SIGOPS = MAX_BLOCK_SIZE/50;
|
static const unsigned int MAX_BLOCK_SIGOPS = MAX_BLOCK_SIZE/50;
|
||||||
/** Coinbase transaction outputs can only be spent after this number of new blocks (network rule) */
|
/** Coinbase transaction outputs can only be spent after this number of new blocks (network rule) */
|
||||||
|
|
|
@ -36,7 +36,7 @@ struct BIP9Deployment {
|
||||||
*/
|
*/
|
||||||
struct Params {
|
struct Params {
|
||||||
uint256 hashGenesisBlock;
|
uint256 hashGenesisBlock;
|
||||||
int nSubsidyHalvingInterval;
|
int nSubsidyLevelInterval;
|
||||||
/** Used to check majorities for block version upgrade */
|
/** Used to check majorities for block version upgrade */
|
||||||
int nMajorityEnforceBlockUpgrade;
|
int nMajorityEnforceBlockUpgrade;
|
||||||
int nMajorityRejectBlockOutdated;
|
int nMajorityRejectBlockOutdated;
|
||||||
|
@ -58,6 +58,17 @@ struct Params {
|
||||||
bool fPowNoRetargeting;
|
bool fPowNoRetargeting;
|
||||||
int64_t nPowTargetSpacing;
|
int64_t nPowTargetSpacing;
|
||||||
int64_t nPowTargetTimespan;
|
int64_t nPowTargetTimespan;
|
||||||
|
/** how long it took claims to expire before the hard fork */
|
||||||
|
int64_t nOriginalClaimExpirationTime;
|
||||||
|
/** how long it takes claims to expire after the hard fork */
|
||||||
|
int64_t nExtendedClaimExpirationTime;
|
||||||
|
/** blocks before the hard fork that changed the expiration time */
|
||||||
|
int64_t nExtendedClaimExpirationForkHeight;
|
||||||
|
int64_t GetExpirationTime(int64_t nHeight) const {
|
||||||
|
return nHeight < nExtendedClaimExpirationForkHeight ?
|
||||||
|
nOriginalClaimExpirationTime :
|
||||||
|
nExtendedClaimExpirationTime;
|
||||||
|
}
|
||||||
int64_t DifficultyAdjustmentInterval() const { return nPowTargetTimespan / nPowTargetSpacing; }
|
int64_t DifficultyAdjustmentInterval() const { return nPowTargetTimespan / nPowTargetSpacing; }
|
||||||
};
|
};
|
||||||
} // namespace Consensus
|
} // namespace Consensus
|
||||||
|
|
39
src/hash.cpp
|
@ -4,7 +4,9 @@
|
||||||
|
|
||||||
#include "hash.h"
|
#include "hash.h"
|
||||||
#include "crypto/common.h"
|
#include "crypto/common.h"
|
||||||
|
#include "crypto/ripemd160.h"
|
||||||
#include "crypto/hmac_sha512.h"
|
#include "crypto/hmac_sha512.h"
|
||||||
|
#include "crypto/sha512.h"
|
||||||
#include "pubkey.h"
|
#include "pubkey.h"
|
||||||
|
|
||||||
|
|
||||||
|
@ -13,6 +15,43 @@ inline uint32_t ROTL32(uint32_t x, int8_t r)
|
||||||
return (x << r) | (x >> (32 - r));
|
return (x << r) | (x >> (32 - r));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint256 PoWHash(const std::vector<unsigned char>& input)
|
||||||
|
{
|
||||||
|
CHash256 h256;
|
||||||
|
CSHA512 h512;
|
||||||
|
CRIPEMD160 h160;
|
||||||
|
|
||||||
|
std::vector<unsigned char> out;
|
||||||
|
out.resize(h512.OUTPUT_SIZE);
|
||||||
|
|
||||||
|
std::vector<unsigned char> out_small;
|
||||||
|
out_small.resize(h160.OUTPUT_SIZE);
|
||||||
|
|
||||||
|
h256.Write(input.data(), input.size());
|
||||||
|
h256.Finalize(&out[0]);
|
||||||
|
h256.Reset();
|
||||||
|
|
||||||
|
h512.Write(out.data(), h256.OUTPUT_SIZE);
|
||||||
|
h512.Finalize(&out[0]);
|
||||||
|
|
||||||
|
|
||||||
|
h160.Write(out.data(), h512.OUTPUT_SIZE / 2);
|
||||||
|
h160.Finalize(&out_small[0]);
|
||||||
|
h160.Reset();
|
||||||
|
|
||||||
|
h256.Write(out_small.data(), h160.OUTPUT_SIZE);
|
||||||
|
|
||||||
|
h160.Write(out.data() + h512.OUTPUT_SIZE / 2, h512.OUTPUT_SIZE / 2);
|
||||||
|
h160.Finalize(&out_small[0]);
|
||||||
|
|
||||||
|
out.resize(h256.OUTPUT_SIZE);
|
||||||
|
h256.Write(out_small.data(), h160.OUTPUT_SIZE);
|
||||||
|
h256.Finalize(&out[0]);
|
||||||
|
|
||||||
|
uint256 result(out);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned int MurmurHash3(unsigned int nHashSeed, const std::vector<unsigned char>& vDataToHash)
|
unsigned int MurmurHash3(unsigned int nHashSeed, const std::vector<unsigned char>& vDataToHash)
|
||||||
{
|
{
|
||||||
// The following is MurmurHash3 (x86_32), see http://code.google.com/p/smhasher/source/browse/trunk/MurmurHash3.cpp
|
// The following is MurmurHash3 (x86_32), see http://code.google.com/p/smhasher/source/browse/trunk/MurmurHash3.cpp
|
||||||
|
|
|
@ -167,6 +167,8 @@ uint256 SerializeHash(const T& obj, int nType=SER_GETHASH, int nVersion=PROTOCOL
|
||||||
return ss.GetHash();
|
return ss.GetHash();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint256 PoWHash(const std::vector<unsigned char>& input);
|
||||||
|
|
||||||
unsigned int MurmurHash3(unsigned int nHashSeed, const std::vector<unsigned char>& vDataToHash);
|
unsigned int MurmurHash3(unsigned int nHashSeed, const std::vector<unsigned char>& vDataToHash);
|
||||||
|
|
||||||
void BIP32Hash(const ChainCode &chainCode, unsigned int nChild, unsigned char header, const unsigned char data[32], unsigned char output[64]);
|
void BIP32Hash(const ChainCode &chainCode, unsigned int nChild, unsigned char header, const unsigned char data[32], unsigned char output[64]);
|
||||||
|
|
24
src/init.cpp
|
@ -194,6 +194,7 @@ void Shutdown()
|
||||||
if (pwalletMain)
|
if (pwalletMain)
|
||||||
pwalletMain->Flush(false);
|
pwalletMain->Flush(false);
|
||||||
#endif
|
#endif
|
||||||
|
GenerateBitcoins(false, 0, Params());
|
||||||
StopNode();
|
StopNode();
|
||||||
StopTorControl();
|
StopTorControl();
|
||||||
UnregisterNodeSignals(GetNodeSignals());
|
UnregisterNodeSignals(GetNodeSignals());
|
||||||
|
@ -222,6 +223,8 @@ void Shutdown()
|
||||||
pcoinsdbview = NULL;
|
pcoinsdbview = NULL;
|
||||||
delete pblocktree;
|
delete pblocktree;
|
||||||
pblocktree = NULL;
|
pblocktree = NULL;
|
||||||
|
delete pclaimTrie;
|
||||||
|
pclaimTrie = NULL;
|
||||||
}
|
}
|
||||||
#ifdef ENABLE_WALLET
|
#ifdef ENABLE_WALLET
|
||||||
if (pwalletMain)
|
if (pwalletMain)
|
||||||
|
@ -424,6 +427,8 @@ std::string HelpMessage(HelpMessageMode mode)
|
||||||
debugCategories += ", qt";
|
debugCategories += ", qt";
|
||||||
strUsage += HelpMessageOpt("-debug=<category>", strprintf(_("Output debugging information (default: %u, supplying <category> is optional)"), 0) + ". " +
|
strUsage += HelpMessageOpt("-debug=<category>", strprintf(_("Output debugging information (default: %u, supplying <category> is optional)"), 0) + ". " +
|
||||||
_("If <category> is not supplied or if <category> = 1, output all debugging information.") + _("<category> can be:") + " " + debugCategories + ".");
|
_("If <category> is not supplied or if <category> = 1, output all debugging information.") + _("<category> can be:") + " " + debugCategories + ".");
|
||||||
|
strUsage += HelpMessageOpt("-gen", strprintf(_("Generate coins (default: %u)"), 0));
|
||||||
|
strUsage += HelpMessageOpt("-genproclimit=<n>", strprintf(_("Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)"), 1));
|
||||||
if (showDebug)
|
if (showDebug)
|
||||||
strUsage += HelpMessageOpt("-nodebug", "Turn off debugging messages, same as -debug=0");
|
strUsage += HelpMessageOpt("-nodebug", "Turn off debugging messages, same as -debug=0");
|
||||||
strUsage += HelpMessageOpt("-help-debug", _("Show all debugging options (usage: --help -help-debug)"));
|
strUsage += HelpMessageOpt("-help-debug", _("Show all debugging options (usage: --help -help-debug)"));
|
||||||
|
@ -1224,6 +1229,8 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||||
LogPrintf("* Using %.1fMiB for chain state database\n", nCoinDBCache * (1.0 / 1024 / 1024));
|
LogPrintf("* Using %.1fMiB for chain state database\n", nCoinDBCache * (1.0 / 1024 / 1024));
|
||||||
LogPrintf("* Using %.1fMiB for in-memory UTXO set\n", nCoinCacheUsage * (1.0 / 1024 / 1024));
|
LogPrintf("* Using %.1fMiB for in-memory UTXO set\n", nCoinCacheUsage * (1.0 / 1024 / 1024));
|
||||||
|
|
||||||
|
const Consensus::Params& consensusParams = Params().GetConsensus();
|
||||||
|
|
||||||
bool fLoaded = false;
|
bool fLoaded = false;
|
||||||
while (!fLoaded) {
|
while (!fLoaded) {
|
||||||
bool fReset = fReindex;
|
bool fReset = fReindex;
|
||||||
|
@ -1239,11 +1246,13 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||||
delete pcoinsdbview;
|
delete pcoinsdbview;
|
||||||
delete pcoinscatcher;
|
delete pcoinscatcher;
|
||||||
delete pblocktree;
|
delete pblocktree;
|
||||||
|
delete pclaimTrie;
|
||||||
|
|
||||||
pblocktree = new CBlockTreeDB(nBlockTreeDBCache, false, fReindex);
|
pblocktree = new CBlockTreeDB(nBlockTreeDBCache, false, fReindex);
|
||||||
pcoinsdbview = new CCoinsViewDB(nCoinDBCache, false, fReindex);
|
pcoinsdbview = new CCoinsViewDB(nCoinDBCache, false, fReindex);
|
||||||
pcoinscatcher = new CCoinsViewErrorCatcher(pcoinsdbview);
|
pcoinscatcher = new CCoinsViewErrorCatcher(pcoinsdbview);
|
||||||
pcoinsTip = new CCoinsViewCache(pcoinscatcher);
|
pcoinsTip = new CCoinsViewCache(pcoinscatcher);
|
||||||
|
pclaimTrie = new CClaimTrie(false, fReindex);
|
||||||
|
|
||||||
if (fReindex) {
|
if (fReindex) {
|
||||||
pblocktree->WriteReindexing(true);
|
pblocktree->WriteReindexing(true);
|
||||||
|
@ -1259,7 +1268,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||||
|
|
||||||
// If the loaded chain has a wrong genesis, bail out immediately
|
// If the loaded chain has a wrong genesis, bail out immediately
|
||||||
// (we're likely using a testnet datadir, or the other way around).
|
// (we're likely using a testnet datadir, or the other way around).
|
||||||
if (!mapBlockIndex.empty() && mapBlockIndex.count(chainparams.GetConsensus().hashGenesisBlock) == 0)
|
if (!mapBlockIndex.empty() && mapBlockIndex.count(consensusParams.hashGenesisBlock) == 0)
|
||||||
return InitError(_("Incorrect or no genesis block found. Wrong datadir for network?"));
|
return InitError(_("Incorrect or no genesis block found. Wrong datadir for network?"));
|
||||||
|
|
||||||
// Initialize the block index (no-op if non-empty database was already loaded)
|
// Initialize the block index (no-op if non-empty database was already loaded)
|
||||||
|
@ -1274,6 +1283,12 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!pclaimTrie->ReadFromDisk(true))
|
||||||
|
{
|
||||||
|
strLoadError = _("Error loading the claim trie from disk");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
// Check for changed -prune state. What we are concerned about is a user who has pruned blocks
|
// Check for changed -prune state. What we are concerned about is a user who has pruned blocks
|
||||||
// in the past, but is now trying to run unpruned.
|
// in the past, but is now trying to run unpruned.
|
||||||
if (fHavePruned && !fPruneMode) {
|
if (fHavePruned && !fPruneMode) {
|
||||||
|
@ -1409,6 +1424,8 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||||
|
|
||||||
RandAddSeedPerfmon();
|
RandAddSeedPerfmon();
|
||||||
|
|
||||||
|
pclaimTrie->setExpirationTime(consensusParams.GetExpirationTime(chainActive.Height()));
|
||||||
|
|
||||||
//// debug print
|
//// debug print
|
||||||
LogPrintf("mapBlockIndex.size() = %u\n", mapBlockIndex.size());
|
LogPrintf("mapBlockIndex.size() = %u\n", mapBlockIndex.size());
|
||||||
LogPrintf("nBestHeight = %d\n", chainActive.Height());
|
LogPrintf("nBestHeight = %d\n", chainActive.Height());
|
||||||
|
@ -1424,11 +1441,14 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||||
StartNode(threadGroup, scheduler);
|
StartNode(threadGroup, scheduler);
|
||||||
|
|
||||||
// Monitor the chain, and alert if we get blocks much quicker or slower than expected
|
// Monitor the chain, and alert if we get blocks much quicker or slower than expected
|
||||||
int64_t nPowTargetSpacing = Params().GetConsensus().nPowTargetSpacing;
|
int64_t nPowTargetSpacing = consensusParams.nPowTargetSpacing;
|
||||||
CScheduler::Function f = boost::bind(&PartitionCheck, &IsInitialBlockDownload,
|
CScheduler::Function f = boost::bind(&PartitionCheck, &IsInitialBlockDownload,
|
||||||
boost::ref(cs_main), boost::cref(pindexBestHeader), nPowTargetSpacing);
|
boost::ref(cs_main), boost::cref(pindexBestHeader), nPowTargetSpacing);
|
||||||
scheduler.scheduleEvery(f, nPowTargetSpacing);
|
scheduler.scheduleEvery(f, nPowTargetSpacing);
|
||||||
|
|
||||||
|
// Generate coins in the background
|
||||||
|
GenerateBitcoins(GetBoolArg("-gen", false), GetArg("-genproclimit", 1), Params());
|
||||||
|
|
||||||
// ********************************************************* Step 12: finished
|
// ********************************************************* Step 12: finished
|
||||||
|
|
||||||
SetRPCWarmupFinished();
|
SetRPCWarmupFinished();
|
||||||
|
|
39
src/lbry.cpp
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
#include "lbry.h"
|
||||||
|
#include "uint256.h"
|
||||||
|
#include <cstdio>
|
||||||
|
|
||||||
|
unsigned int CalculateLbryNextWorkRequired(const CBlockIndex* pindexLast, int64_t nFirstBlockTime, const Consensus::Params& params)
|
||||||
|
{
|
||||||
|
if (params.fPowNoRetargeting)
|
||||||
|
return pindexLast->nBits;
|
||||||
|
|
||||||
|
const int64_t retargetTimespan = params.nPowTargetTimespan;
|
||||||
|
const int64_t nActualTimespan = pindexLast->GetBlockTime() - nFirstBlockTime;
|
||||||
|
int64_t nModulatedTimespan = nActualTimespan;
|
||||||
|
int64_t nMaxTimespan;
|
||||||
|
int64_t nMinTimespan;
|
||||||
|
|
||||||
|
nModulatedTimespan = retargetTimespan + (nModulatedTimespan - retargetTimespan) / 8;
|
||||||
|
|
||||||
|
nMinTimespan = retargetTimespan - (retargetTimespan / 8); //(150 - 18 = 132)
|
||||||
|
nMaxTimespan = retargetTimespan + (retargetTimespan / 2); //(150 + 75 = 225)
|
||||||
|
|
||||||
|
// Limit adjustment step
|
||||||
|
if (nModulatedTimespan < nMinTimespan)
|
||||||
|
nModulatedTimespan = nMinTimespan;
|
||||||
|
else if (nModulatedTimespan > nMaxTimespan)
|
||||||
|
nModulatedTimespan = nMaxTimespan;
|
||||||
|
|
||||||
|
// Retarget
|
||||||
|
const arith_uint256 bnPowLimit = UintToArith256(params.powLimit);
|
||||||
|
arith_uint256 bnNew;
|
||||||
|
bnNew.SetCompact(pindexLast->nBits);
|
||||||
|
bnNew *= nModulatedTimespan;
|
||||||
|
bnNew /= retargetTimespan;
|
||||||
|
if (bnNew > bnPowLimit)
|
||||||
|
bnNew = bnPowLimit;
|
||||||
|
|
||||||
|
return bnNew.GetCompact();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
9
src/lbry.h
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
#ifndef LBRY_H
|
||||||
|
#define LBRY_H
|
||||||
|
|
||||||
|
#include "chain.h"
|
||||||
|
#include "chainparams.h"
|
||||||
|
|
||||||
|
unsigned int CalculateLbryNextWorkRequired(const CBlockIndex* pindexLast, int64_t nLastRetargetTime, const Consensus::Params& params);
|
||||||
|
|
||||||
|
#endif
|
471
src/main.cpp
|
@ -16,6 +16,7 @@
|
||||||
#include "hash.h"
|
#include "hash.h"
|
||||||
#include "init.h"
|
#include "init.h"
|
||||||
#include "merkleblock.h"
|
#include "merkleblock.h"
|
||||||
|
#include "nameclaim.h"
|
||||||
#include "net.h"
|
#include "net.h"
|
||||||
#include "policy/fees.h"
|
#include "policy/fees.h"
|
||||||
#include "policy/policy.h"
|
#include "policy/policy.h"
|
||||||
|
@ -48,7 +49,7 @@
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
#if defined(NDEBUG)
|
#if defined(NDEBUG)
|
||||||
# error "Bitcoin cannot be compiled without assertions."
|
# error "LBRYcrd cannot be compiled without assertions."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -81,6 +82,7 @@ bool fEnableReplacement = DEFAULT_ENABLE_REPLACEMENT;
|
||||||
|
|
||||||
CFeeRate minRelayTxFee = CFeeRate(DEFAULT_MIN_RELAY_TX_FEE);
|
CFeeRate minRelayTxFee = CFeeRate(DEFAULT_MIN_RELAY_TX_FEE);
|
||||||
CAmount maxTxFee = DEFAULT_TRANSACTION_MAXFEE;
|
CAmount maxTxFee = DEFAULT_TRANSACTION_MAXFEE;
|
||||||
|
CAmount minFeePerNameClaimChar = MIN_FEE_PER_NAMECLAIM_CHAR;
|
||||||
|
|
||||||
CTxMemPool mempool(::minRelayTxFee);
|
CTxMemPool mempool(::minRelayTxFee);
|
||||||
FeeFilterRounder filterRounder(::minRelayTxFee);
|
FeeFilterRounder filterRounder(::minRelayTxFee);
|
||||||
|
@ -103,7 +105,7 @@ static void CheckBlockIndex(const Consensus::Params& consensusParams);
|
||||||
/** Constant stuff for coinbase transactions we create: */
|
/** Constant stuff for coinbase transactions we create: */
|
||||||
CScript COINBASE_FLAGS;
|
CScript COINBASE_FLAGS;
|
||||||
|
|
||||||
const string strMessageMagic = "Bitcoin Signed Message:\n";
|
const string strMessageMagic = "LBRYcrd Signed Message:\n";
|
||||||
|
|
||||||
// Internal stuff
|
// Internal stuff
|
||||||
namespace {
|
namespace {
|
||||||
|
@ -596,6 +598,7 @@ CBlockIndex* FindForkInGlobalIndex(const CChain& chain, const CBlockLocator& loc
|
||||||
}
|
}
|
||||||
|
|
||||||
CCoinsViewCache *pcoinsTip = NULL;
|
CCoinsViewCache *pcoinsTip = NULL;
|
||||||
|
CClaimTrie *pclaimTrie = NULL;
|
||||||
CBlockTreeDB *pblocktree = NULL;
|
CBlockTreeDB *pblocktree = NULL;
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -923,8 +926,9 @@ unsigned int GetP2SHSigOpCount(const CTransaction& tx, const CCoinsViewCache& in
|
||||||
for (unsigned int i = 0; i < tx.vin.size(); i++)
|
for (unsigned int i = 0; i < tx.vin.size(); i++)
|
||||||
{
|
{
|
||||||
const CTxOut &prevout = inputs.GetOutputFor(tx.vin[i]);
|
const CTxOut &prevout = inputs.GetOutputFor(tx.vin[i]);
|
||||||
if (prevout.scriptPubKey.IsPayToScriptHash())
|
const CScript& scriptPubKey = StripClaimScriptPrefix(prevout.scriptPubKey);
|
||||||
nSigOps += prevout.scriptPubKey.GetSigOpCount(tx.vin[i].scriptSig);
|
if (scriptPubKey.IsPayToScriptHash())
|
||||||
|
nSigOps += scriptPubKey.GetSigOpCount(tx.vin[i].scriptSig);
|
||||||
}
|
}
|
||||||
return nSigOps;
|
return nSigOps;
|
||||||
}
|
}
|
||||||
|
@ -958,6 +962,14 @@ bool CheckTransaction(const CTransaction& tx, CValidationState &state)
|
||||||
nValueOut += txout.nValue;
|
nValueOut += txout.nValue;
|
||||||
if (!MoneyRange(nValueOut))
|
if (!MoneyRange(nValueOut))
|
||||||
return state.DoS(100, false, REJECT_INVALID, "bad-txns-txouttotal-toolarge");
|
return state.DoS(100, false, REJECT_INVALID, "bad-txns-txouttotal-toolarge");
|
||||||
|
|
||||||
|
// check claimtrie transactions
|
||||||
|
|
||||||
|
if (ClaimScriptSize(txout.scriptPubKey) > MAX_CLAIM_SCRIPT_SIZE)
|
||||||
|
return state.DoS(100, false, REJECT_INVALID, "bad-txns-claimscriptsize-toolarge");
|
||||||
|
if (ClaimNameSize(txout.scriptPubKey) > MAX_CLAIM_NAME_SIZE)
|
||||||
|
return state.DoS(100, false, REJECT_INVALID, "bad-txns-claimscriptname-toolarge");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for duplicate inputs
|
// Check for duplicate inputs
|
||||||
|
@ -1022,8 +1034,12 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState& state, const C
|
||||||
|
|
||||||
// Rather not work on nonstandard transactions (unless -testnet/-regtest)
|
// Rather not work on nonstandard transactions (unless -testnet/-regtest)
|
||||||
string reason;
|
string reason;
|
||||||
if (fRequireStandard && !IsStandardTx(tx, reason))
|
if (fRequireStandard && !IsStandardTx(tx, reason)) {
|
||||||
|
if (reason == "dust")
|
||||||
|
return state.DoS(0, false, REJECT_DUST, reason);
|
||||||
|
else
|
||||||
return state.DoS(0, false, REJECT_NONSTANDARD, reason);
|
return state.DoS(0, false, REJECT_NONSTANDARD, reason);
|
||||||
|
}
|
||||||
|
|
||||||
// Don't relay version 2 transactions until CSV is active, and we can be
|
// Don't relay version 2 transactions until CSV is active, and we can be
|
||||||
// sure that such transactions will be mined (unless we're on
|
// sure that such transactions will be mined (unless we're on
|
||||||
|
@ -1183,6 +1199,14 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState& state, const C
|
||||||
return state.DoS(0, false, REJECT_NONSTANDARD, "bad-txns-too-many-sigops", false,
|
return state.DoS(0, false, REJECT_NONSTANDARD, "bad-txns-too-many-sigops", false,
|
||||||
strprintf("%d", nSigOps));
|
strprintf("%d", nSigOps));
|
||||||
|
|
||||||
|
// If a ClaimTrie transaction, it must meet the minimum fee requirement due to
|
||||||
|
// it consuming extra system resources, compared to an ordinary transaction
|
||||||
|
CAmount minClaimTrieFee = CalcMinClaimTrieFee(tx, minFeePerNameClaimChar);
|
||||||
|
if (nModifiedFees < minClaimTrieFee) {
|
||||||
|
return state.DoS(0, false, REJECT_INSUFFICIENTFEE, "minimum claim trie fee not met", false,
|
||||||
|
strprintf("%d < %d", nFees, minClaimTrieFee));
|
||||||
|
}
|
||||||
|
|
||||||
CAmount mempoolRejectFee = pool.GetMinFee(GetArg("-maxmempool", DEFAULT_MAX_MEMPOOL_SIZE) * 1000000).GetFee(nSize);
|
CAmount mempoolRejectFee = pool.GetMinFee(GetArg("-maxmempool", DEFAULT_MAX_MEMPOOL_SIZE) * 1000000).GetFee(nSize);
|
||||||
if (mempoolRejectFee > 0 && nModifiedFees < mempoolRejectFee) {
|
if (mempoolRejectFee > 0 && nModifiedFees < mempoolRejectFee) {
|
||||||
return state.DoS(0, false, REJECT_INSUFFICIENTFEE, "mempool min fee not met", false, strprintf("%d < %d", nFees, mempoolRejectFee));
|
return state.DoS(0, false, REJECT_INSUFFICIENTFEE, "mempool min fee not met", false, strprintf("%d < %d", nFees, mempoolRejectFee));
|
||||||
|
@ -1190,7 +1214,6 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState& state, const C
|
||||||
// Require that free transactions have sufficient priority to be mined in the next block.
|
// Require that free transactions have sufficient priority to be mined in the next block.
|
||||||
return state.DoS(0, false, REJECT_INSUFFICIENTFEE, "insufficient priority");
|
return state.DoS(0, false, REJECT_INSUFFICIENTFEE, "insufficient priority");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Continuously rate-limit free (really, very-low-fee) transactions
|
// Continuously rate-limit free (really, very-low-fee) transactions
|
||||||
// This mitigates 'penny-flooding' -- sending thousands of free transactions just to
|
// This mitigates 'penny-flooding' -- sending thousands of free transactions just to
|
||||||
// be annoying or make others' transactions take longer to confirm.
|
// be annoying or make others' transactions take longer to confirm.
|
||||||
|
@ -1473,7 +1496,7 @@ bool GetTransaction(const uint256 &hash, CTransaction &txOut, const Consensus::P
|
||||||
if (coins)
|
if (coins)
|
||||||
nHeight = coins->nHeight;
|
nHeight = coins->nHeight;
|
||||||
}
|
}
|
||||||
if (nHeight > 0)
|
if (nHeight >= 0)
|
||||||
pindexSlow = chainActive[nHeight];
|
pindexSlow = chainActive[nHeight];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1542,7 +1565,7 @@ bool ReadBlockFromDisk(CBlock& block, const CDiskBlockPos& pos, const Consensus:
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check the header
|
// Check the header
|
||||||
if (!CheckProofOfWork(block.GetHash(), block.nBits, consensusParams))
|
if (!CheckProofOfWork(block.GetPoWHash(), block.nBits, consensusParams))
|
||||||
return error("ReadBlockFromDisk: Errors in block header at %s", pos.ToString());
|
return error("ReadBlockFromDisk: Errors in block header at %s", pos.ToString());
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -1558,17 +1581,54 @@ bool ReadBlockFromDisk(CBlock& block, const CBlockIndex* pindex, const Consensus
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool withinLevelBounds(int nReduction, int nLevel)
|
||||||
|
{
|
||||||
|
if (((nReduction * nReduction + nReduction) >> 1) > nLevel)
|
||||||
|
return false;
|
||||||
|
nReduction += 1;
|
||||||
|
if (((nReduction * nReduction + nReduction) >> 1) <= nLevel)
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams)
|
CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams)
|
||||||
{
|
{
|
||||||
int halvings = nHeight / consensusParams.nSubsidyHalvingInterval;
|
if (nHeight == 0)
|
||||||
// Force block reward to zero when right shift is undefined.
|
{
|
||||||
if (halvings >= 64)
|
return 400000000 * COIN;
|
||||||
|
}
|
||||||
|
else if (nHeight <= 5100)
|
||||||
|
{
|
||||||
|
return 1 * COIN;
|
||||||
|
}
|
||||||
|
else if (nHeight <= 55000)
|
||||||
|
{
|
||||||
|
int l = nHeight - 5000;
|
||||||
|
int nLevel = 0;
|
||||||
|
for (int i = 0; i < l; i+=100)
|
||||||
|
{
|
||||||
|
nLevel++;
|
||||||
|
}
|
||||||
|
return nLevel * COIN;
|
||||||
|
}
|
||||||
|
CAmount nStartingSubsidy = 500 * COIN;
|
||||||
|
int nLevel = (nHeight - 55001) / consensusParams.nSubsidyLevelInterval;
|
||||||
|
int nReduction = ((-1 + (int)sqrt((8 * nLevel) + 1)) / 2);
|
||||||
|
while (!(withinLevelBounds(nReduction, nLevel)))
|
||||||
|
{
|
||||||
|
if (((nReduction * nReduction + nReduction) >> 1) > nLevel)
|
||||||
|
{
|
||||||
|
nReduction--;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nReduction++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CAmount nSubsidyReduction = nReduction * COIN;
|
||||||
|
if (nSubsidyReduction >= nStartingSubsidy)
|
||||||
return 0;
|
return 0;
|
||||||
|
return nStartingSubsidy - nSubsidyReduction;
|
||||||
CAmount nSubsidy = 50 * COIN;
|
|
||||||
// Subsidy is cut in half every 210,000 blocks which will occur approximately every 4 years.
|
|
||||||
nSubsidy >>= halvings;
|
|
||||||
return nSubsidy;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IsInitialBlockDownload()
|
bool IsInitialBlockDownload()
|
||||||
|
@ -1582,8 +1642,8 @@ bool IsInitialBlockDownload()
|
||||||
static bool lockIBDState = false;
|
static bool lockIBDState = false;
|
||||||
if (lockIBDState)
|
if (lockIBDState)
|
||||||
return false;
|
return false;
|
||||||
bool state = (chainActive.Height() < pindexBestHeader->nHeight - 24 * 6 ||
|
bool state = (chainActive.Height() < pindexBestHeader->nHeight - 24 * 6);// ||
|
||||||
pindexBestHeader->GetBlockTime() < GetTime() - nMaxTipAge);
|
//pindexBestHeader->GetBlockTime() < GetTime() - nMaxTipAge);
|
||||||
if (!state)
|
if (!state)
|
||||||
lockIBDState = true;
|
lockIBDState = true;
|
||||||
return state;
|
return state;
|
||||||
|
@ -1760,6 +1820,7 @@ void UpdateCoins(const CTransaction& tx, CValidationState &state, CCoinsViewCach
|
||||||
coins->Spend(nPos);
|
coins->Spend(nPos);
|
||||||
if (coins->vout.size() == 0) {
|
if (coins->vout.size() == 0) {
|
||||||
CTxInUndo& undo = txundo.vprevout.back();
|
CTxInUndo& undo = txundo.vprevout.back();
|
||||||
|
undo.fLastUnspent = true;
|
||||||
undo.nHeight = coins->nHeight;
|
undo.nHeight = coins->nHeight;
|
||||||
undo.fCoinBase = coins->fCoinBase;
|
undo.fCoinBase = coins->fCoinBase;
|
||||||
undo.nVersion = coins->nVersion;
|
undo.nVersion = coins->nVersion;
|
||||||
|
@ -1980,13 +2041,13 @@ bool AbortNode(CValidationState& state, const std::string& strMessage, const std
|
||||||
* @param out The out point that corresponds to the tx input.
|
* @param out The out point that corresponds to the tx input.
|
||||||
* @return True on success.
|
* @return True on success.
|
||||||
*/
|
*/
|
||||||
static bool ApplyTxInUndo(const CTxInUndo& undo, CCoinsViewCache& view, const COutPoint& out)
|
static bool ApplyTxInUndo(const CTxInUndo& undo, CCoinsViewCache& view, CClaimTrieCache& trieCache, const COutPoint& out)
|
||||||
{
|
{
|
||||||
bool fClean = true;
|
bool fClean = true;
|
||||||
|
|
||||||
CCoinsModifier coins = view.ModifyCoins(out.hash);
|
CCoinsModifier coins = view.ModifyCoins(out.hash);
|
||||||
if (undo.nHeight != 0) {
|
if (undo.fLastUnspent) {
|
||||||
// undo data contains height: this is the last output of the prevout tx being spent
|
// this is the last output of the prevout tx being spent
|
||||||
if (!coins->IsPruned())
|
if (!coins->IsPruned())
|
||||||
fClean = fClean && error("%s: undo data overwriting existing transaction", __func__);
|
fClean = fClean && error("%s: undo data overwriting existing transaction", __func__);
|
||||||
coins->Clear();
|
coins->Clear();
|
||||||
|
@ -2001,14 +2062,66 @@ static bool ApplyTxInUndo(const CTxInUndo& undo, CCoinsViewCache& view, const CO
|
||||||
fClean = fClean && error("%s: undo data overwriting existing output", __func__);
|
fClean = fClean && error("%s: undo data overwriting existing output", __func__);
|
||||||
if (coins->vout.size() < out.n+1)
|
if (coins->vout.size() < out.n+1)
|
||||||
coins->vout.resize(out.n+1);
|
coins->vout.resize(out.n+1);
|
||||||
|
|
||||||
|
// restore claim if applicable
|
||||||
|
int op;
|
||||||
|
std::vector<std::vector<unsigned char> > vvchParams;
|
||||||
|
if (undo.fIsClaim && DecodeClaimScript(undo.txout.scriptPubKey, op, vvchParams))
|
||||||
|
{
|
||||||
|
if (op == OP_CLAIM_NAME || op == OP_UPDATE_CLAIM)
|
||||||
|
{
|
||||||
|
uint160 claimId;
|
||||||
|
if (op == OP_CLAIM_NAME)
|
||||||
|
{
|
||||||
|
assert(vvchParams.size() == 2);
|
||||||
|
claimId = ClaimIdHash(out.hash, out.n);
|
||||||
|
}
|
||||||
|
else if (op == OP_UPDATE_CLAIM)
|
||||||
|
{
|
||||||
|
assert(vvchParams.size() == 3);
|
||||||
|
claimId = uint160(vvchParams[1]);
|
||||||
|
}
|
||||||
|
std::string name(vvchParams[0].begin(), vvchParams[0].end());
|
||||||
|
int nValidHeight = undo.nClaimValidHeight;
|
||||||
|
if (nValidHeight > 0 && nValidHeight >= coins->nHeight)
|
||||||
|
{
|
||||||
|
LogPrintf("%s: (txid: %s, nOut: %d) Restoring %s to the claim trie due to a block being disconnected\n", __func__, out.hash.ToString(), out.n, name.c_str());
|
||||||
|
if (!trieCache.undoSpendClaim(name, COutPoint(out.hash, out.n), claimId, undo.txout.nValue, coins->nHeight, nValidHeight))
|
||||||
|
LogPrintf("%s: Something went wrong inserting the claim\n", __func__);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LogPrintf("%s: (txid: %s, nOut: %d) Not restoring %s to the claim trie because it expired before it was spent\n", __func__, out.hash.ToString(), out.n, name.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (op == OP_SUPPORT_CLAIM)
|
||||||
|
{
|
||||||
|
assert(vvchParams.size() == 2);
|
||||||
|
std::string name(vvchParams[0].begin(), vvchParams[0].end());
|
||||||
|
uint160 supportedClaimId(vvchParams[1]);
|
||||||
|
int nValidHeight = undo.nClaimValidHeight;
|
||||||
|
if (nValidHeight > 0 && nValidHeight >= coins->nHeight)
|
||||||
|
{
|
||||||
|
LogPrintf("%s: (txid: %s, nOut: %d) Restoring support for %s in claimid %s due to a block being disconnected\n", __func__, out.hash.ToString(), out.n, name, supportedClaimId.ToString());
|
||||||
|
if (!trieCache.undoSpendSupport(name, COutPoint(out.hash, out.n), supportedClaimId, undo.txout.nValue, coins->nHeight, nValidHeight))
|
||||||
|
LogPrintf("%s: Something went wrong inserting support for the claim\n", __func__);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LogPrintf("%s: (txid: %s, nOut: %d) Not restoring support for %s in claimid %s because the support expired before it was spent\n", __func__, out.hash.ToString(), out.n, name, supportedClaimId.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
coins->vout[out.n] = undo.txout;
|
coins->vout[out.n] = undo.txout;
|
||||||
|
|
||||||
return fClean;
|
return fClean;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DisconnectBlock(const CBlock& block, CValidationState& state, const CBlockIndex* pindex, CCoinsViewCache& view, bool* pfClean)
|
bool DisconnectBlock(const CBlock& block, CValidationState& state, const CBlockIndex* pindex, CCoinsViewCache& view, CClaimTrieCache& trieCache, bool* pfClean)
|
||||||
{
|
{
|
||||||
assert(pindex->GetBlockHash() == view.GetBestBlock());
|
assert(pindex->GetBlockHash() == view.GetBestBlock());
|
||||||
|
assert(pindex->GetBlockHash() == trieCache.getBestBlock());
|
||||||
|
|
||||||
if (pfClean)
|
if (pfClean)
|
||||||
*pfClean = false;
|
*pfClean = false;
|
||||||
|
@ -2025,6 +2138,8 @@ bool DisconnectBlock(const CBlock& block, CValidationState& state, const CBlockI
|
||||||
if (blockUndo.vtxundo.size() + 1 != block.vtx.size())
|
if (blockUndo.vtxundo.size() + 1 != block.vtx.size())
|
||||||
return error("DisconnectBlock(): block and undo data inconsistent");
|
return error("DisconnectBlock(): block and undo data inconsistent");
|
||||||
|
|
||||||
|
assert(trieCache.decrementBlock(blockUndo.insertUndo, blockUndo.expireUndo, blockUndo.insertSupportUndo, blockUndo.expireSupportUndo, blockUndo.takeoverHeightUndo));
|
||||||
|
|
||||||
// undo transactions in reverse order
|
// undo transactions in reverse order
|
||||||
for (int i = block.vtx.size() - 1; i >= 0; i--) {
|
for (int i = block.vtx.size() - 1; i >= 0; i--) {
|
||||||
const CTransaction &tx = block.vtx[i];
|
const CTransaction &tx = block.vtx[i];
|
||||||
|
@ -2045,6 +2160,59 @@ bool DisconnectBlock(const CBlock& block, CValidationState& state, const CBlockI
|
||||||
if (*outs != outsBlock)
|
if (*outs != outsBlock)
|
||||||
fClean = fClean && error("DisconnectBlock(): added transaction mismatch? database corrupted");
|
fClean = fClean && error("DisconnectBlock(): added transaction mismatch? database corrupted");
|
||||||
|
|
||||||
|
// remove any claims
|
||||||
|
for (unsigned int i = 0; i < tx.vout.size(); ++i)
|
||||||
|
{
|
||||||
|
const CTxOut& txout = tx.vout[i];
|
||||||
|
|
||||||
|
int op;
|
||||||
|
std::vector<std::vector<unsigned char> > vvchParams;
|
||||||
|
if (DecodeClaimScript(txout.scriptPubKey, op, vvchParams))
|
||||||
|
{
|
||||||
|
if (op == OP_CLAIM_NAME || op == OP_UPDATE_CLAIM)
|
||||||
|
{
|
||||||
|
uint160 claimId;
|
||||||
|
if (op == OP_CLAIM_NAME)
|
||||||
|
{
|
||||||
|
assert(vvchParams.size() == 2);
|
||||||
|
std::string name(vvchParams[0].begin(), vvchParams[0].end());
|
||||||
|
std::string value(vvchParams[1].begin(), vvchParams[1].end());
|
||||||
|
claimId = ClaimIdHash(hash, i);
|
||||||
|
LogPrintf("--- %s[%lu]: OP_CLAIM_NAME \"%s\" = \"%s\" with claimId %s and tx prevout %s at index %d\n",
|
||||||
|
__func__, pindex->nHeight, name, SanitizeString(value),
|
||||||
|
claimId.GetHex(), hash.ToString(), i);
|
||||||
|
}
|
||||||
|
else if (op == OP_UPDATE_CLAIM)
|
||||||
|
{
|
||||||
|
assert(vvchParams.size() == 3);
|
||||||
|
std::string name(vvchParams[0].begin(), vvchParams[0].end());
|
||||||
|
std::string value(vvchParams[1].begin(), vvchParams[1].end());
|
||||||
|
claimId = uint160(vvchParams[1]);
|
||||||
|
LogPrintf("--- %s[%lu]: OP_UPDATE_CLAIM \"%s\" = \"%s\" with claimId %s and tx prevout %s at index %d\n",
|
||||||
|
__func__, pindex->nHeight, name, SanitizeString(value),
|
||||||
|
claimId.GetHex(), hash.ToString(), i);
|
||||||
|
}
|
||||||
|
std::string name(vvchParams[0].begin(), vvchParams[0].end());
|
||||||
|
LogPrintf("%s: (txid: %s, nOut: %d) Trying to remove %s from the claim trie due to its block being disconnected\n", __func__, hash.ToString(), i, name.c_str());
|
||||||
|
if (!trieCache.undoAddClaim(name, COutPoint(hash, i), pindex->nHeight))
|
||||||
|
{
|
||||||
|
LogPrintf("%s: Could not find the claim in the trie or the cache\n", __func__);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (op == OP_SUPPORT_CLAIM)
|
||||||
|
{
|
||||||
|
assert(vvchParams.size() == 2);
|
||||||
|
std::string name(vvchParams[0].begin(), vvchParams[0].end());
|
||||||
|
uint160 supportedClaimId(vvchParams[1]);
|
||||||
|
LogPrintf("--- %s[%lu]: OP_SUPPORT_CLAIM \"%s\" with claimId %s and tx prevout %s at index %d\n",
|
||||||
|
__func__, pindex->nHeight, name, supportedClaimId.GetHex(), hash.ToString(), i);
|
||||||
|
LogPrintf("%s: (txid: %s, nOut: %d) Removing support for claim id %s on %s due to its block being disconnected\n", __func__, hash.ToString(), i, supportedClaimId.ToString(), name.c_str());
|
||||||
|
if (!trieCache.undoAddSupport(name, COutPoint(hash, i), pindex->nHeight))
|
||||||
|
LogPrintf("%s: Something went wrong removing support for name %s in hash %s\n", __func__, name.c_str(), hash.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// remove outputs
|
// remove outputs
|
||||||
outs->Clear();
|
outs->Clear();
|
||||||
}
|
}
|
||||||
|
@ -2057,7 +2225,7 @@ bool DisconnectBlock(const CBlock& block, CValidationState& state, const CBlockI
|
||||||
for (unsigned int j = tx.vin.size(); j-- > 0;) {
|
for (unsigned int j = tx.vin.size(); j-- > 0;) {
|
||||||
const COutPoint &out = tx.vin[j].prevout;
|
const COutPoint &out = tx.vin[j].prevout;
|
||||||
const CTxInUndo &undo = txundo.vprevout[j];
|
const CTxInUndo &undo = txundo.vprevout[j];
|
||||||
if (!ApplyTxInUndo(undo, view, out))
|
if (!ApplyTxInUndo(undo, view, trieCache, out))
|
||||||
fClean = false;
|
fClean = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2065,6 +2233,16 @@ bool DisconnectBlock(const CBlock& block, CValidationState& state, const CBlockI
|
||||||
|
|
||||||
// move best block pointer to prevout block
|
// move best block pointer to prevout block
|
||||||
view.SetBestBlock(pindex->pprev->GetBlockHash());
|
view.SetBestBlock(pindex->pprev->GetBlockHash());
|
||||||
|
assert(trieCache.finalizeDecrement());
|
||||||
|
trieCache.setBestBlock(pindex->pprev->GetBlockHash());
|
||||||
|
assert(trieCache.getMerkleHash() == pindex->pprev->hashClaimTrie);
|
||||||
|
if (pindex->nHeight == Params().GetConsensus().nExtendedClaimExpirationForkHeight)
|
||||||
|
{
|
||||||
|
LogPrintf("Decremented past the extended claim expiration hard fork height");
|
||||||
|
pclaimTrie->setExpirationTime(Params().GetConsensus().GetExpirationTime(pindex->nHeight-1));
|
||||||
|
trieCache.forkForExpirationChange(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (pfClean) {
|
if (pfClean) {
|
||||||
*pfClean = fClean;
|
*pfClean = fClean;
|
||||||
|
@ -2221,7 +2399,7 @@ static int64_t nTimeIndex = 0;
|
||||||
static int64_t nTimeCallbacks = 0;
|
static int64_t nTimeCallbacks = 0;
|
||||||
static int64_t nTimeTotal = 0;
|
static int64_t nTimeTotal = 0;
|
||||||
|
|
||||||
bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pindex, CCoinsViewCache& view, bool fJustCheck)
|
bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pindex, CCoinsViewCache& view, CClaimTrieCache& trieCache, bool fJustCheck)
|
||||||
{
|
{
|
||||||
const CChainParams& chainparams = Params();
|
const CChainParams& chainparams = Params();
|
||||||
AssertLockHeld(cs_main);
|
AssertLockHeld(cs_main);
|
||||||
|
@ -2236,12 +2414,18 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
|
||||||
uint256 hashPrevBlock = pindex->pprev == NULL ? uint256() : pindex->pprev->GetBlockHash();
|
uint256 hashPrevBlock = pindex->pprev == NULL ? uint256() : pindex->pprev->GetBlockHash();
|
||||||
assert(hashPrevBlock == view.GetBestBlock());
|
assert(hashPrevBlock == view.GetBestBlock());
|
||||||
|
|
||||||
|
// also verify that the trie cache's current state corresponds to the previous block
|
||||||
|
assert(hashPrevBlock == trieCache.getBestBlock());
|
||||||
|
|
||||||
// Special case for the genesis block, skipping connection of its transactions
|
// Special case for the genesis block, skipping connection of its transactions
|
||||||
// (its coinbase is unspendable)
|
// (its coinbase is unspendable)
|
||||||
if (block.GetHash() == chainparams.GetConsensus().hashGenesisBlock) {
|
if (block.GetHash() == chainparams.GetConsensus().hashGenesisBlock) {
|
||||||
if (!fJustCheck)
|
if (!fJustCheck)
|
||||||
|
{
|
||||||
view.SetBestBlock(pindex->GetBlockHash());
|
view.SetBestBlock(pindex->GetBlockHash());
|
||||||
return true;
|
trieCache.setBestBlock(pindex->GetBlockHash());
|
||||||
|
}
|
||||||
|
//return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool fScriptChecks = true;
|
bool fScriptChecks = true;
|
||||||
|
@ -2278,7 +2462,11 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
|
||||||
// before the first had been spent. Since those coinbases are sufficiently buried its no longer possible to create further
|
// before the first had been spent. Since those coinbases are sufficiently buried its no longer possible to create further
|
||||||
// duplicate transactions descending from the known pairs either.
|
// duplicate transactions descending from the known pairs either.
|
||||||
// If we're on the known chain at height greater than where BIP34 activated, we can save the db accesses needed for the BIP30 check.
|
// If we're on the known chain at height greater than where BIP34 activated, we can save the db accesses needed for the BIP30 check.
|
||||||
CBlockIndex *pindexBIP34height = pindex->pprev->GetAncestor(chainparams.GetConsensus().BIP34Height);
|
CBlockIndex *pindexBIP34height = NULL;
|
||||||
|
if (pindex->pprev)
|
||||||
|
{
|
||||||
|
pindexBIP34height = pindex->pprev->GetAncestor(chainparams.GetConsensus().BIP34Height);
|
||||||
|
}
|
||||||
//Only continue to enforce if we're below BIP34 activation height or the block hash at that height doesn't correspond.
|
//Only continue to enforce if we're below BIP34 activation height or the block hash at that height doesn't correspond.
|
||||||
fEnforceBIP30 = fEnforceBIP30 && (!pindexBIP34height || !(pindexBIP34height->GetBlockHash() == chainparams.GetConsensus().BIP34Hash));
|
fEnforceBIP30 = fEnforceBIP30 && (!pindexBIP34height || !(pindexBIP34height->GetBlockHash() == chainparams.GetConsensus().BIP34Hash));
|
||||||
|
|
||||||
|
@ -2316,6 +2504,15 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
|
||||||
nLockTimeFlags |= LOCKTIME_VERIFY_SEQUENCE;
|
nLockTimeFlags |= LOCKTIME_VERIFY_SEQUENCE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// v 13 LBRYcrd hard fork to extend expiration time
|
||||||
|
if (pindex->nHeight == Params().GetConsensus().nExtendedClaimExpirationForkHeight)
|
||||||
|
{
|
||||||
|
LogPrintf("Incremented past the extended claim expiration hard fork height");
|
||||||
|
pclaimTrie->setExpirationTime(chainparams.GetConsensus().GetExpirationTime(pindex->nHeight));
|
||||||
|
trieCache.forkForExpirationChange(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int64_t nTime2 = GetTimeMicros(); nTimeForks += nTime2 - nTime1;
|
int64_t nTime2 = GetTimeMicros(); nTimeForks += nTime2 - nTime1;
|
||||||
LogPrint("bench", " - Fork checks: %.2fms [%.2fs]\n", 0.001 * (nTime2 - nTime1), nTimeForks * 0.000001);
|
LogPrint("bench", " - Fork checks: %.2fms [%.2fs]\n", 0.001 * (nTime2 - nTime1), nTimeForks * 0.000001);
|
||||||
|
|
||||||
|
@ -2341,6 +2538,8 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
|
||||||
return state.DoS(100, error("ConnectBlock(): too many sigops"),
|
return state.DoS(100, error("ConnectBlock(): too many sigops"),
|
||||||
REJECT_INVALID, "bad-blk-sigops");
|
REJECT_INVALID, "bad-blk-sigops");
|
||||||
|
|
||||||
|
std::map<unsigned int, unsigned int> mClaimUndoHeights;
|
||||||
|
|
||||||
if (!tx.IsCoinBase())
|
if (!tx.IsCoinBase())
|
||||||
{
|
{
|
||||||
if (!view.HaveInputs(tx))
|
if (!view.HaveInputs(tx))
|
||||||
|
@ -2379,26 +2578,182 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
|
||||||
return error("ConnectBlock(): CheckInputs on %s failed with %s",
|
return error("ConnectBlock(): CheckInputs on %s failed with %s",
|
||||||
tx.GetHash().ToString(), FormatStateMessage(state));
|
tx.GetHash().ToString(), FormatStateMessage(state));
|
||||||
control.Add(vChecks);
|
control.Add(vChecks);
|
||||||
|
|
||||||
|
// To handle claim updates, stick all claims found in the inputs into a map of
|
||||||
|
// name: (txhash, nOut). When running through the outputs, if any claim's
|
||||||
|
// name is found in the map, send the name's txhash and nOut to the trie cache,
|
||||||
|
// and then remove the name: (txhash, nOut) mapping from the map.
|
||||||
|
// If there are two or more claims in the inputs with the same name, only
|
||||||
|
// use the first.
|
||||||
|
|
||||||
|
typedef std::vector<std::pair<std::string, uint160> > spentClaimsType;
|
||||||
|
spentClaimsType spentClaims;
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < tx.vin.size(); ++i)
|
||||||
|
{
|
||||||
|
const CTxIn& txin = tx.vin[i];
|
||||||
|
const CCoins* coins = view.AccessCoins(txin.prevout.hash);
|
||||||
|
assert(coins);
|
||||||
|
|
||||||
|
int op;
|
||||||
|
std::vector<std::vector<unsigned char> > vvchParams;
|
||||||
|
if (DecodeClaimScript(coins->vout[txin.prevout.n].scriptPubKey, op, vvchParams))
|
||||||
|
{
|
||||||
|
if (op == OP_CLAIM_NAME || op == OP_UPDATE_CLAIM)
|
||||||
|
{
|
||||||
|
uint160 claimId;
|
||||||
|
if (op == OP_CLAIM_NAME)
|
||||||
|
{
|
||||||
|
assert(vvchParams.size() == 2);
|
||||||
|
std::string name(vvchParams[0].begin(), vvchParams[0].end());
|
||||||
|
std::string value(vvchParams[1].begin(), vvchParams[1].end());
|
||||||
|
claimId = ClaimIdHash(txin.prevout.hash, txin.prevout.n);
|
||||||
|
LogPrintf("+++ %s[%lu]: OP_CLAIM_NAME \"%s\" = \"%s\" with claimId %s and tx prevout %s at index %d\n",
|
||||||
|
__func__, pindex->nHeight, name, SanitizeString(value),
|
||||||
|
claimId.GetHex(), txin.prevout.hash.GetHex(), txin.prevout.n);
|
||||||
|
}
|
||||||
|
else if (op == OP_UPDATE_CLAIM)
|
||||||
|
{
|
||||||
|
assert(vvchParams.size() == 3);
|
||||||
|
std::string name(vvchParams[0].begin(), vvchParams[0].end());
|
||||||
|
std::string value(vvchParams[1].begin(), vvchParams[1].end());
|
||||||
|
claimId = uint160(vvchParams[1]);
|
||||||
|
LogPrintf("+++ %s[%lu]: OP_UPDATE_CLAIM \"%s\" = \"%s\" with claimId %s and tx prevout %s at index %d\n",
|
||||||
|
__func__, pindex->nHeight, name, SanitizeString(value),
|
||||||
|
claimId.GetHex(), txin.prevout.hash.GetHex(), txin.prevout.n);
|
||||||
|
}
|
||||||
|
std::string name(vvchParams[0].begin(), vvchParams[0].end());
|
||||||
|
int nValidAtHeight;
|
||||||
|
LogPrintf("%s: Removing %s from the claim trie. Tx: %s, nOut: %d\n", __func__, name, txin.prevout.hash.GetHex(), txin.prevout.n);
|
||||||
|
if (trieCache.spendClaim(name, COutPoint(txin.prevout.hash, txin.prevout.n), coins->nHeight, nValidAtHeight))
|
||||||
|
{
|
||||||
|
mClaimUndoHeights[i] = nValidAtHeight;
|
||||||
|
std::pair<std::string, uint160> entry(name, claimId);
|
||||||
|
spentClaims.push_back(entry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (op == OP_SUPPORT_CLAIM)
|
||||||
|
{
|
||||||
|
assert(vvchParams.size() == 2);
|
||||||
|
std::string name(vvchParams[0].begin(), vvchParams[0].end());
|
||||||
|
uint160 supportedClaimId(vvchParams[1]);
|
||||||
|
LogPrintf("+++ %s[%lu]: OP_SUPPORT_CLAIM \"%s\" with claimId %s and tx prevout %s at index %d\n",
|
||||||
|
__func__, pindex->nHeight, name,
|
||||||
|
supportedClaimId.GetHex(), txin.prevout.hash.GetHex(), txin.prevout.n);
|
||||||
|
int nValidAtHeight;
|
||||||
|
LogPrintf("%s: Removing support for %s in %s. Tx: %s, nOut: %d, removed txid: %s\n", __func__, supportedClaimId.ToString(), name, txin.prevout.hash.ToString(), txin.prevout.n,tx.GetHash().ToString());
|
||||||
|
if (trieCache.spendSupport(name, COutPoint(txin.prevout.hash, txin.prevout.n), coins->nHeight, nValidAtHeight))
|
||||||
|
{
|
||||||
|
mClaimUndoHeights[i] = nValidAtHeight;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < tx.vout.size(); ++i)
|
||||||
|
{
|
||||||
|
const CTxOut& txout = tx.vout[i];
|
||||||
|
|
||||||
|
int op;
|
||||||
|
std::vector<std::vector<unsigned char> > vvchParams;
|
||||||
|
if (DecodeClaimScript(txout.scriptPubKey, op, vvchParams))
|
||||||
|
{
|
||||||
|
if (op == OP_CLAIM_NAME)
|
||||||
|
{
|
||||||
|
assert(vvchParams.size() == 2);
|
||||||
|
std::string name(vvchParams[0].begin(), vvchParams[0].end());
|
||||||
|
LogPrintf("%s: Inserting %s into the claim trie. Tx: %s, nOut: %d\n", __func__, name, tx.GetHash().GetHex(), i);
|
||||||
|
if (!trieCache.addClaim(name, COutPoint(tx.GetHash(), i), ClaimIdHash(tx.GetHash(), i), txout.nValue, pindex->nHeight))
|
||||||
|
{
|
||||||
|
LogPrintf("%s: Something went wrong inserting the claim\n", __func__);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (op == OP_UPDATE_CLAIM)
|
||||||
|
{
|
||||||
|
assert(vvchParams.size() == 3);
|
||||||
|
std::string name(vvchParams[0].begin(), vvchParams[0].end());
|
||||||
|
uint160 claimId(vvchParams[1]);
|
||||||
|
LogPrintf("%s: Got a claim update. Name: %s, claimId: %s, new txid: %s, nOut: %d\n", __func__, name, claimId.GetHex(), tx.GetHash().GetHex(), i);
|
||||||
|
spentClaimsType::iterator itSpent;
|
||||||
|
for (itSpent = spentClaims.begin(); itSpent != spentClaims.end(); ++itSpent)
|
||||||
|
{
|
||||||
|
if (itSpent->first == name && itSpent->second == claimId)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (itSpent != spentClaims.end())
|
||||||
|
{
|
||||||
|
spentClaims.erase(itSpent);
|
||||||
|
if (!trieCache.addClaim(name, COutPoint(tx.GetHash(), i), claimId, txout.nValue, pindex->nHeight))
|
||||||
|
{
|
||||||
|
LogPrintf("%s: Something went wrong updating the claim\n", __func__);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (op == OP_SUPPORT_CLAIM)
|
||||||
|
{
|
||||||
|
assert(vvchParams.size() == 2);
|
||||||
|
std::string name(vvchParams[0].begin(), vvchParams[0].end());
|
||||||
|
uint160 supportedClaimId(vvchParams[1]);
|
||||||
|
if (!trieCache.addSupport(name, COutPoint(tx.GetHash(), i), txout.nValue, supportedClaimId, pindex->nHeight))
|
||||||
|
{
|
||||||
|
LogPrintf("%s: Something went wrong inserting the support\n", __func__);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CTxUndo undoDummy;
|
CTxUndo undoDummy;
|
||||||
if (i > 0) {
|
if (i > 0)
|
||||||
|
{
|
||||||
blockundo.vtxundo.push_back(CTxUndo());
|
blockundo.vtxundo.push_back(CTxUndo());
|
||||||
}
|
}
|
||||||
UpdateCoins(tx, state, view, i == 0 ? undoDummy : blockundo.vtxundo.back(), pindex->nHeight);
|
UpdateCoins(tx, state, view, i == 0 ? undoDummy : blockundo.vtxundo.back(), pindex->nHeight);
|
||||||
|
if (i > 0 && !mClaimUndoHeights.empty())
|
||||||
|
{
|
||||||
|
std::vector<CTxInUndo>& txinUndos = blockundo.vtxundo.back().vprevout;
|
||||||
|
for (std::map<unsigned int, unsigned int>::iterator itHeight = mClaimUndoHeights.begin(); itHeight != mClaimUndoHeights.end(); ++itHeight)
|
||||||
|
{
|
||||||
|
txinUndos[itHeight->first].nClaimValidHeight = itHeight->second;
|
||||||
|
txinUndos[itHeight->first].fIsClaim = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// The CTxUndo vector contains the heights at which claims should be put into the trie.
|
||||||
|
// This is necessary because some claims are inserted immediately into the trie, and
|
||||||
|
// others are inserted after a delay, depending on the state of the claim trie at the time
|
||||||
|
// that the claim was originally inserted into the blockchain. That state will not be
|
||||||
|
// available when and if this block is disconnected.
|
||||||
|
// It also contains whether or not any given txin represents a claim that should
|
||||||
|
// be put back into the trie. If we didn't find a claim or support in the trie
|
||||||
|
// or cache when trying to spend it, we shouldn't try to put a claim or support back
|
||||||
|
// in. Some OP_UPDATE_CLAIM's, for example, may be invalid, and so may never have been
|
||||||
|
// inserted into the trie in the first place.
|
||||||
|
|
||||||
vPos.push_back(std::make_pair(tx.GetHash(), pos));
|
vPos.push_back(std::make_pair(tx.GetHash(), pos));
|
||||||
pos.nTxOffset += ::GetSerializeSize(tx, SER_DISK, CLIENT_VERSION);
|
pos.nTxOffset += ::GetSerializeSize(tx, SER_DISK, CLIENT_VERSION);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
assert(trieCache.incrementBlock(blockundo.insertUndo, blockundo.expireUndo, blockundo.insertSupportUndo, blockundo.expireSupportUndo, blockundo.takeoverHeightUndo));
|
||||||
|
|
||||||
|
if (trieCache.getMerkleHash() != block.hashClaimTrie)
|
||||||
|
return state.DoS(100,
|
||||||
|
error("ConnectBlock() : the merkle root of the claim trie does not match "
|
||||||
|
"(actual=%s vs block=%s)", trieCache.getMerkleHash().GetHex(),
|
||||||
|
block.hashClaimTrie.GetHex()), REJECT_INVALID, "bad-claim-merkle-hash");
|
||||||
|
|
||||||
int64_t nTime3 = GetTimeMicros(); nTimeConnect += nTime3 - nTime2;
|
int64_t nTime3 = GetTimeMicros(); nTimeConnect += nTime3 - nTime2;
|
||||||
LogPrint("bench", " - Connect %u transactions: %.2fms (%.3fms/tx, %.3fms/txin) [%.2fs]\n", (unsigned)block.vtx.size(), 0.001 * (nTime3 - nTime2), 0.001 * (nTime3 - nTime2) / block.vtx.size(), nInputs <= 1 ? 0 : 0.001 * (nTime3 - nTime2) / (nInputs-1), nTimeConnect * 0.000001);
|
LogPrint("bench", " - Connect %u transactions: %.2fms (%.3fms/tx, %.3fms/txin) [%.2fs]\n", (unsigned)block.vtx.size(), 0.001 * (nTime3 - nTime2), 0.001 * (nTime3 - nTime2) / block.vtx.size(), nInputs <= 1 ? 0 : 0.001 * (nTime3 - nTime2) / (nInputs-1), nTimeConnect * 0.000001);
|
||||||
|
|
||||||
CAmount blockReward = nFees + GetBlockSubsidy(pindex->nHeight, chainparams.GetConsensus());
|
CAmount blockReward = nFees + GetBlockSubsidy(pindex->nHeight, chainparams.GetConsensus());
|
||||||
if (block.vtx[0].GetValueOut() > blockReward)
|
if (block.vtx[0].GetValueOut() > blockReward)
|
||||||
|
{
|
||||||
return state.DoS(100,
|
return state.DoS(100,
|
||||||
error("ConnectBlock(): coinbase pays too much (actual=%d vs limit=%d)",
|
error("ConnectBlock(): coinbase pays too much (actual=%d vs limit=%d)",
|
||||||
block.vtx[0].GetValueOut(), blockReward),
|
block.vtx[0].GetValueOut(), blockReward),
|
||||||
REJECT_INVALID, "bad-cb-amount");
|
REJECT_INVALID, "bad-cb-amount");
|
||||||
|
}
|
||||||
|
|
||||||
if (!control.Wait())
|
if (!control.Wait())
|
||||||
return state.DoS(100, false);
|
return state.DoS(100, false);
|
||||||
|
@ -2409,7 +2764,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
// Write undo information to disk
|
// Write undo information to disk
|
||||||
if (pindex->GetUndoPos().IsNull() || !pindex->IsValid(BLOCK_VALID_SCRIPTS))
|
if (!(block.GetHash() == Params().GetConsensus().hashGenesisBlock) && (pindex->GetUndoPos().IsNull() || !pindex->IsValid(BLOCK_VALID_SCRIPTS)))
|
||||||
{
|
{
|
||||||
if (pindex->GetUndoPos().IsNull()) {
|
if (pindex->GetUndoPos().IsNull()) {
|
||||||
CDiskBlockPos pos;
|
CDiskBlockPos pos;
|
||||||
|
@ -2433,6 +2788,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
|
||||||
|
|
||||||
// add this block to the view's block chain
|
// add this block to the view's block chain
|
||||||
view.SetBestBlock(pindex->GetBlockHash());
|
view.SetBestBlock(pindex->GetBlockHash());
|
||||||
|
trieCache.setBestBlock(pindex->GetBlockHash());
|
||||||
|
|
||||||
int64_t nTime5 = GetTimeMicros(); nTimeIndex += nTime5 - nTime4;
|
int64_t nTime5 = GetTimeMicros(); nTimeIndex += nTime5 - nTime4;
|
||||||
LogPrint("bench", " - Index writing: %.2fms [%.2fs]\n", 0.001 * (nTime5 - nTime4), nTimeIndex * 0.000001);
|
LogPrint("bench", " - Index writing: %.2fms [%.2fs]\n", 0.001 * (nTime5 - nTime4), nTimeIndex * 0.000001);
|
||||||
|
@ -2543,6 +2899,8 @@ bool static FlushStateToDisk(CValidationState &state, FlushStateMode mode) {
|
||||||
if (!CheckDiskSpace(128 * 2 * 2 * pcoinsTip->GetCacheSize()))
|
if (!CheckDiskSpace(128 * 2 * 2 * pcoinsTip->GetCacheSize()))
|
||||||
return state.Error("out of disk space");
|
return state.Error("out of disk space");
|
||||||
// Flush the chainstate (which may refer to block index entries).
|
// Flush the chainstate (which may refer to block index entries).
|
||||||
|
if (!pclaimTrie->WriteToDisk())
|
||||||
|
return AbortNode("Failed to write to claim trie database");
|
||||||
if (!pcoinsTip->Flush())
|
if (!pcoinsTip->Flush())
|
||||||
return AbortNode(state, "Failed to write to coin database");
|
return AbortNode(state, "Failed to write to coin database");
|
||||||
nLastFlush = nNow;
|
nLastFlush = nNow;
|
||||||
|
@ -2641,9 +2999,12 @@ bool static DisconnectTip(CValidationState& state, const Consensus::Params& cons
|
||||||
int64_t nStart = GetTimeMicros();
|
int64_t nStart = GetTimeMicros();
|
||||||
{
|
{
|
||||||
CCoinsViewCache view(pcoinsTip);
|
CCoinsViewCache view(pcoinsTip);
|
||||||
if (!DisconnectBlock(block, state, pindexDelete, view))
|
CClaimTrieCache trieCache(pclaimTrie);
|
||||||
|
if (!DisconnectBlock(block, state, pindexDelete, view, trieCache))
|
||||||
return error("DisconnectTip(): DisconnectBlock %s failed", pindexDelete->GetBlockHash().ToString());
|
return error("DisconnectTip(): DisconnectBlock %s failed", pindexDelete->GetBlockHash().ToString());
|
||||||
assert(view.Flush());
|
assert(view.Flush());
|
||||||
|
assert(trieCache.flush());
|
||||||
|
assert(pindexDelete->pprev->hashClaimTrie == trieCache.getMerkleHash());
|
||||||
}
|
}
|
||||||
LogPrint("bench", "- Disconnect block: %.2fms\n", (GetTimeMicros() - nStart) * 0.001);
|
LogPrint("bench", "- Disconnect block: %.2fms\n", (GetTimeMicros() - nStart) * 0.001);
|
||||||
// Write the chain state to disk, if necessary.
|
// Write the chain state to disk, if necessary.
|
||||||
|
@ -2704,7 +3065,8 @@ bool static ConnectTip(CValidationState& state, const CChainParams& chainparams,
|
||||||
LogPrint("bench", " - Load block from disk: %.2fms [%.2fs]\n", (nTime2 - nTime1) * 0.001, nTimeReadFromDisk * 0.000001);
|
LogPrint("bench", " - Load block from disk: %.2fms [%.2fs]\n", (nTime2 - nTime1) * 0.001, nTimeReadFromDisk * 0.000001);
|
||||||
{
|
{
|
||||||
CCoinsViewCache view(pcoinsTip);
|
CCoinsViewCache view(pcoinsTip);
|
||||||
bool rv = ConnectBlock(*pblock, state, pindexNew, view);
|
CClaimTrieCache trieCache(pclaimTrie);
|
||||||
|
bool rv = ConnectBlock(*pblock, state, pindexNew, view, trieCache);
|
||||||
GetMainSignals().BlockChecked(*pblock, state);
|
GetMainSignals().BlockChecked(*pblock, state);
|
||||||
if (!rv) {
|
if (!rv) {
|
||||||
if (state.IsInvalid())
|
if (state.IsInvalid())
|
||||||
|
@ -2715,6 +3077,7 @@ bool static ConnectTip(CValidationState& state, const CChainParams& chainparams,
|
||||||
nTime3 = GetTimeMicros(); nTimeConnectTotal += nTime3 - nTime2;
|
nTime3 = GetTimeMicros(); nTimeConnectTotal += nTime3 - nTime2;
|
||||||
LogPrint("bench", " - Connect total: %.2fms [%.2fs]\n", (nTime3 - nTime2) * 0.001, nTimeConnectTotal * 0.000001);
|
LogPrint("bench", " - Connect total: %.2fms [%.2fs]\n", (nTime3 - nTime2) * 0.001, nTimeConnectTotal * 0.000001);
|
||||||
assert(view.Flush());
|
assert(view.Flush());
|
||||||
|
assert(trieCache.flush());
|
||||||
}
|
}
|
||||||
int64_t nTime4 = GetTimeMicros(); nTimeFlush += nTime4 - nTime3;
|
int64_t nTime4 = GetTimeMicros(); nTimeFlush += nTime4 - nTime3;
|
||||||
LogPrint("bench", " - Flush: %.2fms [%.2fs]\n", (nTime4 - nTime3) * 0.001, nTimeFlush * 0.000001);
|
LogPrint("bench", " - Flush: %.2fms [%.2fs]\n", (nTime4 - nTime3) * 0.001, nTimeFlush * 0.000001);
|
||||||
|
@ -3216,7 +3579,7 @@ bool FindUndoPos(CValidationState &state, int nFile, CDiskBlockPos &pos, unsigne
|
||||||
bool CheckBlockHeader(const CBlockHeader& block, CValidationState& state, bool fCheckPOW)
|
bool CheckBlockHeader(const CBlockHeader& block, CValidationState& state, bool fCheckPOW)
|
||||||
{
|
{
|
||||||
// Check proof of work matches claimed amount
|
// Check proof of work matches claimed amount
|
||||||
if (fCheckPOW && !CheckProofOfWork(block.GetHash(), block.nBits, Params().GetConsensus()))
|
if (fCheckPOW && !CheckProofOfWork(block.GetPoWHash(), block.nBits, Params().GetConsensus()))
|
||||||
return state.DoS(50, false, REJECT_INVALID, "high-hash", false, "proof of work failed");
|
return state.DoS(50, false, REJECT_INVALID, "high-hash", false, "proof of work failed");
|
||||||
|
|
||||||
// Check timestamp
|
// Check timestamp
|
||||||
|
@ -3513,6 +3876,7 @@ bool TestBlockValidity(CValidationState& state, const CChainParams& chainparams,
|
||||||
return error("%s: CheckIndexAgainstCheckpoint(): %s", __func__, state.GetRejectReason().c_str());
|
return error("%s: CheckIndexAgainstCheckpoint(): %s", __func__, state.GetRejectReason().c_str());
|
||||||
|
|
||||||
CCoinsViewCache viewNew(pcoinsTip);
|
CCoinsViewCache viewNew(pcoinsTip);
|
||||||
|
CClaimTrieCache trieCache(pclaimTrie);
|
||||||
CBlockIndex indexDummy(block);
|
CBlockIndex indexDummy(block);
|
||||||
indexDummy.pprev = pindexPrev;
|
indexDummy.pprev = pindexPrev;
|
||||||
indexDummy.nHeight = pindexPrev->nHeight + 1;
|
indexDummy.nHeight = pindexPrev->nHeight + 1;
|
||||||
|
@ -3524,7 +3888,7 @@ bool TestBlockValidity(CValidationState& state, const CChainParams& chainparams,
|
||||||
return error("%s: Consensus::CheckBlock: %s", __func__, FormatStateMessage(state));
|
return error("%s: Consensus::CheckBlock: %s", __func__, FormatStateMessage(state));
|
||||||
if (!ContextualCheckBlock(block, state, pindexPrev))
|
if (!ContextualCheckBlock(block, state, pindexPrev))
|
||||||
return error("%s: Consensus::ContextualCheckBlock: %s", __func__, FormatStateMessage(state));
|
return error("%s: Consensus::ContextualCheckBlock: %s", __func__, FormatStateMessage(state));
|
||||||
if (!ConnectBlock(block, state, &indexDummy, viewNew, true))
|
if (!ConnectBlock(block, state, &indexDummy, viewNew, trieCache, true))
|
||||||
return false;
|
return false;
|
||||||
assert(state.IsValid());
|
assert(state.IsValid());
|
||||||
|
|
||||||
|
@ -3837,6 +4201,7 @@ bool CVerifyDB::VerifyDB(const CChainParams& chainparams, CCoinsView *coinsview,
|
||||||
nCheckLevel = std::max(0, std::min(4, nCheckLevel));
|
nCheckLevel = std::max(0, std::min(4, nCheckLevel));
|
||||||
LogPrintf("Verifying last %i blocks at level %i\n", nCheckDepth, nCheckLevel);
|
LogPrintf("Verifying last %i blocks at level %i\n", nCheckDepth, nCheckLevel);
|
||||||
CCoinsViewCache coins(coinsview);
|
CCoinsViewCache coins(coinsview);
|
||||||
|
CClaimTrieCache trieCache(pclaimTrie);
|
||||||
CBlockIndex* pindexState = chainActive.Tip();
|
CBlockIndex* pindexState = chainActive.Tip();
|
||||||
CBlockIndex* pindexFailure = NULL;
|
CBlockIndex* pindexFailure = NULL;
|
||||||
int nGoodTransactions = 0;
|
int nGoodTransactions = 0;
|
||||||
|
@ -3867,7 +4232,7 @@ bool CVerifyDB::VerifyDB(const CChainParams& chainparams, CCoinsView *coinsview,
|
||||||
// check level 3: check for inconsistencies during memory-only disconnect of tip blocks
|
// check level 3: check for inconsistencies during memory-only disconnect of tip blocks
|
||||||
if (nCheckLevel >= 3 && pindex == pindexState && (coins.DynamicMemoryUsage() + pcoinsTip->DynamicMemoryUsage()) <= nCoinCacheUsage) {
|
if (nCheckLevel >= 3 && pindex == pindexState && (coins.DynamicMemoryUsage() + pcoinsTip->DynamicMemoryUsage()) <= nCoinCacheUsage) {
|
||||||
bool fClean = true;
|
bool fClean = true;
|
||||||
if (!DisconnectBlock(block, state, pindex, coins, &fClean))
|
if (!DisconnectBlock(block, state, pindex, coins, trieCache, &fClean))
|
||||||
return error("VerifyDB(): *** irrecoverable inconsistency in block data at %d, hash=%s", pindex->nHeight, pindex->GetBlockHash().ToString());
|
return error("VerifyDB(): *** irrecoverable inconsistency in block data at %d, hash=%s", pindex->nHeight, pindex->GetBlockHash().ToString());
|
||||||
pindexState = pindex->pprev;
|
pindexState = pindex->pprev;
|
||||||
if (!fClean) {
|
if (!fClean) {
|
||||||
|
@ -3892,7 +4257,7 @@ bool CVerifyDB::VerifyDB(const CChainParams& chainparams, CCoinsView *coinsview,
|
||||||
CBlock block;
|
CBlock block;
|
||||||
if (!ReadBlockFromDisk(block, pindex, chainparams.GetConsensus()))
|
if (!ReadBlockFromDisk(block, pindex, chainparams.GetConsensus()))
|
||||||
return error("VerifyDB(): *** ReadBlockFromDisk failed at %d, hash=%s", pindex->nHeight, pindex->GetBlockHash().ToString());
|
return error("VerifyDB(): *** ReadBlockFromDisk failed at %d, hash=%s", pindex->nHeight, pindex->GetBlockHash().ToString());
|
||||||
if (!ConnectBlock(block, state, pindex, coins))
|
if (!ConnectBlock(block, state, pindex, coins, trieCache))
|
||||||
return error("VerifyDB(): *** found unconnectable block at %d, hash=%s", pindex->nHeight, pindex->GetBlockHash().ToString());
|
return error("VerifyDB(): *** found unconnectable block at %d, hash=%s", pindex->nHeight, pindex->GetBlockHash().ToString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3902,6 +4267,42 @@ bool CVerifyDB::VerifyDB(const CChainParams& chainparams, CCoinsView *coinsview,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool GetProofForName(const CBlockIndex* pindexProof, const std::string& name, CClaimTrieProof& proof)
|
||||||
|
{
|
||||||
|
AssertLockHeld(cs_main);
|
||||||
|
if (!chainActive.Contains(pindexProof))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
CCoinsViewCache coins(pcoinsTip);
|
||||||
|
CClaimTrieCache trieCache(pclaimTrie);
|
||||||
|
CBlockIndex* pindexState = chainActive.Tip();
|
||||||
|
CValidationState state;
|
||||||
|
for (CBlockIndex *pindex = chainActive.Tip(); pindex && pindex->pprev && pindexState != pindexProof; pindex=pindex->pprev)
|
||||||
|
{
|
||||||
|
boost::this_thread::interruption_point();
|
||||||
|
CBlock block;
|
||||||
|
if (!ReadBlockFromDisk(block, pindex, Params().GetConsensus()))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (pindex == pindexState && (coins.DynamicMemoryUsage() + pcoinsTip->DynamicMemoryUsage()) <= nCoinCacheUsage)
|
||||||
|
{
|
||||||
|
bool fClean = true;
|
||||||
|
if (!DisconnectBlock(block, state, pindex, coins, trieCache, &fClean))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
pindexState = pindex->pprev;
|
||||||
|
}
|
||||||
|
if (ShutdownRequested())
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
assert(pindexState == pindexProof);
|
||||||
|
proof = trieCache.getProofForName(name);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void UnloadBlockIndex()
|
void UnloadBlockIndex()
|
||||||
{
|
{
|
||||||
LOCK(cs_main);
|
LOCK(cs_main);
|
||||||
|
@ -4043,7 +4444,7 @@ bool LoadExternalBlockFile(const CChainParams& chainparams, FILE* fileIn, CDiskB
|
||||||
}
|
}
|
||||||
|
|
||||||
// process in case the block isn't known yet
|
// process in case the block isn't known yet
|
||||||
if (mapBlockIndex.count(hash) == 0 || (mapBlockIndex[hash]->nStatus & BLOCK_HAVE_DATA) == 0) {
|
if (hash != chainparams.GetConsensus().hashGenesisBlock && (mapBlockIndex.count(hash) == 0 || (mapBlockIndex[hash]->nStatus & BLOCK_HAVE_DATA) == 0)) {
|
||||||
CValidationState state;
|
CValidationState state;
|
||||||
if (ProcessNewBlock(state, chainparams, NULL, &block, true, dbp))
|
if (ProcessNewBlock(state, chainparams, NULL, &block, true, dbp))
|
||||||
nLoaded++;
|
nLoaded++;
|
||||||
|
|
15
src/main.h
|
@ -14,6 +14,7 @@
|
||||||
#include "chain.h"
|
#include "chain.h"
|
||||||
#include "coins.h"
|
#include "coins.h"
|
||||||
#include "net.h"
|
#include "net.h"
|
||||||
|
#include "claimtrie.h"
|
||||||
#include "script/script_error.h"
|
#include "script/script_error.h"
|
||||||
#include "sync.h"
|
#include "sync.h"
|
||||||
#include "versionbits.h"
|
#include "versionbits.h"
|
||||||
|
@ -49,7 +50,7 @@ static const bool DEFAULT_WHITELISTFORCERELAY = true;
|
||||||
/** Default for -minrelaytxfee, minimum relay fee for transactions */
|
/** Default for -minrelaytxfee, minimum relay fee for transactions */
|
||||||
static const unsigned int DEFAULT_MIN_RELAY_TX_FEE = 1000;
|
static const unsigned int DEFAULT_MIN_RELAY_TX_FEE = 1000;
|
||||||
//! -maxtxfee default
|
//! -maxtxfee default
|
||||||
static const CAmount DEFAULT_TRANSACTION_MAXFEE = 0.1 * COIN;
|
static const CAmount DEFAULT_TRANSACTION_MAXFEE = 1 * COIN;
|
||||||
//! Discourage users to set fees higher than this amount (in satoshis) per kB
|
//! Discourage users to set fees higher than this amount (in satoshis) per kB
|
||||||
static const CAmount HIGH_TX_FEE_PER_KB = 0.01 * COIN;
|
static const CAmount HIGH_TX_FEE_PER_KB = 0.01 * COIN;
|
||||||
//! -maxtxfee will warn if called with a higher fee than this amount (in satoshis)
|
//! -maxtxfee will warn if called with a higher fee than this amount (in satoshis)
|
||||||
|
@ -162,6 +163,9 @@ extern size_t nCoinCacheUsage;
|
||||||
extern CFeeRate minRelayTxFee;
|
extern CFeeRate minRelayTxFee;
|
||||||
/** Absolute maximum transaction fee (in satoshis) used by wallet and mempool (rejects high fee in sendrawtransaction) */
|
/** Absolute maximum transaction fee (in satoshis) used by wallet and mempool (rejects high fee in sendrawtransaction) */
|
||||||
extern CAmount maxTxFee;
|
extern CAmount maxTxFee;
|
||||||
|
/** Used to calculate minimum fee for claim trie transactions **/
|
||||||
|
extern CAmount minFeePerNameClaimChar;
|
||||||
|
|
||||||
/** If the tip is older than this (in seconds), the node is considered to be in initial block download. */
|
/** If the tip is older than this (in seconds), the node is considered to be in initial block download. */
|
||||||
extern int64_t nMaxTipAge;
|
extern int64_t nMaxTipAge;
|
||||||
extern bool fEnableReplacement;
|
extern bool fEnableReplacement;
|
||||||
|
@ -221,6 +225,8 @@ FILE* OpenBlockFile(const CDiskBlockPos &pos, bool fReadOnly = false);
|
||||||
FILE* OpenUndoFile(const CDiskBlockPos &pos, bool fReadOnly = false);
|
FILE* OpenUndoFile(const CDiskBlockPos &pos, bool fReadOnly = false);
|
||||||
/** Translation to a filesystem path */
|
/** Translation to a filesystem path */
|
||||||
boost::filesystem::path GetBlockPosFilename(const CDiskBlockPos &pos, const char *prefix);
|
boost::filesystem::path GetBlockPosFilename(const CDiskBlockPos &pos, const char *prefix);
|
||||||
|
/** Get a cryptographic proof that a name maps to a value **/
|
||||||
|
bool GetProofForName(const CBlockIndex* pindexProof, const std::string& name, CClaimTrieProof& proof);
|
||||||
/** Import blocks from an external file */
|
/** Import blocks from an external file */
|
||||||
bool LoadExternalBlockFile(const CChainParams& chainparams, FILE* fileIn, CDiskBlockPos *dbp = NULL);
|
bool LoadExternalBlockFile(const CChainParams& chainparams, FILE* fileIn, CDiskBlockPos *dbp = NULL);
|
||||||
/** Initialize a new block tree database + block data on disk */
|
/** Initialize a new block tree database + block data on disk */
|
||||||
|
@ -458,13 +464,13 @@ bool ContextualCheckBlock(const CBlock& block, CValidationState& state, CBlockIn
|
||||||
/** Apply the effects of this block (with given index) on the UTXO set represented by coins.
|
/** Apply the effects of this block (with given index) on the UTXO set represented by coins.
|
||||||
* Validity checks that depend on the UTXO set are also done; ConnectBlock()
|
* Validity checks that depend on the UTXO set are also done; ConnectBlock()
|
||||||
* can fail if those validity checks fail (among other reasons). */
|
* can fail if those validity checks fail (among other reasons). */
|
||||||
bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pindex, CCoinsViewCache& coins, bool fJustCheck = false);
|
bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pindex, CCoinsViewCache& coins, CClaimTrieCache& trieCache, bool fJustCheck = false);
|
||||||
|
|
||||||
/** Undo the effects of this block (with given index) on the UTXO set represented by coins.
|
/** Undo the effects of this block (with given index) on the UTXO set represented by coins.
|
||||||
* In case pfClean is provided, operation will try to be tolerant about errors, and *pfClean
|
* In case pfClean is provided, operation will try to be tolerant about errors, and *pfClean
|
||||||
* will be true if no problems were found. Otherwise, the return value will be false in case
|
* will be true if no problems were found. Otherwise, the return value will be false in case
|
||||||
* of problems. Note that in any case, coins may be modified. */
|
* of problems. Note that in any case, coins may be modified. */
|
||||||
bool DisconnectBlock(const CBlock& block, CValidationState& state, const CBlockIndex* pindex, CCoinsViewCache& coins, bool* pfClean = NULL);
|
bool DisconnectBlock(const CBlock& block, CValidationState& state, const CBlockIndex* pindex, CCoinsViewCache& coins, CClaimTrieCache& trieCache, bool* pfClean = NULL);
|
||||||
|
|
||||||
/** Check a block is completely valid from start to finish (only works on top of our current best block, with cs_main held) */
|
/** Check a block is completely valid from start to finish (only works on top of our current best block, with cs_main held) */
|
||||||
bool TestBlockValidity(CValidationState& state, const CChainParams& chainparams, const CBlock& block, CBlockIndex* pindexPrev, bool fCheckPOW = true, bool fCheckMerkleRoot = true);
|
bool TestBlockValidity(CValidationState& state, const CChainParams& chainparams, const CBlock& block, CBlockIndex* pindexPrev, bool fCheckPOW = true, bool fCheckMerkleRoot = true);
|
||||||
|
@ -547,6 +553,9 @@ extern CChain chainActive;
|
||||||
/** Global variable that points to the active CCoinsView (protected by cs_main) */
|
/** Global variable that points to the active CCoinsView (protected by cs_main) */
|
||||||
extern CCoinsViewCache *pcoinsTip;
|
extern CCoinsViewCache *pcoinsTip;
|
||||||
|
|
||||||
|
/** Global variable that points to the active CClaimTrie (protected by cs_main) */
|
||||||
|
extern CClaimTrie *pclaimTrie;
|
||||||
|
|
||||||
/** Global variable that points to the active block tree (protected by cs_main) */
|
/** Global variable that points to the active block tree (protected by cs_main) */
|
||||||
extern CBlockTreeDB *pblocktree;
|
extern CBlockTreeDB *pblocktree;
|
||||||
|
|
||||||
|
|
370
src/miner.cpp
|
@ -14,6 +14,8 @@
|
||||||
#include "consensus/validation.h"
|
#include "consensus/validation.h"
|
||||||
#include "hash.h"
|
#include "hash.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
|
#include "nameclaim.h"
|
||||||
|
#include "claimtrie.h"
|
||||||
#include "net.h"
|
#include "net.h"
|
||||||
#include "policy/policy.h"
|
#include "policy/policy.h"
|
||||||
#include "pow.h"
|
#include "pow.h"
|
||||||
|
@ -130,6 +132,12 @@ CBlockTemplate* CreateNewBlock(const CChainParams& chainparams, const CScript& s
|
||||||
CBlockIndex* pindexPrev = chainActive.Tip();
|
CBlockIndex* pindexPrev = chainActive.Tip();
|
||||||
const int nHeight = pindexPrev->nHeight + 1;
|
const int nHeight = pindexPrev->nHeight + 1;
|
||||||
pblock->nTime = GetAdjustedTime();
|
pblock->nTime = GetAdjustedTime();
|
||||||
|
CCoinsViewCache view(pcoinsTip);
|
||||||
|
if (!pclaimTrie)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
CClaimTrieCache trieCache(pclaimTrie);
|
||||||
const int64_t nMedianTimePast = pindexPrev->GetMedianTimePast();
|
const int64_t nMedianTimePast = pindexPrev->GetMedianTimePast();
|
||||||
|
|
||||||
pblock->nVersion = ComputeBlockVersion(pindexPrev, chainparams.GetConsensus());
|
pblock->nVersion = ComputeBlockVersion(pindexPrev, chainparams.GetConsensus());
|
||||||
|
@ -179,7 +187,9 @@ CBlockTemplate* CreateNewBlock(const CChainParams& chainparams, const CScript& s
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inBlock.count(iter))
|
if (inBlock.count(iter))
|
||||||
|
{
|
||||||
continue; // could have been added to the priorityBlock
|
continue; // could have been added to the priorityBlock
|
||||||
|
}
|
||||||
|
|
||||||
const CTransaction& tx = iter->GetTx();
|
const CTransaction& tx = iter->GetTx();
|
||||||
|
|
||||||
|
@ -224,6 +234,146 @@ CBlockTemplate* CreateNewBlock(const CChainParams& chainparams, const CScript& s
|
||||||
if (!IsFinalTx(tx, nHeight, nLockTimeCutoff))
|
if (!IsFinalTx(tx, nHeight, nLockTimeCutoff))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
typedef std::vector<std::pair<std::string, uint160> > spentClaimsType;
|
||||||
|
spentClaimsType spentClaims;
|
||||||
|
|
||||||
|
BOOST_FOREACH(const CTxIn& txin, tx.vin)
|
||||||
|
{
|
||||||
|
const CCoins* coins = view.AccessCoins(txin.prevout.hash);
|
||||||
|
int nTxinHeight = 0;
|
||||||
|
CScript scriptPubKey;
|
||||||
|
bool fGotCoins = false;
|
||||||
|
if (coins)
|
||||||
|
{
|
||||||
|
if (txin.prevout.n < coins->vout.size())
|
||||||
|
{
|
||||||
|
nTxinHeight = coins->nHeight;
|
||||||
|
scriptPubKey = coins->vout[txin.prevout.n].scriptPubKey;
|
||||||
|
fGotCoins = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else // must be in block or else
|
||||||
|
{
|
||||||
|
BOOST_FOREACH(CTxMemPool::txiter inBlockEntry, inBlock)
|
||||||
|
{
|
||||||
|
CTransaction inBlockTx = inBlockEntry->GetTx();
|
||||||
|
if (inBlockTx.GetHash() == txin.prevout.hash)
|
||||||
|
{
|
||||||
|
if (inBlockTx.vout.size() >= txin.prevout.n)
|
||||||
|
{
|
||||||
|
nTxinHeight = nHeight;
|
||||||
|
scriptPubKey = inBlockTx.vout[txin.prevout.n].scriptPubKey;
|
||||||
|
fGotCoins = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!fGotCoins)
|
||||||
|
{
|
||||||
|
LogPrintf("Tried to include a transaction but could not find the txout it was spending. This is bad. Please send this log file to the maintainers of this program.\n");
|
||||||
|
throw std::runtime_error("Tried to include a transaction but could not find the txout it was spending.");
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::vector<unsigned char> > vvchParams;
|
||||||
|
int op;
|
||||||
|
|
||||||
|
if (DecodeClaimScript(scriptPubKey, op, vvchParams))
|
||||||
|
{
|
||||||
|
if (op == OP_CLAIM_NAME || op == OP_UPDATE_CLAIM)
|
||||||
|
{
|
||||||
|
uint160 claimId;
|
||||||
|
if (op == OP_CLAIM_NAME)
|
||||||
|
{
|
||||||
|
assert(vvchParams.size() == 2);
|
||||||
|
claimId = ClaimIdHash(txin.prevout.hash, txin.prevout.n);
|
||||||
|
}
|
||||||
|
else if (op == OP_UPDATE_CLAIM)
|
||||||
|
{
|
||||||
|
assert(vvchParams.size() == 3);
|
||||||
|
claimId = uint160(vvchParams[1]);
|
||||||
|
}
|
||||||
|
std::string name(vvchParams[0].begin(), vvchParams[0].end());
|
||||||
|
int throwaway;
|
||||||
|
if (trieCache.spendClaim(name, COutPoint(txin.prevout.hash, txin.prevout.n), nTxinHeight, throwaway))
|
||||||
|
{
|
||||||
|
std::pair<std::string, uint160> entry(name, claimId);
|
||||||
|
spentClaims.push_back(entry);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LogPrintf("%s(): The claim was not found in the trie or queue and therefore can't be updated\n", __func__);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (op == OP_SUPPORT_CLAIM)
|
||||||
|
{
|
||||||
|
assert(vvchParams.size() == 2);
|
||||||
|
std::string name(vvchParams[0].begin(), vvchParams[0].end());
|
||||||
|
int throwaway;
|
||||||
|
if (!trieCache.spendSupport(name, COutPoint(txin.prevout.hash, txin.prevout.n), nTxinHeight, throwaway))
|
||||||
|
{
|
||||||
|
LogPrintf("%s(): The support was not found in the trie or queue\n", __func__);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < tx.vout.size(); ++i)
|
||||||
|
{
|
||||||
|
const CTxOut& txout = tx.vout[i];
|
||||||
|
|
||||||
|
std::vector<std::vector<unsigned char> > vvchParams;
|
||||||
|
int op;
|
||||||
|
if (DecodeClaimScript(txout.scriptPubKey, op, vvchParams))
|
||||||
|
{
|
||||||
|
if (op == OP_CLAIM_NAME)
|
||||||
|
{
|
||||||
|
assert(vvchParams.size() == 2);
|
||||||
|
std::string name(vvchParams[0].begin(), vvchParams[0].end());
|
||||||
|
if (!trieCache.addClaim(name, COutPoint(tx.GetHash(), i), ClaimIdHash(tx.GetHash(), i), txout.nValue, nHeight))
|
||||||
|
{
|
||||||
|
LogPrintf("%s: Something went wrong inserting the name\n", __func__);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (op == OP_UPDATE_CLAIM)
|
||||||
|
{
|
||||||
|
assert(vvchParams.size() == 3);
|
||||||
|
std::string name(vvchParams[0].begin(), vvchParams[0].end());
|
||||||
|
uint160 claimId(vvchParams[1]);
|
||||||
|
spentClaimsType::iterator itSpent;
|
||||||
|
for (itSpent = spentClaims.begin(); itSpent != spentClaims.end(); ++itSpent)
|
||||||
|
{
|
||||||
|
if (itSpent->first == name && itSpent->second == claimId)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (itSpent != spentClaims.end())
|
||||||
|
{
|
||||||
|
spentClaims.erase(itSpent);
|
||||||
|
if (!trieCache.addClaim(name, COutPoint(tx.GetHash(), i), claimId, txout.nValue, nHeight))
|
||||||
|
{
|
||||||
|
LogPrintf("%s: Something went wrong updating a claim\n", __func__);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LogPrintf("%s(): This update refers to a claim that was not found in the trie or queue, and therefore cannot be updated. The claim may have expired or it may have never existed.\n", __func__);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (op == OP_SUPPORT_CLAIM)
|
||||||
|
{
|
||||||
|
assert(vvchParams.size() == 2);
|
||||||
|
std::string name(vvchParams[0].begin(), vvchParams[0].end());
|
||||||
|
uint160 supportedClaimId(vvchParams[1]);
|
||||||
|
if (!trieCache.addSupport(name, COutPoint(tx.GetHash(), i), txout.nValue, supportedClaimId, nHeight))
|
||||||
|
{
|
||||||
|
LogPrintf("%s: Something went wrong inserting the claim support\n", __func__);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CValidationState state;
|
||||||
|
|
||||||
unsigned int nTxSigOps = iter->GetSigOpCount();
|
unsigned int nTxSigOps = iter->GetSigOpCount();
|
||||||
if (nBlockSigOps + nTxSigOps >= MAX_BLOCK_SIGOPS) {
|
if (nBlockSigOps + nTxSigOps >= MAX_BLOCK_SIGOPS) {
|
||||||
if (nBlockSigOps > MAX_BLOCK_SIGOPS - 2) {
|
if (nBlockSigOps > MAX_BLOCK_SIGOPS - 2) {
|
||||||
|
@ -288,6 +438,13 @@ CBlockTemplate* CreateNewBlock(const CChainParams& chainparams, const CScript& s
|
||||||
pblock->nBits = GetNextWorkRequired(pindexPrev, pblock, chainparams.GetConsensus());
|
pblock->nBits = GetNextWorkRequired(pindexPrev, pblock, chainparams.GetConsensus());
|
||||||
pblock->nNonce = 0;
|
pblock->nNonce = 0;
|
||||||
pblocktemplate->vTxSigOps[0] = GetLegacySigOpCount(pblock->vtx[0]);
|
pblocktemplate->vTxSigOps[0] = GetLegacySigOpCount(pblock->vtx[0]);
|
||||||
|
insertUndoType dummyInsertUndo;
|
||||||
|
claimQueueRowType dummyExpireUndo;
|
||||||
|
insertUndoType dummyInsertSupportUndo;
|
||||||
|
supportQueueRowType dummyExpireSupportUndo;
|
||||||
|
std::vector<std::pair<std::string, int> > dummyTakeoverHeightUndo;
|
||||||
|
trieCache.incrementBlock(dummyInsertUndo, dummyExpireUndo, dummyInsertSupportUndo, dummyExpireSupportUndo, dummyTakeoverHeightUndo);
|
||||||
|
pblock->hashClaimTrie = trieCache.getMerkleHash();
|
||||||
|
|
||||||
CValidationState state;
|
CValidationState state;
|
||||||
if (!TestBlockValidity(state, chainparams, *pblock, pindexPrev, false, false)) {
|
if (!TestBlockValidity(state, chainparams, *pblock, pindexPrev, false, false)) {
|
||||||
|
@ -316,3 +473,216 @@ void IncrementExtraNonce(CBlock* pblock, const CBlockIndex* pindexPrev, unsigned
|
||||||
pblock->vtx[0] = txCoinbase;
|
pblock->vtx[0] = txCoinbase;
|
||||||
pblock->hashMerkleRoot = BlockMerkleRoot(*pblock);
|
pblock->hashMerkleRoot = BlockMerkleRoot(*pblock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Internal miner
|
||||||
|
//
|
||||||
|
|
||||||
|
double dHashesPerSec = 0.0;
|
||||||
|
int64_t nHPSTimerStart = 0;
|
||||||
|
|
||||||
|
static bool ProcessBlockFound(const CBlock* pblock, const CChainParams& chainparams)
|
||||||
|
{
|
||||||
|
LogPrintf("%s\n", pblock->ToString());
|
||||||
|
LogPrintf("generated %s\n", FormatMoney(pblock->vtx[0].vout[0].nValue));
|
||||||
|
|
||||||
|
// Found a solution
|
||||||
|
{
|
||||||
|
LOCK(cs_main);
|
||||||
|
if (pblock->hashPrevBlock != chainActive.Tip()->GetBlockHash())
|
||||||
|
return error("BitcoinMiner: generated block is stale");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Inform about the new block
|
||||||
|
GetMainSignals().BlockFound(pblock->GetHash());
|
||||||
|
|
||||||
|
// Process this block the same as if we had received it from another node
|
||||||
|
CValidationState state;
|
||||||
|
if (!ProcessNewBlock(state, Params(), NULL, pblock, true, NULL))
|
||||||
|
return error("BitcoinMiner: ProcessNewBlock, block not accepted");
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void static BitcoinMiner(const CChainParams& chainparams)
|
||||||
|
{
|
||||||
|
LogPrintf("LBRYcrdMiner started\n");
|
||||||
|
SetThreadPriority(THREAD_PRIORITY_LOWEST);
|
||||||
|
RenameThread("bitcoin-miner");
|
||||||
|
|
||||||
|
unsigned int nExtraNonce = 0;
|
||||||
|
|
||||||
|
boost::shared_ptr<CReserveScript> coinbaseScript;
|
||||||
|
GetMainSignals().ScriptForMining(coinbaseScript);
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Throw an error if no script was provided. This can happen
|
||||||
|
// due to some internal error but also if the keypool is empty.
|
||||||
|
// In the latter case, already the pointer is NULL.
|
||||||
|
if (!coinbaseScript || coinbaseScript->reserveScript.empty())
|
||||||
|
throw std::runtime_error("No coinbase script available (mining requires a wallet)");
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
if (chainparams.MiningRequiresPeers()) {
|
||||||
|
// Busy-wait for the network to come online so we don't waste time mining
|
||||||
|
// on an obsolete chain. In regtest mode we expect to fly solo.
|
||||||
|
do {
|
||||||
|
bool fvNodesEmpty;
|
||||||
|
{
|
||||||
|
LOCK(cs_vNodes);
|
||||||
|
fvNodesEmpty = vNodes.empty();
|
||||||
|
}
|
||||||
|
if (!fvNodesEmpty && !IsInitialBlockDownload())
|
||||||
|
break;
|
||||||
|
MilliSleep(1000);
|
||||||
|
} while (true);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Create new block
|
||||||
|
//
|
||||||
|
unsigned int nTransactionsUpdatedLast = mempool.GetTransactionsUpdated();
|
||||||
|
CBlockIndex* pindexPrev = chainActive.Tip();
|
||||||
|
|
||||||
|
auto_ptr<CBlockTemplate> pblocktemplate(CreateNewBlock(Params(), coinbaseScript->reserveScript));
|
||||||
|
if (!pblocktemplate.get())
|
||||||
|
{
|
||||||
|
LogPrintf("Error in BitcoinMiner: Keypool ran out, please call keypoolrefill before restarting the mining thread\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
CBlock *pblock = &pblocktemplate->block;
|
||||||
|
IncrementExtraNonce(pblock, pindexPrev, nExtraNonce);
|
||||||
|
|
||||||
|
LogPrintf("Running BitcoinMiner with %u transactions in block (%u bytes)\n", pblock->vtx.size(),
|
||||||
|
::GetSerializeSize(*pblock, SER_NETWORK, PROTOCOL_VERSION));
|
||||||
|
|
||||||
|
//
|
||||||
|
// Search
|
||||||
|
//
|
||||||
|
int64_t nStart = GetTime();
|
||||||
|
arith_uint256 hashTarget = arith_uint256().SetCompact(pblock->nBits);
|
||||||
|
uint256 hash;
|
||||||
|
pblock->nNonce = 0;
|
||||||
|
bool found = false;
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
unsigned int nHashesDone = 0;
|
||||||
|
|
||||||
|
// Check if something found
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
hash = pblock->GetPoWHash();
|
||||||
|
if (((uint16_t*)&hash)[15] == 0 && UintToArith256(hash) <= hashTarget)
|
||||||
|
{
|
||||||
|
found = true;
|
||||||
|
// Found a solution
|
||||||
|
SetThreadPriority(THREAD_PRIORITY_NORMAL);
|
||||||
|
LogPrintf("LBRYcrdMiner:\n");
|
||||||
|
LogPrintf("proof-of-work found \n hash: %s \ntarget: %s\n", hash.GetHex(), hashTarget.GetHex());
|
||||||
|
ProcessBlockFound(pblock, chainparams);
|
||||||
|
SetThreadPriority(THREAD_PRIORITY_LOWEST);
|
||||||
|
coinbaseScript->KeepScript();
|
||||||
|
|
||||||
|
// In regression test mode, stop mining after a block is found.
|
||||||
|
if (chainparams.MineBlocksOnDemand())
|
||||||
|
throw boost::thread_interrupted();
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
pblock->nNonce += 1;
|
||||||
|
if ((pblock->nNonce & 0xFF) == 0)
|
||||||
|
{
|
||||||
|
nHashesDone = 0xFF+1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (found)
|
||||||
|
break;
|
||||||
|
|
||||||
|
// Meter hashes/sec
|
||||||
|
static int64_t nHashCounter;
|
||||||
|
if (nHPSTimerStart == 0)
|
||||||
|
{
|
||||||
|
nHPSTimerStart = GetTimeMillis();
|
||||||
|
nHashCounter = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
nHashCounter += nHashesDone;
|
||||||
|
if (GetTimeMillis() - nHPSTimerStart > 4000)
|
||||||
|
{
|
||||||
|
static CCriticalSection cs;
|
||||||
|
{
|
||||||
|
LOCK(cs);
|
||||||
|
if (GetTimeMillis() - nHPSTimerStart > 4000)
|
||||||
|
{
|
||||||
|
dHashesPerSec = 1000.0 * nHashCounter / (GetTimeMillis() - nHPSTimerStart);
|
||||||
|
nHPSTimerStart = GetTimeMillis();
|
||||||
|
nHashCounter = 0;
|
||||||
|
static int64_t nLogTime;
|
||||||
|
if (GetTime() - nLogTime > 30 * 60)
|
||||||
|
{
|
||||||
|
nLogTime = GetTime();
|
||||||
|
LogPrintf("hashmeter %6.0f khash/s\n", dHashesPerSec/1000.0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for stop or if block needs to be rebuilt
|
||||||
|
boost::this_thread::interruption_point();
|
||||||
|
// Regtest mode doesn't require peers
|
||||||
|
if (vNodes.empty() && chainparams.MiningRequiresPeers())
|
||||||
|
break;
|
||||||
|
if (pblock->nNonce >= 0xffff0000)
|
||||||
|
break;
|
||||||
|
if (mempool.GetTransactionsUpdated() != nTransactionsUpdatedLast && GetTime() - nStart > 60)
|
||||||
|
break;
|
||||||
|
if (pindexPrev != chainActive.Tip())
|
||||||
|
break;
|
||||||
|
|
||||||
|
// Update nTime every few seconds
|
||||||
|
if (UpdateTime(pblock, chainparams.GetConsensus(), pindexPrev) < 0)
|
||||||
|
break; // Recreate the block if the clock has run backwards,
|
||||||
|
// so that we can use the correct time.
|
||||||
|
if (chainparams.GetConsensus().fPowAllowMinDifficultyBlocks)
|
||||||
|
{
|
||||||
|
// Changing pblock->nTime can change work required on testnet:
|
||||||
|
hashTarget.SetCompact(pblock->nBits);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (const boost::thread_interrupted&)
|
||||||
|
{
|
||||||
|
LogPrintf("LBRYcrdMiner terminated\n");
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
catch (const std::runtime_error &e)
|
||||||
|
{
|
||||||
|
LogPrintf("LBRYcrdMiner runtime error: %s\n", e.what());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void GenerateBitcoins(bool fGenerate, int nThreads, const CChainParams& chainparams)
|
||||||
|
{
|
||||||
|
static boost::thread_group* minerThreads = NULL;
|
||||||
|
|
||||||
|
if (nThreads < 0)
|
||||||
|
nThreads = GetNumCores();
|
||||||
|
|
||||||
|
if (minerThreads != NULL)
|
||||||
|
{
|
||||||
|
minerThreads->interrupt_all();
|
||||||
|
delete minerThreads;
|
||||||
|
minerThreads = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nThreads == 0 || !fGenerate)
|
||||||
|
return;
|
||||||
|
|
||||||
|
minerThreads = new boost::thread_group();
|
||||||
|
for (int i = 0; i < nThreads; i++)
|
||||||
|
minerThreads->create_thread(boost::bind(&BitcoinMiner, boost::cref(chainparams)));
|
||||||
|
}
|
||||||
|
|
|
@ -17,6 +17,9 @@ class CScript;
|
||||||
class CWallet;
|
class CWallet;
|
||||||
namespace Consensus { struct Params; };
|
namespace Consensus { struct Params; };
|
||||||
|
|
||||||
|
static const bool DEFAULT_GENERATE = false;
|
||||||
|
static const int DEFAULT_GENERATE_THREADS = 1;
|
||||||
|
|
||||||
static const bool DEFAULT_PRINTPRIORITY = false;
|
static const bool DEFAULT_PRINTPRIORITY = false;
|
||||||
|
|
||||||
struct CBlockTemplate
|
struct CBlockTemplate
|
||||||
|
@ -26,10 +29,15 @@ struct CBlockTemplate
|
||||||
std::vector<int64_t> vTxSigOps;
|
std::vector<int64_t> vTxSigOps;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** Run the miner threads */
|
||||||
|
void GenerateBitcoins(bool fGenerate, int nThreads, const CChainParams& chainparams);
|
||||||
/** Generate a new block, without valid proof-of-work */
|
/** Generate a new block, without valid proof-of-work */
|
||||||
CBlockTemplate* CreateNewBlock(const CChainParams& chainparams, const CScript& scriptPubKeyIn);
|
CBlockTemplate* CreateNewBlock(const CChainParams& chainparams, const CScript& scriptPubKeyIn);
|
||||||
/** Modify the extranonce in a block */
|
/** Modify the extranonce in a block */
|
||||||
void IncrementExtraNonce(CBlock* pblock, const CBlockIndex* pindexPrev, unsigned int& nExtraNonce);
|
void IncrementExtraNonce(CBlock* pblock, const CBlockIndex* pindexPrev, unsigned int& nExtraNonce);
|
||||||
int64_t UpdateTime(CBlockHeader* pblock, const Consensus::Params& consensusParams, const CBlockIndex* pindexPrev);
|
int64_t UpdateTime(CBlockHeader* pblock, const Consensus::Params& consensusParams, const CBlockIndex* pindexPrev);
|
||||||
|
|
||||||
|
extern double dHashesPerSec;
|
||||||
|
extern int64_t nHPSTimerStart;
|
||||||
|
|
||||||
#endif // BITCOIN_MINER_H
|
#endif // BITCOIN_MINER_H
|
||||||
|
|
201
src/nameclaim.cpp
Normal file
|
@ -0,0 +1,201 @@
|
||||||
|
#include <boost/foreach.hpp>
|
||||||
|
#include "nameclaim.h"
|
||||||
|
#include "hash.h"
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
|
|
||||||
|
std::vector<unsigned char> uint32_t_to_vch(uint32_t n)
|
||||||
|
{
|
||||||
|
std::vector<unsigned char> vchN;
|
||||||
|
vchN.resize(4);
|
||||||
|
vchN[0] = n >> 24;
|
||||||
|
vchN[1] = n >> 16;
|
||||||
|
vchN[2] = n >> 8;
|
||||||
|
vchN[3] = n;
|
||||||
|
return vchN;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t vch_to_uint32_t(std::vector<unsigned char>& vchN)
|
||||||
|
{
|
||||||
|
uint32_t n;
|
||||||
|
if (vchN.size() != 4)
|
||||||
|
{
|
||||||
|
LogPrintf("%s() : a vector<unsigned char> with size other than 4 has been given", __func__);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
n = vchN[0] << 24 | vchN[1] << 16 | vchN[2] << 8 | vchN[3];
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
CScript ClaimNameScript(std::string name, std::string value)
|
||||||
|
{
|
||||||
|
std::vector<unsigned char> vchName(name.begin(), name.end());
|
||||||
|
std::vector<unsigned char> vchValue(value.begin(), value.end());
|
||||||
|
return CScript() << OP_CLAIM_NAME << vchName << vchValue << OP_2DROP << OP_DROP << OP_TRUE;
|
||||||
|
|
||||||
|
}
|
||||||
|
CScript SupportClaimScript(std::string name, uint160 claimId)
|
||||||
|
{
|
||||||
|
std::vector<unsigned char> vchName(name.begin(), name.end());
|
||||||
|
std::vector<unsigned char> vchClaimId(claimId.begin(),claimId.end());
|
||||||
|
return CScript() << OP_SUPPORT_CLAIM << vchName << vchClaimId << OP_2DROP << OP_DROP << OP_TRUE;
|
||||||
|
}
|
||||||
|
CScript UpdateClaimScript(std::string name, uint160 claimId, std::string value)
|
||||||
|
{
|
||||||
|
std::vector<unsigned char> vchName(name.begin(), name.end());
|
||||||
|
std::vector<unsigned char> vchClaimId(claimId.begin(),claimId.end());
|
||||||
|
std::vector<unsigned char> vchValue(value.begin(), value.end());
|
||||||
|
return CScript() << OP_UPDATE_CLAIM << vchName << vchClaimId << vchValue << OP_2DROP << OP_2DROP << OP_TRUE;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool DecodeClaimScript(const CScript& scriptIn, int& op, std::vector<std::vector<unsigned char> >& vvchParams)
|
||||||
|
{
|
||||||
|
CScript::const_iterator pc = scriptIn.begin();
|
||||||
|
return DecodeClaimScript(scriptIn, op, vvchParams, pc);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DecodeClaimScript(const CScript& scriptIn, int& op, std::vector<std::vector<unsigned char> >& vvchParams, CScript::const_iterator& pc)
|
||||||
|
{
|
||||||
|
opcodetype opcode;
|
||||||
|
if (!scriptIn.GetOp(pc, opcode))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opcode != OP_CLAIM_NAME && opcode != OP_SUPPORT_CLAIM && opcode != OP_UPDATE_CLAIM)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
op = opcode;
|
||||||
|
|
||||||
|
std::vector<unsigned char> vchParam1;
|
||||||
|
std::vector<unsigned char> vchParam2;
|
||||||
|
std::vector<unsigned char> vchParam3;
|
||||||
|
// Valid formats:
|
||||||
|
// OP_CLAIM_NAME vchName vchValue OP_2DROP OP_DROP pubkeyscript
|
||||||
|
// OP_UPDATE_CLAIM vchName vchClaimId vchValue OP_2DROP OP_2DROP pubkeyscript
|
||||||
|
// OP_SUPPORT_CLAIM vchName vchClaimId OP_2DROP OP_DROP pubkeyscript
|
||||||
|
// All others are invalid.
|
||||||
|
|
||||||
|
if (!scriptIn.GetOp(pc, opcode, vchParam1) || opcode < 0 || opcode > OP_PUSHDATA4)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!scriptIn.GetOp(pc, opcode, vchParam2) || opcode < 0 || opcode > OP_PUSHDATA4)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (op == OP_UPDATE_CLAIM || op == OP_SUPPORT_CLAIM)
|
||||||
|
{
|
||||||
|
if (vchParam2.size() != 160/8)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (op == OP_UPDATE_CLAIM)
|
||||||
|
{
|
||||||
|
if (!scriptIn.GetOp(pc, opcode, vchParam3) || opcode < 0 || opcode > OP_PUSHDATA4)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!scriptIn.GetOp(pc, opcode) || opcode != OP_2DROP)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!scriptIn.GetOp(pc, opcode))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ((op == OP_CLAIM_NAME || op == OP_SUPPORT_CLAIM) && opcode != OP_DROP)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if ((op == OP_UPDATE_CLAIM) && opcode != OP_2DROP)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
vvchParams.push_back(vchParam1);
|
||||||
|
vvchParams.push_back(vchParam2);
|
||||||
|
if (op == OP_UPDATE_CLAIM)
|
||||||
|
{
|
||||||
|
vvchParams.push_back(vchParam3);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint160 ClaimIdHash(const uint256& txhash, uint32_t nOut)
|
||||||
|
{
|
||||||
|
std::vector<unsigned char> claimToHash(txhash.begin(), txhash.end());
|
||||||
|
std::vector<unsigned char> vchnOut = uint32_t_to_vch(nOut);
|
||||||
|
claimToHash.insert(claimToHash.end(), vchnOut.begin(), vchnOut.end());
|
||||||
|
return Hash160(claimToHash);
|
||||||
|
}
|
||||||
|
|
||||||
|
CScript StripClaimScriptPrefix(const CScript& scriptIn)
|
||||||
|
{
|
||||||
|
int op;
|
||||||
|
return StripClaimScriptPrefix(scriptIn, op);
|
||||||
|
}
|
||||||
|
|
||||||
|
CScript StripClaimScriptPrefix(const CScript& scriptIn, int& op)
|
||||||
|
{
|
||||||
|
std::vector<std::vector<unsigned char> > vvchParams;
|
||||||
|
CScript::const_iterator pc = scriptIn.begin();
|
||||||
|
|
||||||
|
if (!DecodeClaimScript(scriptIn, op, vvchParams, pc))
|
||||||
|
{
|
||||||
|
return scriptIn;
|
||||||
|
}
|
||||||
|
|
||||||
|
return CScript(pc, scriptIn.end());
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t ClaimScriptSize(const CScript& scriptIn)
|
||||||
|
{
|
||||||
|
CScript strippedScript = StripClaimScriptPrefix(scriptIn);
|
||||||
|
return scriptIn.size() - strippedScript.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t ClaimNameSize(const CScript& scriptIn)
|
||||||
|
{
|
||||||
|
std::vector<std::vector<unsigned char> > vvchParams;
|
||||||
|
CScript::const_iterator pc = scriptIn.begin();
|
||||||
|
int op;
|
||||||
|
if (!DecodeClaimScript(scriptIn, op, vvchParams, pc))
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return vvchParams[0].size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CAmount CalcMinClaimTrieFee(const CTransaction& tx, const CAmount &minFeePerNameClaimChar)
|
||||||
|
{
|
||||||
|
if (minFeePerNameClaimChar == 0)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
CAmount min_fee = 0;
|
||||||
|
BOOST_FOREACH(const CTxOut& txout, tx.vout)
|
||||||
|
{
|
||||||
|
int op;
|
||||||
|
std::vector<std::vector<unsigned char> > vvchParams;
|
||||||
|
if (DecodeClaimScript(txout.scriptPubKey, op, vvchParams))
|
||||||
|
{
|
||||||
|
if (op == OP_CLAIM_NAME)
|
||||||
|
{
|
||||||
|
int claim_name_size = vvchParams[0].size();
|
||||||
|
min_fee += claim_name_size*minFeePerNameClaimChar;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return min_fee;
|
||||||
|
}
|
45
src/nameclaim.h
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
#ifndef BITCOIN_NAMECLAIM_H
|
||||||
|
#define BITCOIN_NAMECLAIM_H
|
||||||
|
|
||||||
|
#include "amount.h"
|
||||||
|
#include "script/script.h"
|
||||||
|
#include "primitives/transaction.h"
|
||||||
|
#include "uint256.h"
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
// This is the minimum claim fee per character in the name of an OP_CLAIM_NAME command that must
|
||||||
|
// be attached to transactions for it to be accepted into the memory pool.
|
||||||
|
// Rationale: current implementation of the claim trie uses more memory for longer name claims
|
||||||
|
// due to the fact that each chracater is assigned a trie node regardless of whether it contains
|
||||||
|
// any claims or not. In the future, we can switch to a radix tree implementation where
|
||||||
|
// empty nodes do not take up any memory and the minimum fee can be priced on a per claim
|
||||||
|
// basis.
|
||||||
|
#define MIN_FEE_PER_NAMECLAIM_CHAR 200000
|
||||||
|
|
||||||
|
// This is the max claim script size in bytes, not including the script pubkey part of the script.
|
||||||
|
// Scripts exceeding this size are rejected in CheckTransaction in main.cpp
|
||||||
|
#define MAX_CLAIM_SCRIPT_SIZE 8192
|
||||||
|
|
||||||
|
// This is the max claim name size in bytes, for all claim trie transactions.
|
||||||
|
// Scripts exceeding this size are rejected in CheckTransaction in main.cpp
|
||||||
|
#define MAX_CLAIM_NAME_SIZE 255
|
||||||
|
|
||||||
|
CScript ClaimNameScript(std::string name, std::string value);
|
||||||
|
CScript SupportClaimScript(std::string name, uint160 claimId);
|
||||||
|
CScript UpdateClaimScript(std::string name, uint160 claimId, std::string value);
|
||||||
|
bool DecodeClaimScript(const CScript& scriptIn, int& op, std::vector<std::vector<unsigned char> >& vvchParams);
|
||||||
|
bool DecodeClaimScript(const CScript& scriptIn, int& op, std::vector<std::vector<unsigned char> >& vvchParams, CScript::const_iterator& pc);
|
||||||
|
CScript StripClaimScriptPrefix(const CScript& scriptIn);
|
||||||
|
CScript StripClaimScriptPrefix(const CScript& scriptIn, int& op);
|
||||||
|
uint160 ClaimIdHash(const uint256& txhash, uint32_t nOut);
|
||||||
|
std::vector<unsigned char> uint32_t_to_vch(uint32_t n);
|
||||||
|
uint32_t vch_to_uint32_t(std::vector<unsigned char>& vchN);
|
||||||
|
// get size of the claim script, minus the script pubkey part
|
||||||
|
size_t ClaimScriptSize(const CScript& scriptIn);
|
||||||
|
// get size of the name in a claim script, returns 0 if scriptin is not a claimetrie transaction
|
||||||
|
size_t ClaimNameSize(const CScript& scriptIn);
|
||||||
|
// calculate the minimum fee (mempool rule) required for transaction
|
||||||
|
CAmount CalcMinClaimTrieFee(const CTransaction& tx, const CAmount &minFeePerNameClaimChar);
|
||||||
|
|
||||||
|
#endif // BITCOIN_NAMECLAIM_H
|
|
@ -1346,7 +1346,7 @@ void ThreadMapPort()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
string strDesc = "Bitcoin " + FormatFullVersion();
|
string strDesc = "LBRYcrd " + FormatFullVersion();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
while (true) {
|
while (true) {
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include "policy/policy.h"
|
#include "policy/policy.h"
|
||||||
|
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
|
#include "nameclaim.h"
|
||||||
#include "tinyformat.h"
|
#include "tinyformat.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "utilstrencodings.h"
|
#include "utilstrencodings.h"
|
||||||
|
@ -92,7 +93,10 @@ bool IsStandardTx(const CTransaction& tx, std::string& reason)
|
||||||
unsigned int nDataOut = 0;
|
unsigned int nDataOut = 0;
|
||||||
txnouttype whichType;
|
txnouttype whichType;
|
||||||
BOOST_FOREACH(const CTxOut& txout, tx.vout) {
|
BOOST_FOREACH(const CTxOut& txout, tx.vout) {
|
||||||
if (!::IsStandard(txout.scriptPubKey, whichType)) {
|
|
||||||
|
const CScript& scriptPubKey = StripClaimScriptPrefix(txout.scriptPubKey);
|
||||||
|
|
||||||
|
if (!::IsStandard(scriptPubKey, whichType)) {
|
||||||
reason = "scriptpubkey";
|
reason = "scriptpubkey";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -129,7 +133,7 @@ bool AreInputsStandard(const CTransaction& tx, const CCoinsViewCache& mapInputs)
|
||||||
std::vector<std::vector<unsigned char> > vSolutions;
|
std::vector<std::vector<unsigned char> > vSolutions;
|
||||||
txnouttype whichType;
|
txnouttype whichType;
|
||||||
// get the scriptPubKey corresponding to this input:
|
// get the scriptPubKey corresponding to this input:
|
||||||
const CScript& prevScript = prev.scriptPubKey;
|
const CScript& prevScript = StripClaimScriptPrefix(prev.scriptPubKey);
|
||||||
if (!Solver(prevScript, whichType, vSolutions))
|
if (!Solver(prevScript, whichType, vSolutions))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|
33
src/pow.cpp
|
@ -9,44 +9,39 @@
|
||||||
#include "chain.h"
|
#include "chain.h"
|
||||||
#include "primitives/block.h"
|
#include "primitives/block.h"
|
||||||
#include "uint256.h"
|
#include "uint256.h"
|
||||||
|
#include "lbry.h"
|
||||||
|
|
||||||
unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHeader *pblock, const Consensus::Params& params)
|
unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHeader *pblock, const Consensus::Params& params)
|
||||||
{
|
{
|
||||||
unsigned int nProofOfWorkLimit = UintToArith256(params.powLimit).GetCompact();
|
unsigned int nProofOfWorkLimit = UintToArith256(params.powLimit).GetCompact();
|
||||||
|
|
||||||
// Genesis block
|
// Genesis block
|
||||||
if (pindexLast == NULL)
|
if (pindexLast == NULL)
|
||||||
return nProofOfWorkLimit;
|
return nProofOfWorkLimit;
|
||||||
|
|
||||||
// Only change once per difficulty adjustment interval
|
if (params.fPowAllowMinDifficultyBlocks && pindexLast->nHeight >= 277299)
|
||||||
if ((pindexLast->nHeight+1) % params.DifficultyAdjustmentInterval() != 0)
|
|
||||||
{
|
|
||||||
if (params.fPowAllowMinDifficultyBlocks)
|
|
||||||
{
|
{
|
||||||
// Special difficulty rule for testnet:
|
// Special difficulty rule for testnet:
|
||||||
// If the new block's timestamp is more than 2* 10 minutes
|
// If the new block's timestamp is twice the target block time
|
||||||
// then allow mining of a min-difficulty block.
|
// then allow mining of a min-difficulty block.
|
||||||
if (pblock->GetBlockTime() > pindexLast->GetBlockTime() + params.nPowTargetSpacing*2)
|
// This is to prevent the testnet from gettig stuck when a large amount
|
||||||
|
// of hashrate drops off the network.
|
||||||
|
// This rule was not implemented properly until testnet block 277299.
|
||||||
|
if (pblock->GetBlockTime() > pindexLast->GetBlockTime() + params.nPowTargetSpacing*2){
|
||||||
return nProofOfWorkLimit;
|
return nProofOfWorkLimit;
|
||||||
else
|
|
||||||
{
|
|
||||||
// Return the last non-special-min-difficulty-rules-block
|
|
||||||
const CBlockIndex* pindex = pindexLast;
|
|
||||||
while (pindex->pprev && pindex->nHeight % params.DifficultyAdjustmentInterval() != 0 && pindex->nBits == nProofOfWorkLimit)
|
|
||||||
pindex = pindex->pprev;
|
|
||||||
return pindex->nBits;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return pindexLast->nBits;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Go back by what we want to be 14 days worth of blocks
|
// Go back the full period unless it's the first retarget after genesis.
|
||||||
int nHeightFirst = pindexLast->nHeight - (params.DifficultyAdjustmentInterval()-1);
|
int blockstogoback = params.DifficultyAdjustmentInterval()-1;
|
||||||
|
if ((pindexLast->nHeight+1) != params.DifficultyAdjustmentInterval())
|
||||||
|
blockstogoback = params.DifficultyAdjustmentInterval();
|
||||||
|
|
||||||
|
int nHeightFirst = pindexLast->nHeight - blockstogoback;
|
||||||
assert(nHeightFirst >= 0);
|
assert(nHeightFirst >= 0);
|
||||||
const CBlockIndex* pindexFirst = pindexLast->GetAncestor(nHeightFirst);
|
const CBlockIndex* pindexFirst = pindexLast->GetAncestor(nHeightFirst);
|
||||||
assert(pindexFirst);
|
assert(pindexFirst);
|
||||||
|
|
||||||
return CalculateNextWorkRequired(pindexLast, pindexFirst->GetBlockTime(), params);
|
return CalculateLbryNextWorkRequired(pindexLast, pindexFirst->GetBlockTime(), params);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int CalculateNextWorkRequired(const CBlockIndex* pindexLast, int64_t nFirstBlockTime, const Consensus::Params& params)
|
unsigned int CalculateNextWorkRequired(const CBlockIndex* pindexLast, int64_t nFirstBlockTime, const Consensus::Params& params)
|
||||||
|
|
|
@ -17,6 +17,7 @@ class uint256;
|
||||||
unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHeader *pblock, const Consensus::Params&);
|
unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHeader *pblock, const Consensus::Params&);
|
||||||
unsigned int CalculateNextWorkRequired(const CBlockIndex* pindexLast, int64_t nFirstBlockTime, const Consensus::Params&);
|
unsigned int CalculateNextWorkRequired(const CBlockIndex* pindexLast, int64_t nFirstBlockTime, const Consensus::Params&);
|
||||||
|
|
||||||
|
|
||||||
/** Check whether a block hash satisfies the proof-of-work requirement specified by nBits */
|
/** Check whether a block hash satisfies the proof-of-work requirement specified by nBits */
|
||||||
bool CheckProofOfWork(uint256 hash, unsigned int nBits, const Consensus::Params&);
|
bool CheckProofOfWork(uint256 hash, unsigned int nBits, const Consensus::Params&);
|
||||||
|
|
||||||
|
|
|
@ -9,20 +9,30 @@
|
||||||
#include "tinyformat.h"
|
#include "tinyformat.h"
|
||||||
#include "utilstrencodings.h"
|
#include "utilstrencodings.h"
|
||||||
#include "crypto/common.h"
|
#include "crypto/common.h"
|
||||||
|
#include "streams.h"
|
||||||
|
|
||||||
uint256 CBlockHeader::GetHash() const
|
uint256 CBlockHeader::GetHash() const
|
||||||
{
|
{
|
||||||
return SerializeHash(*this);
|
return SerializeHash(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint256 CBlockHeader::GetPoWHash() const
|
||||||
|
{
|
||||||
|
CDataStream ds(SER_GETHASH, PROTOCOL_VERSION);
|
||||||
|
ds << *this;
|
||||||
|
std::vector<unsigned char> input(ds.begin(), ds.end());
|
||||||
|
return PoWHash(input);
|
||||||
|
}
|
||||||
|
|
||||||
std::string CBlock::ToString() const
|
std::string CBlock::ToString() const
|
||||||
{
|
{
|
||||||
std::stringstream s;
|
std::stringstream s;
|
||||||
s << strprintf("CBlock(hash=%s, ver=0x%08x, hashPrevBlock=%s, hashMerkleRoot=%s, nTime=%u, nBits=%08x, nNonce=%u, vtx=%u)\n",
|
s << strprintf("CBlock(hash=%s, ver=0x%08x, hashPrevBlock=%s, hashMerkleRoot=%s, hashClaimTrie=%s, nTime=%u, nBits=%08x, nNonce=%u, vtx=%u)\n",
|
||||||
GetHash().ToString(),
|
GetHash().ToString(),
|
||||||
nVersion,
|
nVersion,
|
||||||
hashPrevBlock.ToString(),
|
hashPrevBlock.ToString(),
|
||||||
hashMerkleRoot.ToString(),
|
hashMerkleRoot.ToString(),
|
||||||
|
hashClaimTrie.ToString(),
|
||||||
nTime, nBits, nNonce,
|
nTime, nBits, nNonce,
|
||||||
vtx.size());
|
vtx.size());
|
||||||
for (unsigned int i = 0; i < vtx.size(); i++)
|
for (unsigned int i = 0; i < vtx.size(); i++)
|
||||||
|
|
|
@ -24,6 +24,7 @@ public:
|
||||||
int32_t nVersion;
|
int32_t nVersion;
|
||||||
uint256 hashPrevBlock;
|
uint256 hashPrevBlock;
|
||||||
uint256 hashMerkleRoot;
|
uint256 hashMerkleRoot;
|
||||||
|
uint256 hashClaimTrie;
|
||||||
uint32_t nTime;
|
uint32_t nTime;
|
||||||
uint32_t nBits;
|
uint32_t nBits;
|
||||||
uint32_t nNonce;
|
uint32_t nNonce;
|
||||||
|
@ -41,6 +42,7 @@ public:
|
||||||
nVersion = this->nVersion;
|
nVersion = this->nVersion;
|
||||||
READWRITE(hashPrevBlock);
|
READWRITE(hashPrevBlock);
|
||||||
READWRITE(hashMerkleRoot);
|
READWRITE(hashMerkleRoot);
|
||||||
|
READWRITE(hashClaimTrie);
|
||||||
READWRITE(nTime);
|
READWRITE(nTime);
|
||||||
READWRITE(nBits);
|
READWRITE(nBits);
|
||||||
READWRITE(nNonce);
|
READWRITE(nNonce);
|
||||||
|
@ -51,6 +53,7 @@ public:
|
||||||
nVersion = 0;
|
nVersion = 0;
|
||||||
hashPrevBlock.SetNull();
|
hashPrevBlock.SetNull();
|
||||||
hashMerkleRoot.SetNull();
|
hashMerkleRoot.SetNull();
|
||||||
|
hashClaimTrie.SetNull();
|
||||||
nTime = 0;
|
nTime = 0;
|
||||||
nBits = 0;
|
nBits = 0;
|
||||||
nNonce = 0;
|
nNonce = 0;
|
||||||
|
@ -63,6 +66,8 @@ public:
|
||||||
|
|
||||||
uint256 GetHash() const;
|
uint256 GetHash() const;
|
||||||
|
|
||||||
|
uint256 GetPoWHash() const;
|
||||||
|
|
||||||
int64_t GetBlockTime() const
|
int64_t GetBlockTime() const
|
||||||
{
|
{
|
||||||
return (int64_t)nTime;
|
return (int64_t)nTime;
|
||||||
|
@ -111,6 +116,7 @@ public:
|
||||||
block.nVersion = nVersion;
|
block.nVersion = nVersion;
|
||||||
block.hashPrevBlock = hashPrevBlock;
|
block.hashPrevBlock = hashPrevBlock;
|
||||||
block.hashMerkleRoot = hashMerkleRoot;
|
block.hashMerkleRoot = hashMerkleRoot;
|
||||||
|
block.hashClaimTrie = hashClaimTrie;
|
||||||
block.nTime = nTime;
|
block.nTime = nTime;
|
||||||
block.nBits = nBits;
|
block.nBits = nBits;
|
||||||
block.nNonce = nNonce;
|
block.nNonce = nNonce;
|
||||||
|
|
|
@ -171,8 +171,13 @@ public:
|
||||||
if (scriptPubKey.IsUnspendable())
|
if (scriptPubKey.IsUnspendable())
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
size_t nSize = GetSerializeSize(SER_DISK,0)+148u;
|
// for lbrycrd this is mainly to prevent 0 value claims
|
||||||
return 3*minRelayTxFee.GetFee(nSize);
|
// and some spam protection without limiting small
|
||||||
|
// lbrynet transactions
|
||||||
|
return 1;
|
||||||
|
// below is original bitcoin core code
|
||||||
|
//size_t nSize = GetSerializeSize(SER_DISK,0)+dd148u;
|
||||||
|
//return 3*minRelayTxFee.GetFee(nSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IsDust(const CFeeRate &minRelayTxFee) const
|
bool IsDust(const CFeeRate &minRelayTxFee) const
|
||||||
|
|
|
@ -40,9 +40,9 @@ QString BitcoinUnits::name(int unit)
|
||||||
{
|
{
|
||||||
switch(unit)
|
switch(unit)
|
||||||
{
|
{
|
||||||
case BTC: return QString("BTC");
|
case BTC: return QString("LBC");
|
||||||
case mBTC: return QString("mBTC");
|
case mBTC: return QString("mLBC");
|
||||||
case uBTC: return QString::fromUtf8("μBTC");
|
case uBTC: return QString::fromUtf8("μLBC");
|
||||||
default: return QString("???");
|
default: return QString("???");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,7 @@ static const struct {
|
||||||
const char *titleAddText;
|
const char *titleAddText;
|
||||||
} network_styles[] = {
|
} network_styles[] = {
|
||||||
{"main", QAPP_APP_NAME_DEFAULT, 0, 0, ""},
|
{"main", QAPP_APP_NAME_DEFAULT, 0, 0, ""},
|
||||||
|
{"lbrycrd", QAPP_APP_NAME_DEFAULT, 0, 0, ""},
|
||||||
{"test", QAPP_APP_NAME_TESTNET, 70, 30, QT_TRANSLATE_NOOP("SplashScreen", "[testnet]")},
|
{"test", QAPP_APP_NAME_TESTNET, 70, 30, QT_TRANSLATE_NOOP("SplashScreen", "[testnet]")},
|
||||||
{"regtest", QAPP_APP_NAME_TESTNET, 160, 30, "[regtest]"}
|
{"regtest", QAPP_APP_NAME_TESTNET, 160, 30, "[regtest]"}
|
||||||
};
|
};
|
||||||
|
|
|
@ -159,14 +159,19 @@ bool PaymentRequestPlus::getMerchant(X509_STORE* certStore, QString& merchant) c
|
||||||
std::string data_to_verify; // Everything but the signature
|
std::string data_to_verify; // Everything but the signature
|
||||||
rcopy.SerializeToString(&data_to_verify);
|
rcopy.SerializeToString(&data_to_verify);
|
||||||
|
|
||||||
EVP_MD_CTX ctx;
|
EVP_MD_CTX* ctx = EVP_MD_CTX_new();
|
||||||
|
if (!ctx)
|
||||||
|
throw SSLVerifyError("Unable to allocate OpenSSL context.");
|
||||||
|
|
||||||
EVP_PKEY* pubkey = X509_get_pubkey(signing_cert);
|
EVP_PKEY* pubkey = X509_get_pubkey(signing_cert);
|
||||||
EVP_MD_CTX_init(&ctx);
|
EVP_MD_CTX_init(ctx);
|
||||||
if (!EVP_VerifyInit_ex(&ctx, digestAlgorithm, NULL) ||
|
if (!EVP_VerifyInit_ex(ctx, digestAlgorithm, NULL) ||
|
||||||
!EVP_VerifyUpdate(&ctx, data_to_verify.data(), data_to_verify.size()) ||
|
!EVP_VerifyUpdate(ctx, data_to_verify.data(), data_to_verify.size()) ||
|
||||||
!EVP_VerifyFinal(&ctx, (const unsigned char*)paymentRequest.signature().data(), (unsigned int)paymentRequest.signature().size(), pubkey)) {
|
!EVP_VerifyFinal(ctx, (const unsigned char*)paymentRequest.signature().data(), (unsigned int)paymentRequest.signature().size(), pubkey)) {
|
||||||
|
EVP_MD_CTX_free(ctx);
|
||||||
throw SSLVerifyError("Bad signature, invalid payment request.");
|
throw SSLVerifyError("Bad signature, invalid payment request.");
|
||||||
}
|
}
|
||||||
|
EVP_MD_CTX_free(ctx);
|
||||||
|
|
||||||
// OpenSSL API for getting human printable strings from certs is baroque.
|
// OpenSSL API for getting human printable strings from certs is baroque.
|
||||||
int textlen = X509_NAME_get_text_by_NID(certname, NID_commonName, NULL, 0);
|
int textlen = X509_NAME_get_text_by_NID(certname, NID_commonName, NULL, 0);
|
||||||
|
|
|
@ -48,12 +48,12 @@ double GetDifficulty(const CBlockIndex* blockindex)
|
||||||
double dDiff =
|
double dDiff =
|
||||||
(double)0x0000ffff / (double)(blockindex->nBits & 0x00ffffff);
|
(double)0x0000ffff / (double)(blockindex->nBits & 0x00ffffff);
|
||||||
|
|
||||||
while (nShift < 29)
|
while (nShift < 31)
|
||||||
{
|
{
|
||||||
dDiff *= 256.0;
|
dDiff *= 256.0;
|
||||||
nShift++;
|
nShift++;
|
||||||
}
|
}
|
||||||
while (nShift > 29)
|
while (nShift > 31)
|
||||||
{
|
{
|
||||||
dDiff /= 256.0;
|
dDiff /= 256.0;
|
||||||
nShift--;
|
nShift--;
|
||||||
|
@ -75,6 +75,7 @@ UniValue blockheaderToJSON(const CBlockIndex* blockindex)
|
||||||
result.push_back(Pair("version", blockindex->nVersion));
|
result.push_back(Pair("version", blockindex->nVersion));
|
||||||
result.push_back(Pair("versionHex", strprintf("%08x", blockindex->nVersion)));
|
result.push_back(Pair("versionHex", strprintf("%08x", blockindex->nVersion)));
|
||||||
result.push_back(Pair("merkleroot", blockindex->hashMerkleRoot.GetHex()));
|
result.push_back(Pair("merkleroot", blockindex->hashMerkleRoot.GetHex()));
|
||||||
|
result.push_back(Pair("nameclaimroot", blockindex->hashClaimTrie.GetHex()));
|
||||||
result.push_back(Pair("time", (int64_t)blockindex->nTime));
|
result.push_back(Pair("time", (int64_t)blockindex->nTime));
|
||||||
result.push_back(Pair("mediantime", (int64_t)blockindex->GetMedianTimePast()));
|
result.push_back(Pair("mediantime", (int64_t)blockindex->GetMedianTimePast()));
|
||||||
result.push_back(Pair("nonce", (uint64_t)blockindex->nNonce));
|
result.push_back(Pair("nonce", (uint64_t)blockindex->nNonce));
|
||||||
|
@ -104,6 +105,7 @@ UniValue blockToJSON(const CBlock& block, const CBlockIndex* blockindex, bool tx
|
||||||
result.push_back(Pair("version", block.nVersion));
|
result.push_back(Pair("version", block.nVersion));
|
||||||
result.push_back(Pair("versionHex", strprintf("%08x", block.nVersion)));
|
result.push_back(Pair("versionHex", strprintf("%08x", block.nVersion)));
|
||||||
result.push_back(Pair("merkleroot", block.hashMerkleRoot.GetHex()));
|
result.push_back(Pair("merkleroot", block.hashMerkleRoot.GetHex()));
|
||||||
|
result.push_back(Pair("nameclaimroot", block.hashClaimTrie.GetHex()));
|
||||||
UniValue txs(UniValue::VARR);
|
UniValue txs(UniValue::VARR);
|
||||||
BOOST_FOREACH(const CTransaction&tx, block.vtx)
|
BOOST_FOREACH(const CTransaction&tx, block.vtx)
|
||||||
{
|
{
|
||||||
|
@ -122,6 +124,11 @@ UniValue blockToJSON(const CBlock& block, const CBlockIndex* blockindex, bool tx
|
||||||
result.push_back(Pair("nonce", (uint64_t)block.nNonce));
|
result.push_back(Pair("nonce", (uint64_t)block.nNonce));
|
||||||
result.push_back(Pair("bits", strprintf("%08x", block.nBits)));
|
result.push_back(Pair("bits", strprintf("%08x", block.nBits)));
|
||||||
result.push_back(Pair("difficulty", GetDifficulty(blockindex)));
|
result.push_back(Pair("difficulty", GetDifficulty(blockindex)));
|
||||||
|
bool fNegative;
|
||||||
|
bool fOverflow;
|
||||||
|
arith_uint256 target;
|
||||||
|
target.SetCompact(block.nBits, &fNegative, &fOverflow);
|
||||||
|
result.push_back(Pair("target", target.ToString()));
|
||||||
result.push_back(Pair("chainwork", blockindex->nChainWork.GetHex()));
|
result.push_back(Pair("chainwork", blockindex->nChainWork.GetHex()));
|
||||||
|
|
||||||
if (blockindex->pprev)
|
if (blockindex->pprev)
|
||||||
|
@ -383,6 +390,7 @@ UniValue getblock(const UniValue& params, bool fHelp)
|
||||||
" \"version\" : n, (numeric) The block version\n"
|
" \"version\" : n, (numeric) The block version\n"
|
||||||
" \"versionHex\" : \"00000000\", (string) The block version formatted in hexadecimal\n"
|
" \"versionHex\" : \"00000000\", (string) The block version formatted in hexadecimal\n"
|
||||||
" \"merkleroot\" : \"xxxx\", (string) The merkle root\n"
|
" \"merkleroot\" : \"xxxx\", (string) The merkle root\n"
|
||||||
|
" \"nameclaimroot\" : \"xxxx\", (string) The hash of the root of the name claim trie\n"
|
||||||
" \"tx\" : [ (array of string) The transaction ids\n"
|
" \"tx\" : [ (array of string) The transaction ids\n"
|
||||||
" \"transactionid\" (string) The transaction id\n"
|
" \"transactionid\" (string) The transaction id\n"
|
||||||
" ,...\n"
|
" ,...\n"
|
||||||
|
@ -547,8 +555,8 @@ UniValue gettxout(const UniValue& params, bool fHelp)
|
||||||
" \"hex\" : \"hex\", (string) \n"
|
" \"hex\" : \"hex\", (string) \n"
|
||||||
" \"reqSigs\" : n, (numeric) Number of required signatures\n"
|
" \"reqSigs\" : n, (numeric) Number of required signatures\n"
|
||||||
" \"type\" : \"pubkeyhash\", (string) The type, eg pubkeyhash\n"
|
" \"type\" : \"pubkeyhash\", (string) The type, eg pubkeyhash\n"
|
||||||
" \"addresses\" : [ (array of string) array of bitcoin addresses\n"
|
" \"addresses\" : [ (array of string) array of lbrycrd addresses\n"
|
||||||
" \"bitcoinaddress\" (string) bitcoin address\n"
|
" \"lbrycrdaddress\" (string) lbrycrd address\n"
|
||||||
" ,...\n"
|
" ,...\n"
|
||||||
" ]\n"
|
" ]\n"
|
||||||
" },\n"
|
" },\n"
|
||||||
|
|
798
src/rpc/claimtrie.cpp
Normal file
|
@ -0,0 +1,798 @@
|
||||||
|
#include "main.h"
|
||||||
|
#include "nameclaim.h"
|
||||||
|
#include "rpc/server.h"
|
||||||
|
#include "univalue.h"
|
||||||
|
#include "txmempool.h"
|
||||||
|
|
||||||
|
// Maximum block decrement that is allowed from rpc calls
|
||||||
|
const int MAX_RPC_BLOCK_DECREMENTS = 50;
|
||||||
|
|
||||||
|
uint160 ParseClaimtrieId(const UniValue& v, const std::string& strName)
|
||||||
|
{
|
||||||
|
std::string strHex;
|
||||||
|
if (v.isStr())
|
||||||
|
strHex = v.get_str();
|
||||||
|
if (!IsHex(strHex)) // Note: IsHex("") is false
|
||||||
|
throw JSONRPCError(RPC_INVALID_PARAMETER, strName + " must be a 20-character hexadecimal string (not '" + strHex + "')");
|
||||||
|
if (40 != strHex.length())
|
||||||
|
throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("%s must be of length %d (not %d)", strName, 40, strHex.length()));
|
||||||
|
|
||||||
|
uint160 result;
|
||||||
|
result.SetHex(strHex);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
UniValue getclaimsintrie(const UniValue& params, bool fHelp)
|
||||||
|
{
|
||||||
|
if (fHelp || params.size() > 0)
|
||||||
|
throw std::runtime_error(
|
||||||
|
"getclaimsintrie\n"
|
||||||
|
"Return all claims in the name trie.\n"
|
||||||
|
"Arguments:\n"
|
||||||
|
"None\n"
|
||||||
|
"Result: \n"
|
||||||
|
"[\n"
|
||||||
|
" {\n"
|
||||||
|
" \"name\" (string) the name claimed\n"
|
||||||
|
" \"claims\": [ (array of object) the claims for this name\n"
|
||||||
|
" {\n"
|
||||||
|
" \"claimId\" (string) the claimId of the claim\n"
|
||||||
|
" \"txid\" (string) the txid of the claim\n"
|
||||||
|
" \"n\" (numeric) the vout value of the claim\n"
|
||||||
|
" \"amount\" (numeric) txout amount\n"
|
||||||
|
" \"height\" (numeric) the height of the block in which this transaction is located\n"
|
||||||
|
" \"value\" (string) the value of this claim\n"
|
||||||
|
" }\n"
|
||||||
|
" ]\n"
|
||||||
|
" }\n"
|
||||||
|
"]\n"
|
||||||
|
);
|
||||||
|
|
||||||
|
LOCK(cs_main);
|
||||||
|
UniValue ret(UniValue::VARR);
|
||||||
|
|
||||||
|
CCoinsViewCache view(pcoinsTip);
|
||||||
|
std::vector<namedNodeType> nodes = pclaimTrie->flattenTrie();
|
||||||
|
|
||||||
|
for (std::vector<namedNodeType>::iterator it = nodes.begin(); it != nodes.end(); ++it)
|
||||||
|
{
|
||||||
|
if (!it->second.claims.empty())
|
||||||
|
{
|
||||||
|
UniValue node(UniValue::VOBJ);
|
||||||
|
node.push_back(Pair("name", it->first));
|
||||||
|
UniValue claims(UniValue::VARR);
|
||||||
|
for (std::vector<CClaimValue>::iterator itClaims = it->second.claims.begin(); itClaims != it->second.claims.end(); ++itClaims)
|
||||||
|
{
|
||||||
|
UniValue claim(UniValue::VOBJ);
|
||||||
|
claim.push_back(Pair("claimId", itClaims->claimId.GetHex()));
|
||||||
|
claim.push_back(Pair("txid", itClaims->outPoint.hash.GetHex()));
|
||||||
|
claim.push_back(Pair("n", (int)itClaims->outPoint.n));
|
||||||
|
claim.push_back(Pair("amount", ValueFromAmount(itClaims->nAmount)));
|
||||||
|
claim.push_back(Pair("height", itClaims->nHeight));
|
||||||
|
const CCoins* coin = view.AccessCoins(itClaims->outPoint.hash);
|
||||||
|
if (!coin)
|
||||||
|
{
|
||||||
|
LogPrintf("%s: %s does not exist in the coins view, despite being associated with a name\n",
|
||||||
|
__func__, itClaims->outPoint.hash.GetHex());
|
||||||
|
claim.push_back(Pair("error", "No value found for claim"));
|
||||||
|
}
|
||||||
|
else if (!coin->IsAvailable(itClaims->outPoint.n))
|
||||||
|
{
|
||||||
|
LogPrintf("%s: the specified txout of %s appears to have been spent\n", __func__, itClaims->outPoint.hash.GetHex());
|
||||||
|
claim.push_back(Pair("error", "Txout spent"));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int op;
|
||||||
|
std::vector<std::vector<unsigned char> > vvchParams;
|
||||||
|
if (!DecodeClaimScript(coin->vout[itClaims->outPoint.n].scriptPubKey, op, vvchParams))
|
||||||
|
{
|
||||||
|
LogPrintf("%s: the specified txout of %s does not have an claim command\n", __func__, itClaims->outPoint.hash.GetHex());
|
||||||
|
}
|
||||||
|
std::string sValue(vvchParams[1].begin(), vvchParams[1].end());
|
||||||
|
claim.push_back(Pair("value", sValue));
|
||||||
|
}
|
||||||
|
claims.push_back(claim);
|
||||||
|
}
|
||||||
|
node.push_back(Pair("claims", claims));
|
||||||
|
ret.push_back(node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
UniValue getclaimtrie(const UniValue& params, bool fHelp)
|
||||||
|
{
|
||||||
|
if (fHelp || params.size() > 0)
|
||||||
|
throw std::runtime_error(
|
||||||
|
"getclaimtrie\n"
|
||||||
|
"Return the entire name trie.\n"
|
||||||
|
"Arguments:\n"
|
||||||
|
"None\n"
|
||||||
|
"Result: \n"
|
||||||
|
"{\n"
|
||||||
|
" \"name\" (string) the name of the node\n"
|
||||||
|
" \"hash\" (string) the hash of the node\n"
|
||||||
|
" \"txid\" (string) (if value exists) the hash of the transaction which has successfully claimed this name\n"
|
||||||
|
" \"n\" (numeric) (if value exists) vout value\n"
|
||||||
|
" \"value\" (numeric) (if value exists) txout value\n"
|
||||||
|
" \"height\" (numeric) (if value exists) the height of the block in which this transaction is located\n"
|
||||||
|
"}\n"
|
||||||
|
);
|
||||||
|
|
||||||
|
LOCK(cs_main);
|
||||||
|
UniValue ret(UniValue::VARR);
|
||||||
|
|
||||||
|
std::vector<namedNodeType> nodes = pclaimTrie->flattenTrie();
|
||||||
|
for (std::vector<namedNodeType>::iterator it = nodes.begin(); it != nodes.end(); ++it)
|
||||||
|
{
|
||||||
|
UniValue node(UniValue::VOBJ);
|
||||||
|
node.push_back(Pair("name", it->first));
|
||||||
|
node.push_back(Pair("hash", it->second.hash.GetHex()));
|
||||||
|
CClaimValue claim;
|
||||||
|
if (it->second.getBestClaim(claim))
|
||||||
|
{
|
||||||
|
node.push_back(Pair("txid", claim.outPoint.hash.GetHex()));
|
||||||
|
node.push_back(Pair("n", (int)claim.outPoint.n));
|
||||||
|
node.push_back(Pair("value", ValueFromAmount(claim.nAmount)));
|
||||||
|
node.push_back(Pair("height", claim.nHeight));
|
||||||
|
}
|
||||||
|
ret.push_back(node);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool getValueForClaim(const COutPoint& out, std::string& sValue)
|
||||||
|
{
|
||||||
|
CCoinsViewCache view(pcoinsTip);
|
||||||
|
const CCoins* coin = view.AccessCoins(out.hash);
|
||||||
|
if (!coin)
|
||||||
|
{
|
||||||
|
LogPrintf("%s: %s does not exist in the coins view, despite being associated with a name\n",
|
||||||
|
__func__, out.hash.GetHex());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if(!coin->IsAvailable(out.n))
|
||||||
|
{
|
||||||
|
LogPrintf("%s: the specified txout of %s appears to have been spent\n", __func__, out.hash.GetHex());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int op;
|
||||||
|
std::vector<std::vector<unsigned char> > vvchParams;
|
||||||
|
if (!DecodeClaimScript(coin->vout[out.n].scriptPubKey, op, vvchParams))
|
||||||
|
{
|
||||||
|
LogPrintf("%s: the specified txout of %s does not have a name claim command\n", __func__, out.hash.GetHex());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (op == OP_CLAIM_NAME)
|
||||||
|
{
|
||||||
|
sValue = std::string(vvchParams[1].begin(), vvchParams[1].end());
|
||||||
|
}
|
||||||
|
else if (op == OP_UPDATE_CLAIM)
|
||||||
|
{
|
||||||
|
sValue = std::string(vvchParams[2].begin(), vvchParams[2].end());
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
UniValue getvalueforname(const UniValue& params, bool fHelp)
|
||||||
|
{
|
||||||
|
if (fHelp || params.size() != 1)
|
||||||
|
throw std::runtime_error(
|
||||||
|
"getvalueforname \"name\"\n"
|
||||||
|
"Return the value associated with a name, if one exists\n"
|
||||||
|
"Arguments:\n"
|
||||||
|
"1. \"name\" (string) the name to look up\n"
|
||||||
|
"Result: \n"
|
||||||
|
"\"value\" (string) the value of the name, if it exists\n"
|
||||||
|
"\"claimId\" (string) the claimId for this name claim\n"
|
||||||
|
"\"txid\" (string) the hash of the transaction which successfully claimed the name\n"
|
||||||
|
"\"n\" (numeric) vout value\n"
|
||||||
|
"\"amount\" (numeric) txout amount\n"
|
||||||
|
"\"effective amount\" (numeric) txout amount plus amount from all supports associated with the claim\n"
|
||||||
|
"\"height\" (numeric) the height of the block in which this transaction is located\n"
|
||||||
|
);
|
||||||
|
LOCK(cs_main);
|
||||||
|
std::string name = params[0].get_str();
|
||||||
|
CClaimValue claim;
|
||||||
|
UniValue ret(UniValue::VOBJ);
|
||||||
|
if (!pclaimTrie->getInfoForName(name, claim))
|
||||||
|
return ret;
|
||||||
|
std::string sValue;
|
||||||
|
if (!getValueForClaim(claim.outPoint, sValue))
|
||||||
|
return ret;
|
||||||
|
ret.push_back(Pair("value", sValue));
|
||||||
|
ret.push_back(Pair("claimId", claim.claimId.GetHex()));
|
||||||
|
ret.push_back(Pair("txid", claim.outPoint.hash.GetHex()));
|
||||||
|
ret.push_back(Pair("n", (int)claim.outPoint.n));
|
||||||
|
ret.push_back(Pair("amount", claim.nAmount));
|
||||||
|
ret.push_back(Pair("effective amount", pclaimTrie->getEffectiveAmountForClaim(name, claim.claimId)));
|
||||||
|
ret.push_back(Pair("height", claim.nHeight));
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef std::pair<CClaimValue, std::vector<CSupportValue> > claimAndSupportsType;
|
||||||
|
typedef std::map<uint160, claimAndSupportsType> claimSupportMapType;
|
||||||
|
typedef std::map<uint160, std::vector<CSupportValue> > supportsWithoutClaimsMapType;
|
||||||
|
|
||||||
|
UniValue claimsAndSupportsToJSON(claimSupportMapType::const_iterator itClaimsAndSupports, int nCurrentHeight)
|
||||||
|
{
|
||||||
|
UniValue ret(UniValue::VOBJ);
|
||||||
|
const CClaimValue& claim = itClaimsAndSupports->second.first;
|
||||||
|
const std::vector<CSupportValue>& supports = itClaimsAndSupports->second.second;
|
||||||
|
CAmount nEffectiveAmount = 0;
|
||||||
|
UniValue supportObjs(UniValue::VARR);
|
||||||
|
for (std::vector<CSupportValue>::const_iterator itSupports = supports.begin(); itSupports != supports.end(); ++itSupports)
|
||||||
|
{
|
||||||
|
UniValue supportObj(UniValue::VOBJ);
|
||||||
|
supportObj.push_back(Pair("txid", itSupports->outPoint.hash.GetHex()));
|
||||||
|
supportObj.push_back(Pair("n", (int)itSupports->outPoint.n));
|
||||||
|
supportObj.push_back(Pair("nHeight", itSupports->nHeight));
|
||||||
|
supportObj.push_back(Pair("nValidAtHeight", itSupports->nValidAtHeight));
|
||||||
|
if (itSupports->nValidAtHeight < nCurrentHeight)
|
||||||
|
{
|
||||||
|
nEffectiveAmount += itSupports->nAmount;
|
||||||
|
}
|
||||||
|
supportObj.push_back(Pair("nAmount", itSupports->nAmount));
|
||||||
|
supportObjs.push_back(supportObj);
|
||||||
|
}
|
||||||
|
ret.push_back(Pair("claimId", itClaimsAndSupports->first.GetHex()));
|
||||||
|
ret.push_back(Pair("txid", claim.outPoint.hash.GetHex()));
|
||||||
|
ret.push_back(Pair("n", (int)claim.outPoint.n));
|
||||||
|
ret.push_back(Pair("nHeight", claim.nHeight));
|
||||||
|
ret.push_back(Pair("nValidAtHeight", claim.nValidAtHeight));
|
||||||
|
if (claim.nValidAtHeight < nCurrentHeight)
|
||||||
|
{
|
||||||
|
nEffectiveAmount += claim.nAmount;
|
||||||
|
}
|
||||||
|
ret.push_back(Pair("nAmount", claim.nAmount));
|
||||||
|
std::string sValue;
|
||||||
|
if (getValueForClaim(claim.outPoint, sValue))
|
||||||
|
{
|
||||||
|
ret.push_back(Pair("value", sValue));
|
||||||
|
}
|
||||||
|
ret.push_back(Pair("nEffectiveAmount", nEffectiveAmount));
|
||||||
|
ret.push_back(Pair("supports", supportObjs));
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
UniValue supportsWithoutClaimsToJSON(supportsWithoutClaimsMapType::const_iterator itSupportsWithoutClaims, int nCurrentHeight)
|
||||||
|
{
|
||||||
|
const std::vector<CSupportValue>& supports = itSupportsWithoutClaims->second;
|
||||||
|
UniValue ret(UniValue::VOBJ);
|
||||||
|
UniValue supportObjs(UniValue::VARR);
|
||||||
|
ret.push_back(Pair("claimId (no matching claim)", itSupportsWithoutClaims->first.GetHex()));
|
||||||
|
for (std::vector<CSupportValue>::const_iterator itSupports = supports.begin(); itSupports != supports.end(); ++itSupports)
|
||||||
|
{
|
||||||
|
UniValue supportObj(UniValue::VOBJ);
|
||||||
|
supportObj.push_back(Pair("txid", itSupports->outPoint.hash.GetHex()));
|
||||||
|
supportObj.push_back(Pair("n", (int)itSupports->outPoint.n));
|
||||||
|
supportObj.push_back(Pair("nHeight", itSupports->nHeight));
|
||||||
|
supportObj.push_back(Pair("nValidAtHeight", itSupports->nValidAtHeight));
|
||||||
|
supportObj.push_back(Pair("nAmount", itSupports->nAmount));
|
||||||
|
supportObjs.push_back(supportObj);
|
||||||
|
}
|
||||||
|
ret.push_back(Pair("supports", supportObjs));
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
UniValue getclaimsforname(const UniValue& params, bool fHelp)
|
||||||
|
{
|
||||||
|
if (fHelp || params.size() != 1)
|
||||||
|
throw std::runtime_error(
|
||||||
|
"getclaimsforname\n"
|
||||||
|
"Return all claims and supports for a name\n"
|
||||||
|
"Arguments: \n"
|
||||||
|
"1. \"name\" (string) the name for which to get claims and supports\n"
|
||||||
|
"Result:\n"
|
||||||
|
"{\n"
|
||||||
|
" \"nLastTakeoverheight\" (numeric) the last height at which ownership of the name changed\n"
|
||||||
|
" \"claims\": [ (array of object) claims for this name\n"
|
||||||
|
" {\n"
|
||||||
|
" \"claimId\" (string) the claimId of this claim\n"
|
||||||
|
" \"txid\" (string) the txid of this claim\n"
|
||||||
|
" \"n\" (numeric) the index of the claim in the transaction's list of outputs\n"
|
||||||
|
" \"nHeight\" (numeric) the height at which the claim was included in the blockchain\n"
|
||||||
|
" \"nValidAtHeight\" (numeric) the height at which the claim became/becomes valid\n"
|
||||||
|
" \"nAmount\" (numeric) the amount of the claim\n"
|
||||||
|
" \"nEffectiveAmount\" (numeric) the total effective amount of the claim, taking into effect whether the claim or support has reached its nValidAtHeight\n"
|
||||||
|
" \"supports\" : [ (array of object) supports for this claim\n"
|
||||||
|
" \"txid\" (string) the txid of the support\n"
|
||||||
|
" \"n\" (numeric) the index of the support in the transaction's list of outputs\n"
|
||||||
|
" \"nHeight\" (numeric) the height at which the support was included in the blockchain\n"
|
||||||
|
" \"nValidAtHeight\" (numeric) the height at which the support became/becomes valid\n"
|
||||||
|
" \"nAmount\" (numeric) the amount of the support\n"
|
||||||
|
" ]\n"
|
||||||
|
" }\n"
|
||||||
|
" ],\n"
|
||||||
|
" \"unmatched supports\": [ (array of object) supports that did not match a claim for this name\n"
|
||||||
|
" {\n"
|
||||||
|
" \"txid\" (string) the txid of the support\n"
|
||||||
|
" \"n\" (numeric) the index of the support in the transaction's list of outputs\n"
|
||||||
|
" \"nHeight\" (numeric) the height at which the support was included in the blockchain\n"
|
||||||
|
" \"nValidAtHeight\" (numeric) the height at which the support became/becomes valid\n"
|
||||||
|
" \"nAmount\" (numeric) the amount of the support\n"
|
||||||
|
" }\n"
|
||||||
|
" ]\n"
|
||||||
|
"}\n"
|
||||||
|
);
|
||||||
|
|
||||||
|
LOCK(cs_main);
|
||||||
|
std::string name = params[0].get_str();
|
||||||
|
claimsForNameType claimsForName = pclaimTrie->getClaimsForName(name);
|
||||||
|
int nCurrentHeight = chainActive.Height();
|
||||||
|
|
||||||
|
claimSupportMapType claimSupportMap;
|
||||||
|
supportsWithoutClaimsMapType supportsWithoutClaims;
|
||||||
|
for (std::vector<CClaimValue>::const_iterator itClaims = claimsForName.claims.begin(); itClaims != claimsForName.claims.end(); ++itClaims)
|
||||||
|
{
|
||||||
|
claimAndSupportsType claimAndSupports = std::make_pair(*itClaims, std::vector<CSupportValue>());
|
||||||
|
claimSupportMap.insert(std::pair<uint160, claimAndSupportsType>(itClaims->claimId, claimAndSupports));
|
||||||
|
}
|
||||||
|
for (std::vector<CSupportValue>::const_iterator itSupports = claimsForName.supports.begin(); itSupports != claimsForName.supports.end(); ++itSupports)
|
||||||
|
{
|
||||||
|
claimSupportMapType::iterator itClaimAndSupports = claimSupportMap.find(itSupports->supportedClaimId);
|
||||||
|
if (itClaimAndSupports == claimSupportMap.end())
|
||||||
|
{
|
||||||
|
std::pair<supportsWithoutClaimsMapType::iterator, bool> ret = supportsWithoutClaims.insert(std::pair<uint160, std::vector<CSupportValue> >(itSupports->supportedClaimId, std::vector<CSupportValue>()));
|
||||||
|
ret.first->second.push_back(*itSupports);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
itClaimAndSupports->second.second.push_back(*itSupports);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
UniValue ret(UniValue::VOBJ);
|
||||||
|
UniValue claimObjs(UniValue::VARR);
|
||||||
|
ret.push_back(Pair("nLastTakeoverHeight", claimsForName.nLastTakeoverHeight));
|
||||||
|
for (claimSupportMapType::const_iterator itClaimsAndSupports = claimSupportMap.begin(); itClaimsAndSupports != claimSupportMap.end(); ++itClaimsAndSupports)
|
||||||
|
{
|
||||||
|
UniValue claimAndSupportsObj = claimsAndSupportsToJSON(itClaimsAndSupports, nCurrentHeight);
|
||||||
|
claimObjs.push_back(claimAndSupportsObj);
|
||||||
|
}
|
||||||
|
ret.push_back(Pair("claims", claimObjs));
|
||||||
|
UniValue unmatchedSupports(UniValue::VARR);
|
||||||
|
for (supportsWithoutClaimsMapType::const_iterator itSupportsWithoutClaims = supportsWithoutClaims.begin(); itSupportsWithoutClaims != supportsWithoutClaims.end(); ++itSupportsWithoutClaims)
|
||||||
|
{
|
||||||
|
UniValue supportsObj = supportsWithoutClaimsToJSON(itSupportsWithoutClaims, nCurrentHeight);
|
||||||
|
unmatchedSupports.push_back(supportsObj);
|
||||||
|
}
|
||||||
|
ret.push_back(Pair("supports without claims", unmatchedSupports));
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
UniValue getclaimbyid(const UniValue& params, bool fHelp)
|
||||||
|
{
|
||||||
|
if (fHelp || params.size() != 1)
|
||||||
|
throw std::runtime_error(
|
||||||
|
"getclaimbyid\n"
|
||||||
|
"Get a claim by claim id\n"
|
||||||
|
"Arguments: \n"
|
||||||
|
"1. \"claimId\" (string) the claimId of this claim\n"
|
||||||
|
"Result:\n"
|
||||||
|
"{\n"
|
||||||
|
" \"name\" (string) the name of the claim\n"
|
||||||
|
" \"value\" (string) claim metadata\n"
|
||||||
|
" \"claimId\" (string) the claimId of this claim\n"
|
||||||
|
" \"txid\" (string) the hash of the transaction which has successfully claimed this name\n"
|
||||||
|
" \"n\" (numeric) vout value\n"
|
||||||
|
" \"amount\" (numeric) txout value\n"
|
||||||
|
" \"effective amount\" (numeric) txout amount plus amount from all supports associated with the claim\n"
|
||||||
|
" \"supports\" (array of object) supports for this claim\n"
|
||||||
|
" [\n"
|
||||||
|
" \"txid\" (string) the txid of the support\n"
|
||||||
|
" \"n\" (numeric) the index of the support in the transaction's list of outputs\n"
|
||||||
|
" \"height\" (numeric) the height at which the support was included in the blockchain\n"
|
||||||
|
" \"valid at height\" (numeric) the height at which the support is valid\n"
|
||||||
|
" \"amount\" (numeric) the amount of the support\n"
|
||||||
|
" ]\n"
|
||||||
|
" \"height\" (numeric) the height of the block in which this claim transaction is located\n"
|
||||||
|
" \"valid at height\" (numeric) the height at which the claim is valid\n"
|
||||||
|
"}\n");
|
||||||
|
|
||||||
|
LOCK(cs_main);
|
||||||
|
uint160 claimId = ParseClaimtrieId(params[0], "Claim-id (parameter 1)");
|
||||||
|
UniValue claim(UniValue::VOBJ);
|
||||||
|
std::string name;
|
||||||
|
CClaimValue claimValue;
|
||||||
|
pclaimTrie->getClaimById(claimId, name, claimValue);
|
||||||
|
if (claimValue.claimId == claimId)
|
||||||
|
{
|
||||||
|
std::vector<CSupportValue> supports;
|
||||||
|
CAmount effectiveAmount = pclaimTrie->getEffectiveAmountForClaimWithSupports(
|
||||||
|
name, claimValue.claimId, supports);
|
||||||
|
|
||||||
|
std::string sValue;
|
||||||
|
getValueForClaim(claimValue.outPoint, sValue);
|
||||||
|
claim.push_back(Pair("name", name));
|
||||||
|
claim.push_back(Pair("value", sValue));
|
||||||
|
claim.push_back(Pair("claimId", claimValue.claimId.GetHex()));
|
||||||
|
claim.push_back(Pair("txid", claimValue.outPoint.hash.GetHex()));
|
||||||
|
claim.push_back(Pair("n", (int) claimValue.outPoint.n));
|
||||||
|
claim.push_back(Pair("amount", claimValue.nAmount));
|
||||||
|
claim.push_back(Pair("effective amount", effectiveAmount));
|
||||||
|
UniValue supportList(UniValue::VARR);
|
||||||
|
BOOST_FOREACH(const CSupportValue& support, supports) {
|
||||||
|
UniValue supportEntry(UniValue::VOBJ);
|
||||||
|
supportEntry.push_back(Pair("txid", support.outPoint.hash.GetHex()));
|
||||||
|
supportEntry.push_back(Pair("n", (int)support.outPoint.n));
|
||||||
|
supportEntry.push_back(Pair("height", support.nHeight));
|
||||||
|
supportEntry.push_back(Pair("valid at height", support.nValidAtHeight));
|
||||||
|
supportEntry.push_back(Pair("amount", support.nAmount));
|
||||||
|
supportList.push_back(supportEntry);
|
||||||
|
}
|
||||||
|
claim.push_back(Pair("supports", supportList));
|
||||||
|
claim.push_back(Pair("height", claimValue.nHeight));
|
||||||
|
claim.push_back(Pair("valid at height", claimValue.nValidAtHeight));
|
||||||
|
}
|
||||||
|
return claim;
|
||||||
|
}
|
||||||
|
|
||||||
|
UniValue gettotalclaimednames(const UniValue& params, bool fHelp)
|
||||||
|
{
|
||||||
|
if (fHelp || params.size() != 0)
|
||||||
|
throw std::runtime_error(
|
||||||
|
"gettotalclaimednames\n"
|
||||||
|
"Return the total number of names that have been\n"
|
||||||
|
"successfully claimed, and therefore exist in the trie\n"
|
||||||
|
"Arguments:\n"
|
||||||
|
"Result:\n"
|
||||||
|
"\"total names\" (numeric) the total number of\n"
|
||||||
|
" names in the trie\n"
|
||||||
|
);
|
||||||
|
LOCK(cs_main);
|
||||||
|
if (!pclaimTrie)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
unsigned int num_names = pclaimTrie->getTotalNamesInTrie();
|
||||||
|
return int(num_names);
|
||||||
|
}
|
||||||
|
|
||||||
|
UniValue gettotalclaims(const UniValue& params, bool fHelp)
|
||||||
|
{
|
||||||
|
if (fHelp || params.size() != 0)
|
||||||
|
throw std::runtime_error(
|
||||||
|
"gettotalclaims\n"
|
||||||
|
"Return the total number of active claims in the trie\n"
|
||||||
|
"Arguments:\n"
|
||||||
|
"Result:\n"
|
||||||
|
"\"total claims\" (numeric) the total number\n"
|
||||||
|
" of active claims\n"
|
||||||
|
);
|
||||||
|
LOCK(cs_main);
|
||||||
|
if (!pclaimTrie)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
unsigned int num_claims = pclaimTrie->getTotalClaimsInTrie();
|
||||||
|
return int(num_claims);
|
||||||
|
}
|
||||||
|
|
||||||
|
UniValue gettotalvalueofclaims(const UniValue& params, bool fHelp)
|
||||||
|
{
|
||||||
|
if (fHelp || params.size() > 1)
|
||||||
|
throw std::runtime_error(
|
||||||
|
"gettotalvalueofclaims\n"
|
||||||
|
"Return the total value of the claims in the trie\n"
|
||||||
|
"Arguments:\n"
|
||||||
|
"1. \"controlling_only\" (boolean) only include the value\n"
|
||||||
|
" of controlling claims\n"
|
||||||
|
"Result:\n"
|
||||||
|
"\"total value\" (numeric) the total value of the\n"
|
||||||
|
" claims in the trie\n"
|
||||||
|
);
|
||||||
|
LOCK(cs_main);
|
||||||
|
if (!pclaimTrie)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
bool controlling_only = false;
|
||||||
|
if (params.size() == 1)
|
||||||
|
controlling_only = params[0].get_bool();
|
||||||
|
CAmount total_amount = pclaimTrie->getTotalValueOfClaimsInTrie(controlling_only);
|
||||||
|
return ValueFromAmount(total_amount);
|
||||||
|
}
|
||||||
|
|
||||||
|
UniValue getclaimsfortx(const UniValue& params, bool fHelp)
|
||||||
|
{
|
||||||
|
if (fHelp || params.size() != 1)
|
||||||
|
throw std::runtime_error(
|
||||||
|
"getclaimsfortx\n"
|
||||||
|
"Return any claims or supports found in a transaction\n"
|
||||||
|
"Arguments:\n"
|
||||||
|
"1. \"txid\" (string) the txid of the transaction to check for unspent claims\n"
|
||||||
|
"Result:\n"
|
||||||
|
"[\n"
|
||||||
|
" {\n"
|
||||||
|
" \"nOut\" (numeric) the index of the claim or support in the transaction's list out outputs\n"
|
||||||
|
" \"claim type\" (string) 'claim' or 'support'\n"
|
||||||
|
" \"name\" (string) the name claimed or supported\n"
|
||||||
|
" \"value\" (string) if a name claim, the value of the claim\n"
|
||||||
|
" \"supported txid\" (string) if a support, the txid of the supported claim\n"
|
||||||
|
" \"supported nout\" (numeric) if a support, the index of the supported claim in its transaction\n"
|
||||||
|
" \"depth\" (numeric) the depth of the transaction in the main chain\n"
|
||||||
|
" \"in claim trie\" (boolean) if a name claim, whether the claim is active, i.e. has made it into the trie\n"
|
||||||
|
" \"is controlling\" (boolean) if a name claim, whether the claim is the current controlling claim for the name\n"
|
||||||
|
" \"in support map\" (boolean) if a support, whether the support is active, i.e. has made it into the support map\n"
|
||||||
|
" \"in queue\" (boolean) whether the claim is in a queue waiting to be inserted into the trie or support map\n"
|
||||||
|
" \"blocks to valid\" (numeric) if in a queue, the number of blocks until it's inserted into the trie or support map\n"
|
||||||
|
" }\n"
|
||||||
|
"]\n"
|
||||||
|
);
|
||||||
|
|
||||||
|
LOCK(cs_main);
|
||||||
|
uint256 hash = ParseHashV(params[0], "txid (parameter 1)");
|
||||||
|
UniValue ret(UniValue::VARR);
|
||||||
|
|
||||||
|
int op;
|
||||||
|
std::vector<std::vector<unsigned char> > vvchParams;
|
||||||
|
|
||||||
|
CCoinsViewCache view(pcoinsTip);
|
||||||
|
const CCoins* coin = view.AccessCoins(hash);
|
||||||
|
std::vector<CTxOut> txouts;
|
||||||
|
int nHeight = 0;
|
||||||
|
if (!coin)
|
||||||
|
{
|
||||||
|
CTransaction tx;
|
||||||
|
if (!mempool.lookup(hash, tx))
|
||||||
|
{
|
||||||
|
return NullUniValue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
txouts = tx.vout;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
txouts = coin->vout;
|
||||||
|
nHeight = coin->nHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < txouts.size(); ++i)
|
||||||
|
{
|
||||||
|
if (!txouts[i].IsNull())
|
||||||
|
{
|
||||||
|
vvchParams.clear();
|
||||||
|
const CTxOut& txout = txouts[i];
|
||||||
|
UniValue o(UniValue::VOBJ);
|
||||||
|
if (DecodeClaimScript(txout.scriptPubKey, op, vvchParams))
|
||||||
|
{
|
||||||
|
o.push_back(Pair("nOut", (int64_t)i));
|
||||||
|
std::string sName(vvchParams[0].begin(), vvchParams[0].end());
|
||||||
|
o.push_back(Pair("name", sName));
|
||||||
|
if (op == OP_CLAIM_NAME)
|
||||||
|
{
|
||||||
|
std::string sValue(vvchParams[1].begin(), vvchParams[1].end());
|
||||||
|
uint160 claimId = ClaimIdHash(hash, i);
|
||||||
|
o.push_back(Pair("claimId", claimId.GetHex()));
|
||||||
|
o.push_back(Pair("value", sValue));
|
||||||
|
}
|
||||||
|
else if (op == OP_UPDATE_CLAIM)
|
||||||
|
{
|
||||||
|
uint160 claimId(vvchParams[1]);
|
||||||
|
std::string sValue(vvchParams[2].begin(), vvchParams[2].end());
|
||||||
|
o.push_back(Pair("claimId", claimId.GetHex()));
|
||||||
|
o.push_back(Pair("value", sValue));
|
||||||
|
}
|
||||||
|
else if (op == OP_SUPPORT_CLAIM)
|
||||||
|
{
|
||||||
|
uint160 supportedClaimId(vvchParams[1]);
|
||||||
|
o.push_back(Pair("supported claimId", supportedClaimId.GetHex()));
|
||||||
|
}
|
||||||
|
if (nHeight > 0)
|
||||||
|
{
|
||||||
|
o.push_back(Pair("depth", chainActive.Height() - nHeight));
|
||||||
|
if (op == OP_CLAIM_NAME || op == OP_UPDATE_CLAIM)
|
||||||
|
{
|
||||||
|
bool inClaimTrie = pclaimTrie->haveClaim(sName, COutPoint(hash, i));
|
||||||
|
o.push_back(Pair("in claim trie", inClaimTrie));
|
||||||
|
if (inClaimTrie)
|
||||||
|
{
|
||||||
|
CClaimValue claim;
|
||||||
|
if (!pclaimTrie->getInfoForName(sName, claim))
|
||||||
|
{
|
||||||
|
LogPrintf("HaveClaim was true but getInfoForName returned false.");
|
||||||
|
}
|
||||||
|
o.push_back(Pair("is controlling", (claim.outPoint.hash == hash && claim.outPoint.n == i)));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int nValidAtHeight;
|
||||||
|
if (pclaimTrie->haveClaimInQueue(sName, COutPoint(hash, i), nValidAtHeight))
|
||||||
|
{
|
||||||
|
o.push_back(Pair("in queue", true));
|
||||||
|
o.push_back(Pair("blocks to valid", nValidAtHeight - chainActive.Height()));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
o.push_back(Pair("in queue", false));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (op == OP_SUPPORT_CLAIM)
|
||||||
|
{
|
||||||
|
bool inSupportMap = pclaimTrie->haveSupport(sName, COutPoint(hash, i));
|
||||||
|
o.push_back(Pair("in support map", inSupportMap));
|
||||||
|
if (!inSupportMap)
|
||||||
|
{
|
||||||
|
int nValidAtHeight;
|
||||||
|
if (pclaimTrie->haveSupportInQueue(sName, COutPoint(hash, i), nValidAtHeight))
|
||||||
|
{
|
||||||
|
o.push_back(Pair("in queue", true));
|
||||||
|
o.push_back(Pair("blocks to valid", nValidAtHeight - chainActive.Height()));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
o.push_back(Pair("in queue", false));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
o.push_back(Pair("depth", 0));
|
||||||
|
if (op == OP_CLAIM_NAME || op == OP_UPDATE_CLAIM)
|
||||||
|
{
|
||||||
|
o.push_back(Pair("in claim trie", false));
|
||||||
|
}
|
||||||
|
else if (op == OP_SUPPORT_CLAIM)
|
||||||
|
{
|
||||||
|
o.push_back(Pair("in support map", false));
|
||||||
|
}
|
||||||
|
o.push_back(Pair("in queue", false));
|
||||||
|
}
|
||||||
|
ret.push_back(o);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
UniValue proofToJSON(const CClaimTrieProof& proof)
|
||||||
|
{
|
||||||
|
UniValue result(UniValue::VOBJ);
|
||||||
|
UniValue nodes(UniValue::VARR);
|
||||||
|
for (std::vector<CClaimTrieProofNode>::const_iterator itNode = proof.nodes.begin(); itNode != proof.nodes.end(); ++itNode)
|
||||||
|
{
|
||||||
|
UniValue node(UniValue::VOBJ);
|
||||||
|
UniValue children(UniValue::VARR);
|
||||||
|
for (std::vector<std::pair<unsigned char, uint256> >::const_iterator itChildren = itNode->children.begin(); itChildren != itNode->children.end(); ++itChildren)
|
||||||
|
{
|
||||||
|
UniValue child(UniValue::VOBJ);
|
||||||
|
child.push_back(Pair("character", itChildren->first));
|
||||||
|
if (!itChildren->second.IsNull())
|
||||||
|
{
|
||||||
|
child.push_back(Pair("nodeHash", itChildren->second.GetHex()));
|
||||||
|
}
|
||||||
|
children.push_back(child);
|
||||||
|
}
|
||||||
|
node.push_back(Pair("children", children));
|
||||||
|
if (itNode->hasValue && !itNode->valHash.IsNull())
|
||||||
|
{
|
||||||
|
node.push_back(Pair("valueHash", itNode->valHash.GetHex()));
|
||||||
|
}
|
||||||
|
nodes.push_back(node);
|
||||||
|
}
|
||||||
|
result.push_back(Pair("nodes", nodes));
|
||||||
|
if (proof.hasValue)
|
||||||
|
{
|
||||||
|
result.push_back(Pair("txhash", proof.outPoint.hash.GetHex()));
|
||||||
|
result.push_back(Pair("nOut", (int)proof.outPoint.n));
|
||||||
|
result.push_back(Pair("last takeover height", (int)proof.nHeightOfLastTakeover));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
UniValue getnameproof(const UniValue& params, bool fHelp)
|
||||||
|
{
|
||||||
|
if (fHelp || (params.size() != 1 && params.size() != 2))
|
||||||
|
throw std::runtime_error(
|
||||||
|
"getnameproof\n"
|
||||||
|
"Return the cryptographic proof that a name maps to a value\n"
|
||||||
|
"or doesn't.\n"
|
||||||
|
"Arguments:\n"
|
||||||
|
"1. \"name\" (string) the name to get a proof for\n"
|
||||||
|
"2. \"blockhash\" (string, optional) the hash of the block\n"
|
||||||
|
" which is the basis\n"
|
||||||
|
" of the proof. If\n"
|
||||||
|
" none is given, \n"
|
||||||
|
" the latest block\n"
|
||||||
|
" will be used.\n"
|
||||||
|
"Result: \n"
|
||||||
|
"{\n"
|
||||||
|
" \"nodes\" : [ (array of object) full nodes (i.e.\n"
|
||||||
|
" those which lead to\n"
|
||||||
|
" the requested name)\n"
|
||||||
|
" \"children\" : [ (array of object) the children of\n"
|
||||||
|
" this node\n"
|
||||||
|
" \"child\" : { (object) a child node, either leaf or\n"
|
||||||
|
" reference to a full node\n"
|
||||||
|
" \"character\" : \"char\" (string) the character which\n"
|
||||||
|
" leads from the parent\n"
|
||||||
|
" to this child node\n"
|
||||||
|
" \"nodeHash\" : \"hash\" (string, if exists) the hash of\n"
|
||||||
|
" the node if\n"
|
||||||
|
" this is a \n"
|
||||||
|
" leaf node\n"
|
||||||
|
" }\n"
|
||||||
|
" ]\n"
|
||||||
|
" \"valueHash\" (string, if exists) the hash of this\n"
|
||||||
|
" node's value, if\n"
|
||||||
|
" it has one. If \n"
|
||||||
|
" this is the\n"
|
||||||
|
" requested name\n"
|
||||||
|
" this will not\n"
|
||||||
|
" exist whether\n"
|
||||||
|
" the node has a\n"
|
||||||
|
" value or not\n"
|
||||||
|
" ]\n"
|
||||||
|
" \"txhash\" : \"hash\" (string, if exists) the txid of the\n"
|
||||||
|
" claim which controls\n"
|
||||||
|
" this name, if there\n"
|
||||||
|
" is one.\n"
|
||||||
|
" \"nOut\" : n, (numeric) the nOut of the claim which\n"
|
||||||
|
" controls this name, if there\n"
|
||||||
|
" is one.\n"
|
||||||
|
" \"last takeover height\" (numeric) the most recent height at\n"
|
||||||
|
" which the value of a name\n"
|
||||||
|
" changed other than through\n"
|
||||||
|
" an update to the winning\n"
|
||||||
|
" bid\n"
|
||||||
|
" }\n"
|
||||||
|
"}\n");
|
||||||
|
|
||||||
|
LOCK(cs_main);
|
||||||
|
std::string strName = params[0].get_str();
|
||||||
|
uint256 blockHash;
|
||||||
|
if (params.size() == 2)
|
||||||
|
{
|
||||||
|
blockHash = ParseHashV(params[1], "blockhash (optional parameter 2)");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
blockHash = chainActive.Tip()->GetBlockHash();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mapBlockIndex.count(blockHash) == 0)
|
||||||
|
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Block not found");
|
||||||
|
|
||||||
|
CBlockIndex* pblockIndex = mapBlockIndex[blockHash];
|
||||||
|
if (!chainActive.Contains(pblockIndex))
|
||||||
|
throw JSONRPCError(RPC_INTERNAL_ERROR, "Block not in main chain");
|
||||||
|
|
||||||
|
if (chainActive.Tip()->nHeight > (pblockIndex->nHeight + MAX_RPC_BLOCK_DECREMENTS))
|
||||||
|
throw JSONRPCError(RPC_INTERNAL_ERROR, "Block too deep to generate proof");
|
||||||
|
|
||||||
|
CClaimTrieProof proof;
|
||||||
|
if (!GetProofForName(pblockIndex, strName, proof))
|
||||||
|
throw JSONRPCError(RPC_INTERNAL_ERROR, "Failed to generate proof");
|
||||||
|
|
||||||
|
return proofToJSON(proof);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const CRPCCommand commands[] =
|
||||||
|
{ // category name actor (function) okSafeMode
|
||||||
|
// --------------------- ------------------------ ----------------------- ----------
|
||||||
|
{ "Claimtrie", "getclaimsintrie", &getclaimsintrie, true },
|
||||||
|
{ "Claimtrie", "getclaimtrie", &getclaimtrie, true },
|
||||||
|
{ "Claimtrie", "getvalueforname", &getvalueforname, true },
|
||||||
|
{ "Claimtrie", "getclaimsforname", &getclaimsforname, true },
|
||||||
|
{ "Claimtrie", "gettotalclaimednames", &gettotalclaimednames, true },
|
||||||
|
{ "Claimtrie", "gettotalclaims", &gettotalclaims, true },
|
||||||
|
{ "Claimtrie", "gettotalvalueofclaims", &gettotalvalueofclaims, true },
|
||||||
|
{ "Claimtrie", "getclaimsfortx", &getclaimsfortx, true },
|
||||||
|
{ "Claimtrie", "getnameproof", &getnameproof, true },
|
||||||
|
{ "Claimtrie", "getclaimbyid", &getclaimbyid, true },
|
||||||
|
};
|
||||||
|
|
||||||
|
void RegisterClaimTrieRPCCommands(CRPCTable &tableRPC)
|
||||||
|
{
|
||||||
|
for (unsigned int vcidx = 0; vcidx < ARRAYLEN(commands); vcidx++)
|
||||||
|
tableRPC.appendCommand(commands[vcidx].name, &commands[vcidx]);
|
||||||
|
}
|
|
@ -27,6 +27,8 @@ static const CRPCConvertParam vRPCConvertParams[] =
|
||||||
{ "stop", 0 },
|
{ "stop", 0 },
|
||||||
{ "setmocktime", 0 },
|
{ "setmocktime", 0 },
|
||||||
{ "getaddednodeinfo", 0 },
|
{ "getaddednodeinfo", 0 },
|
||||||
|
{ "setgenerate", 0 },
|
||||||
|
{ "setgenerate", 1 },
|
||||||
{ "generate", 0 },
|
{ "generate", 0 },
|
||||||
{ "generate", 1 },
|
{ "generate", 1 },
|
||||||
{ "generatetoaddress", 0 },
|
{ "generatetoaddress", 0 },
|
||||||
|
@ -100,6 +102,16 @@ static const CRPCConvertParam vRPCConvertParams[] =
|
||||||
{ "estimatesmartpriority", 0 },
|
{ "estimatesmartpriority", 0 },
|
||||||
{ "prioritisetransaction", 1 },
|
{ "prioritisetransaction", 1 },
|
||||||
{ "prioritisetransaction", 2 },
|
{ "prioritisetransaction", 2 },
|
||||||
|
{ "claimname", 2},
|
||||||
|
{ "updateclaim", 2},
|
||||||
|
{ "abandonclaim", 2},
|
||||||
|
{ "listnameclaims", 0},
|
||||||
|
{ "listnameclaims", 1},
|
||||||
|
{ "listnameclaims", 2},
|
||||||
|
{ "supportclaim", 2},
|
||||||
|
{ "supportclaim", 3},
|
||||||
|
{ "abandonsupport", 2},
|
||||||
|
{ "gettotalvalueofclaims", 0},
|
||||||
{ "setban", 2 },
|
{ "setban", 2 },
|
||||||
{ "setban", 3 },
|
{ "setban", 3 },
|
||||||
};
|
};
|
||||||
|
|
|
@ -72,6 +72,26 @@ UniValue GetNetworkHashPS(int lookup, int height) {
|
||||||
return workDiff.getdouble() / timeDiff;
|
return workDiff.getdouble() / timeDiff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UniValue gethashespersec(const UniValue& params, bool fHelp)
|
||||||
|
{
|
||||||
|
if (fHelp || params.size() != 0)
|
||||||
|
throw runtime_error(
|
||||||
|
"gethashespersec\n"
|
||||||
|
"\nReturns a recent hashes per second performance measurement while generating.\n"
|
||||||
|
"See the getgenerate and setgenerate calls to turn generation on and off.\n"
|
||||||
|
"\nResult:\n"
|
||||||
|
"n (numeric) The recent hashes per second when generation is on (will return 0 if generation is off)\n"
|
||||||
|
"\nExamples:\n"
|
||||||
|
+ HelpExampleCli("gethashespersec", "")
|
||||||
|
+ HelpExampleRpc("gethashespersec", "")
|
||||||
|
);
|
||||||
|
|
||||||
|
if (GetTimeMillis() - nHPSTimerStart > 8000)
|
||||||
|
return (int64_t)0;
|
||||||
|
return (int64_t)dHashesPerSec;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
UniValue getnetworkhashps(const UniValue& params, bool fHelp)
|
UniValue getnetworkhashps(const UniValue& params, bool fHelp)
|
||||||
{
|
{
|
||||||
if (fHelp || params.size() > 2)
|
if (fHelp || params.size() > 2)
|
||||||
|
@ -94,6 +114,25 @@ UniValue getnetworkhashps(const UniValue& params, bool fHelp)
|
||||||
return GetNetworkHashPS(params.size() > 0 ? params[0].get_int() : 120, params.size() > 1 ? params[1].get_int() : -1);
|
return GetNetworkHashPS(params.size() > 0 ? params[0].get_int() : 120, params.size() > 1 ? params[1].get_int() : -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UniValue getgenerate(const UniValue& params, bool fHelp)
|
||||||
|
{
|
||||||
|
if (fHelp || params.size() != 0)
|
||||||
|
throw runtime_error(
|
||||||
|
"getgenerate\n"
|
||||||
|
"\nReturn if the server is set to generate coins or not. The default is false.\n"
|
||||||
|
"It is set with the command line argument -gen (or " + std::string(BITCOIN_CONF_FILENAME) + " setting gen)\n"
|
||||||
|
"It can also be set with the setgenerate call.\n"
|
||||||
|
"\nResult\n"
|
||||||
|
"true|false (boolean) If the server is set to generate coins or not\n"
|
||||||
|
"\nExamples:\n"
|
||||||
|
+ HelpExampleCli("getgenerate", "")
|
||||||
|
+ HelpExampleRpc("getgenerate", "")
|
||||||
|
);
|
||||||
|
|
||||||
|
LOCK(cs_main);
|
||||||
|
return GetBoolArg("-gen", DEFAULT_GENERATE);
|
||||||
|
}
|
||||||
|
|
||||||
UniValue generateBlocks(boost::shared_ptr<CReserveScript> coinbaseScript, int nGenerate, uint64_t nMaxTries, bool keepScript)
|
UniValue generateBlocks(boost::shared_ptr<CReserveScript> coinbaseScript, int nGenerate, uint64_t nMaxTries, bool keepScript)
|
||||||
{
|
{
|
||||||
static const int nInnerLoopCount = 0x10000;
|
static const int nInnerLoopCount = 0x10000;
|
||||||
|
@ -119,7 +158,7 @@ UniValue generateBlocks(boost::shared_ptr<CReserveScript> coinbaseScript, int nG
|
||||||
LOCK(cs_main);
|
LOCK(cs_main);
|
||||||
IncrementExtraNonce(pblock, chainActive.Tip(), nExtraNonce);
|
IncrementExtraNonce(pblock, chainActive.Tip(), nExtraNonce);
|
||||||
}
|
}
|
||||||
while (nMaxTries > 0 && pblock->nNonce < nInnerLoopCount && !CheckProofOfWork(pblock->GetHash(), pblock->nBits, Params().GetConsensus())) {
|
while (nMaxTries > 0 && pblock->nNonce < nInnerLoopCount && !CheckProofOfWork(pblock->GetPoWHash(), pblock->nBits, Params().GetConsensus())) {
|
||||||
++pblock->nNonce;
|
++pblock->nNonce;
|
||||||
--nMaxTries;
|
--nMaxTries;
|
||||||
}
|
}
|
||||||
|
@ -144,6 +183,50 @@ UniValue generateBlocks(boost::shared_ptr<CReserveScript> coinbaseScript, int nG
|
||||||
return blockHashes;
|
return blockHashes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UniValue setgenerate(const UniValue& params, bool fHelp)
|
||||||
|
{
|
||||||
|
if (fHelp || params.size() < 1 || params.size() > 2)
|
||||||
|
throw runtime_error(
|
||||||
|
"setgenerate generate ( genproclimit )\n"
|
||||||
|
"\nSet 'generate' true or false to turn generation on or off.\n"
|
||||||
|
"Generation is limited to 'genproclimit' processors, -1 is unlimited.\n"
|
||||||
|
"See the getgenerate call for the current setting.\n"
|
||||||
|
"\nArguments:\n"
|
||||||
|
"1. generate (boolean, required) Set to true to turn on generation, off to turn off.\n"
|
||||||
|
"2. genproclimit (numeric, optional) Set the processor limit for when generation is on. Can be -1 for unlimited.\n"
|
||||||
|
"\nExamples:\n"
|
||||||
|
"\nSet the generation on with a limit of one processor\n"
|
||||||
|
+ HelpExampleCli("setgenerate", "true 1") +
|
||||||
|
"\nCheck the setting\n"
|
||||||
|
+ HelpExampleCli("getgenerate", "") +
|
||||||
|
"\nTurn off generation\n"
|
||||||
|
+ HelpExampleCli("setgenerate", "false") +
|
||||||
|
"\nUsing json rpc\n"
|
||||||
|
+ HelpExampleRpc("setgenerate", "true, 1")
|
||||||
|
);
|
||||||
|
|
||||||
|
if (Params().MineBlocksOnDemand())
|
||||||
|
throw JSONRPCError(RPC_METHOD_NOT_FOUND, "Use the generate method instead of setgenerate on this network");
|
||||||
|
|
||||||
|
bool fGenerate = true;
|
||||||
|
if (params.size() > 0)
|
||||||
|
fGenerate = params[0].get_bool();
|
||||||
|
|
||||||
|
int nGenProcLimit = GetArg("-genproclimit", DEFAULT_GENERATE_THREADS);
|
||||||
|
if (params.size() > 1)
|
||||||
|
{
|
||||||
|
nGenProcLimit = params[1].get_int();
|
||||||
|
if (nGenProcLimit == 0)
|
||||||
|
fGenerate = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
mapArgs["-gen"] = (fGenerate ? "1" : "0");
|
||||||
|
mapArgs ["-genproclimit"] = itostr(nGenProcLimit);
|
||||||
|
GenerateBitcoins(fGenerate, nGenProcLimit, Params());
|
||||||
|
|
||||||
|
return NullUniValue;
|
||||||
|
}
|
||||||
|
|
||||||
UniValue generate(const UniValue& params, bool fHelp)
|
UniValue generate(const UniValue& params, bool fHelp)
|
||||||
{
|
{
|
||||||
if (fHelp || params.size() < 1 || params.size() > 2)
|
if (fHelp || params.size() < 1 || params.size() > 2)
|
||||||
|
@ -226,6 +309,9 @@ UniValue getmininginfo(const UniValue& params, bool fHelp)
|
||||||
" \"currentblocktx\": nnn, (numeric) The last block transaction\n"
|
" \"currentblocktx\": nnn, (numeric) The last block transaction\n"
|
||||||
" \"difficulty\": xxx.xxxxx (numeric) The current difficulty\n"
|
" \"difficulty\": xxx.xxxxx (numeric) The current difficulty\n"
|
||||||
" \"errors\": \"...\" (string) Current errors\n"
|
" \"errors\": \"...\" (string) Current errors\n"
|
||||||
|
" \"generate\": true|false (boolean) If the generation is on or off (see getgenerate or setgenerate calls)\n"
|
||||||
|
" \"genproclimit\": n (numeric) The processor limit for generation. -1 if no generation. (see getgenerate or setgenerate calls)\n"
|
||||||
|
" \"hashespersec\": n (numeric) The hashes per second of the generation, or 0 if no generation.\n"
|
||||||
" \"pooledtx\": n (numeric) The size of the mem pool\n"
|
" \"pooledtx\": n (numeric) The size of the mem pool\n"
|
||||||
" \"testnet\": true|false (boolean) If using testnet or not\n"
|
" \"testnet\": true|false (boolean) If using testnet or not\n"
|
||||||
" \"chain\": \"xxxx\", (string) current network name as defined in BIP70 (main, test, regtest)\n"
|
" \"chain\": \"xxxx\", (string) current network name as defined in BIP70 (main, test, regtest)\n"
|
||||||
|
@ -244,10 +330,13 @@ UniValue getmininginfo(const UniValue& params, bool fHelp)
|
||||||
obj.push_back(Pair("currentblocktx", (uint64_t)nLastBlockTx));
|
obj.push_back(Pair("currentblocktx", (uint64_t)nLastBlockTx));
|
||||||
obj.push_back(Pair("difficulty", (double)GetDifficulty()));
|
obj.push_back(Pair("difficulty", (double)GetDifficulty()));
|
||||||
obj.push_back(Pair("errors", GetWarnings("statusbar")));
|
obj.push_back(Pair("errors", GetWarnings("statusbar")));
|
||||||
|
obj.push_back(Pair("genproclimit", (int)GetArg("-genproclimit", -1)));
|
||||||
obj.push_back(Pair("networkhashps", getnetworkhashps(params, false)));
|
obj.push_back(Pair("networkhashps", getnetworkhashps(params, false)));
|
||||||
obj.push_back(Pair("pooledtx", (uint64_t)mempool.size()));
|
obj.push_back(Pair("pooledtx", (uint64_t)mempool.size()));
|
||||||
obj.push_back(Pair("testnet", Params().TestnetToBeDeprecatedFieldRPC()));
|
obj.push_back(Pair("testnet", Params().TestnetToBeDeprecatedFieldRPC()));
|
||||||
obj.push_back(Pair("chain", Params().NetworkIDString()));
|
obj.push_back(Pair("chain", Params().NetworkIDString()));
|
||||||
|
obj.push_back(Pair("generate", getgenerate(params, false)));
|
||||||
|
obj.push_back(Pair("hashespersec", gethashespersec(params, false)));
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -417,11 +506,11 @@ UniValue getblocktemplate(const UniValue& params, bool fHelp)
|
||||||
if (strMode != "template")
|
if (strMode != "template")
|
||||||
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid mode");
|
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid mode");
|
||||||
|
|
||||||
if (vNodes.empty())
|
//if (vNodes.empty())
|
||||||
throw JSONRPCError(RPC_CLIENT_NOT_CONNECTED, "Bitcoin is not connected!");
|
// throw JSONRPCError(RPC_CLIENT_NOT_CONNECTED, "Bitcoin is not connected!");
|
||||||
|
|
||||||
if (IsInitialBlockDownload())
|
if (IsInitialBlockDownload())
|
||||||
throw JSONRPCError(RPC_CLIENT_IN_INITIAL_DOWNLOAD, "Bitcoin is downloading blocks...");
|
throw JSONRPCError(RPC_CLIENT_IN_INITIAL_DOWNLOAD, "LBRYcrd is downloading blocks...");
|
||||||
|
|
||||||
static unsigned int nTransactionsUpdatedLast;
|
static unsigned int nTransactionsUpdatedLast;
|
||||||
|
|
||||||
|
@ -569,6 +658,7 @@ UniValue getblocktemplate(const UniValue& params, bool fHelp)
|
||||||
result.push_back(Pair("curtime", pblock->GetBlockTime()));
|
result.push_back(Pair("curtime", pblock->GetBlockTime()));
|
||||||
result.push_back(Pair("bits", strprintf("%08x", pblock->nBits)));
|
result.push_back(Pair("bits", strprintf("%08x", pblock->nBits)));
|
||||||
result.push_back(Pair("height", (int64_t)(pindexPrev->nHeight+1)));
|
result.push_back(Pair("height", (int64_t)(pindexPrev->nHeight+1)));
|
||||||
|
result.push_back(Pair("claimtrie", pblock->hashClaimTrie.GetHex()));
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -786,10 +876,13 @@ static const CRPCCommand commands[] =
|
||||||
{ // category name actor (function) okSafeMode
|
{ // category name actor (function) okSafeMode
|
||||||
// --------------------- ------------------------ ----------------------- ----------
|
// --------------------- ------------------------ ----------------------- ----------
|
||||||
{ "mining", "getnetworkhashps", &getnetworkhashps, true },
|
{ "mining", "getnetworkhashps", &getnetworkhashps, true },
|
||||||
|
{ "mining", "gethashespersec", &gethashespersec, true },
|
||||||
{ "mining", "getmininginfo", &getmininginfo, true },
|
{ "mining", "getmininginfo", &getmininginfo, true },
|
||||||
{ "mining", "prioritisetransaction", &prioritisetransaction, true },
|
{ "mining", "prioritisetransaction", &prioritisetransaction, true },
|
||||||
{ "mining", "getblocktemplate", &getblocktemplate, true },
|
{ "mining", "getblocktemplate", &getblocktemplate, true },
|
||||||
{ "mining", "submitblock", &submitblock, true },
|
{ "mining", "submitblock", &submitblock, true },
|
||||||
|
{ "mining", "setgenerate", &setgenerate, true },
|
||||||
|
{ "mining", "getgenerate", &getgenerate, true },
|
||||||
|
|
||||||
{ "generating", "generate", &generate, true },
|
{ "generating", "generate", &generate, true },
|
||||||
{ "generating", "generatetoaddress", &generatetoaddress, true },
|
{ "generating", "generatetoaddress", &generatetoaddress, true },
|
||||||
|
|
|
@ -50,7 +50,7 @@ UniValue getinfo(const UniValue& params, bool fHelp)
|
||||||
" \"version\": xxxxx, (numeric) the server version\n"
|
" \"version\": xxxxx, (numeric) the server version\n"
|
||||||
" \"protocolversion\": xxxxx, (numeric) the protocol version\n"
|
" \"protocolversion\": xxxxx, (numeric) the protocol version\n"
|
||||||
" \"walletversion\": xxxxx, (numeric) the wallet version\n"
|
" \"walletversion\": xxxxx, (numeric) the wallet version\n"
|
||||||
" \"balance\": xxxxxxx, (numeric) the total bitcoin balance of the wallet\n"
|
" \"balance\": xxxxxxx, (numeric) the total lbrycrd balance of the wallet\n"
|
||||||
" \"blocks\": xxxxxx, (numeric) the current number of blocks processed in the server\n"
|
" \"blocks\": xxxxxx, (numeric) the current number of blocks processed in the server\n"
|
||||||
" \"timeoffset\": xxxxx, (numeric) the time offset\n"
|
" \"timeoffset\": xxxxx, (numeric) the time offset\n"
|
||||||
" \"connections\": xxxxx, (numeric) the number of connections\n"
|
" \"connections\": xxxxx, (numeric) the number of connections\n"
|
||||||
|
@ -151,14 +151,14 @@ UniValue validateaddress(const UniValue& params, bool fHelp)
|
||||||
{
|
{
|
||||||
if (fHelp || params.size() != 1)
|
if (fHelp || params.size() != 1)
|
||||||
throw runtime_error(
|
throw runtime_error(
|
||||||
"validateaddress \"bitcoinaddress\"\n"
|
"validateaddress \"lbrycrdaddress\"\n"
|
||||||
"\nReturn information about the given bitcoin address.\n"
|
"\nReturn information about the given lbrycrd address.\n"
|
||||||
"\nArguments:\n"
|
"\nArguments:\n"
|
||||||
"1. \"bitcoinaddress\" (string, required) The bitcoin address to validate\n"
|
"1. \"lbrycrdaddress\" (string, required) The lbrycrd address to validate\n"
|
||||||
"\nResult:\n"
|
"\nResult:\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" \"isvalid\" : true|false, (boolean) If the address is valid or not. If not, this is the only property returned.\n"
|
" \"isvalid\" : true|false, (boolean) If the address is valid or not. If not, this is the only property returned.\n"
|
||||||
" \"address\" : \"bitcoinaddress\", (string) The bitcoin address validated\n"
|
" \"address\" : \"lbrycrdaddress\", (string) The lbrycrd address validated\n"
|
||||||
" \"scriptPubKey\" : \"hex\", (string) The hex encoded scriptPubKey generated by the address\n"
|
" \"scriptPubKey\" : \"hex\", (string) The hex encoded scriptPubKey generated by the address\n"
|
||||||
" \"ismine\" : true|false, (boolean) If the address is yours or not\n"
|
" \"ismine\" : true|false, (boolean) If the address is yours or not\n"
|
||||||
" \"iswatchonly\" : true|false, (boolean) If the address is watchonly\n"
|
" \"iswatchonly\" : true|false, (boolean) If the address is watchonly\n"
|
||||||
|
@ -279,9 +279,9 @@ UniValue createmultisig(const UniValue& params, bool fHelp)
|
||||||
|
|
||||||
"\nArguments:\n"
|
"\nArguments:\n"
|
||||||
"1. nrequired (numeric, required) The number of required signatures out of the n keys or addresses.\n"
|
"1. nrequired (numeric, required) The number of required signatures out of the n keys or addresses.\n"
|
||||||
"2. \"keys\" (string, required) A json array of keys which are bitcoin addresses or hex-encoded public keys\n"
|
"2. \"keys\" (string, required) A json array of keys which are lbrycrd addresses or hex-encoded public keys\n"
|
||||||
" [\n"
|
" [\n"
|
||||||
" \"key\" (string) bitcoin address or hex-encoded public key\n"
|
" \"key\" (string) lbrycrd address or hex-encoded public key\n"
|
||||||
" ,...\n"
|
" ,...\n"
|
||||||
" ]\n"
|
" ]\n"
|
||||||
|
|
||||||
|
@ -316,10 +316,10 @@ UniValue verifymessage(const UniValue& params, bool fHelp)
|
||||||
{
|
{
|
||||||
if (fHelp || params.size() != 3)
|
if (fHelp || params.size() != 3)
|
||||||
throw runtime_error(
|
throw runtime_error(
|
||||||
"verifymessage \"bitcoinaddress\" \"signature\" \"message\"\n"
|
"verifymessage \"lbrycrdaddress\" \"signature\" \"message\"\n"
|
||||||
"\nVerify a signed message\n"
|
"\nVerify a signed message\n"
|
||||||
"\nArguments:\n"
|
"\nArguments:\n"
|
||||||
"1. \"bitcoinaddress\" (string, required) The bitcoin address to use for the signature.\n"
|
"1. \"lbrycrdaddress\" (string, required) The lbrycrd address to use for the signature.\n"
|
||||||
"2. \"signature\" (string, required) The signature provided by the signer in base 64 encoding (see signmessage).\n"
|
"2. \"signature\" (string, required) The signature provided by the signer in base 64 encoding (see signmessage).\n"
|
||||||
"3. \"message\" (string, required) The message that was signed.\n"
|
"3. \"message\" (string, required) The message that was signed.\n"
|
||||||
"\nResult:\n"
|
"\nResult:\n"
|
||||||
|
|
|
@ -286,7 +286,7 @@ UniValue getaddednodeinfo(const UniValue& params, bool fHelp)
|
||||||
" \"connected\" : true|false, (boolean) If connected\n"
|
" \"connected\" : true|false, (boolean) If connected\n"
|
||||||
" \"addresses\" : [\n"
|
" \"addresses\" : [\n"
|
||||||
" {\n"
|
" {\n"
|
||||||
" \"address\" : \"192.168.0.201:8333\", (string) The bitcoin server host and port\n"
|
" \"address\" : \"192.168.0.201:8333\", (string) The lbrycrd server host and port\n"
|
||||||
" \"connected\" : \"outbound\" (string) connection, inbound or outbound\n"
|
" \"connected\" : \"outbound\" (string) connection, inbound or outbound\n"
|
||||||
" }\n"
|
" }\n"
|
||||||
" ,...\n"
|
" ,...\n"
|
||||||
|
|
|
@ -159,7 +159,7 @@ UniValue getrawtransaction(const UniValue& params, bool fHelp)
|
||||||
" \"reqSigs\" : n, (numeric) The required sigs\n"
|
" \"reqSigs\" : n, (numeric) The required sigs\n"
|
||||||
" \"type\" : \"pubkeyhash\", (string) The type, eg 'pubkeyhash'\n"
|
" \"type\" : \"pubkeyhash\", (string) The type, eg 'pubkeyhash'\n"
|
||||||
" \"addresses\" : [ (json array of string)\n"
|
" \"addresses\" : [ (json array of string)\n"
|
||||||
" \"bitcoinaddress\" (string) bitcoin address\n"
|
" \"lbrycrdaddress\" (string) lbrycrd address\n"
|
||||||
" ,...\n"
|
" ,...\n"
|
||||||
" ]\n"
|
" ]\n"
|
||||||
" }\n"
|
" }\n"
|
||||||
|
@ -339,7 +339,7 @@ UniValue createrawtransaction(const UniValue& params, bool fHelp)
|
||||||
" ]\n"
|
" ]\n"
|
||||||
"2. \"outputs\" (string, required) a json object with outputs\n"
|
"2. \"outputs\" (string, required) a json object with outputs\n"
|
||||||
" {\n"
|
" {\n"
|
||||||
" \"address\": x.xxx (numeric or string, required) The key is the bitcoin address, the numeric value (can be string) is the " + CURRENCY_UNIT + " amount\n"
|
" \"address\": x.xxx (numeric or string, required) The key is the lbrycrd address, the numeric value (can be string) is the " + CURRENCY_UNIT + " amount\n"
|
||||||
" \"data\": \"hex\", (string, required) The key is \"data\", the value is hex encoded data\n"
|
" \"data\": \"hex\", (string, required) The key is \"data\", the value is hex encoded data\n"
|
||||||
" ...\n"
|
" ...\n"
|
||||||
" }\n"
|
" }\n"
|
||||||
|
@ -456,7 +456,7 @@ UniValue decoderawtransaction(const UniValue& params, bool fHelp)
|
||||||
" \"reqSigs\" : n, (numeric) The required sigs\n"
|
" \"reqSigs\" : n, (numeric) The required sigs\n"
|
||||||
" \"type\" : \"pubkeyhash\", (string) The type, eg 'pubkeyhash'\n"
|
" \"type\" : \"pubkeyhash\", (string) The type, eg 'pubkeyhash'\n"
|
||||||
" \"addresses\" : [ (json array of string)\n"
|
" \"addresses\" : [ (json array of string)\n"
|
||||||
" \"12tvKAXCxZjSmdNbao16dKXC8tRWfcF5oc\" (string) bitcoin address\n"
|
" \"12tvKAXCxZjSmdNbao16dKXC8tRWfcF5oc\" (string) lbrycrd address\n"
|
||||||
" ,...\n"
|
" ,...\n"
|
||||||
" ]\n"
|
" ]\n"
|
||||||
" }\n"
|
" }\n"
|
||||||
|
@ -499,7 +499,7 @@ UniValue decodescript(const UniValue& params, bool fHelp)
|
||||||
" \"type\":\"type\", (string) The output type\n"
|
" \"type\":\"type\", (string) The output type\n"
|
||||||
" \"reqSigs\": n, (numeric) The required signatures\n"
|
" \"reqSigs\": n, (numeric) The required signatures\n"
|
||||||
" \"addresses\": [ (json array of string)\n"
|
" \"addresses\": [ (json array of string)\n"
|
||||||
" \"address\" (string) bitcoin address\n"
|
" \"address\" (string) lbrycrd address\n"
|
||||||
" ,...\n"
|
" ,...\n"
|
||||||
" ],\n"
|
" ],\n"
|
||||||
" \"p2sh\",\"address\" (string) script address\n"
|
" \"p2sh\",\"address\" (string) script address\n"
|
||||||
|
|
|
@ -19,6 +19,9 @@ void RegisterMiscRPCCommands(CRPCTable &tableRPC);
|
||||||
void RegisterMiningRPCCommands(CRPCTable &tableRPC);
|
void RegisterMiningRPCCommands(CRPCTable &tableRPC);
|
||||||
/** Register raw transaction RPC commands */
|
/** Register raw transaction RPC commands */
|
||||||
void RegisterRawTransactionRPCCommands(CRPCTable &tableRPC);
|
void RegisterRawTransactionRPCCommands(CRPCTable &tableRPC);
|
||||||
|
/** Register claim trie RPC commands */
|
||||||
|
void RegisterClaimTrieRPCCommands(CRPCTable &tableRPC);
|
||||||
|
|
||||||
|
|
||||||
static inline void RegisterAllCoreRPCCommands(CRPCTable &tableRPC)
|
static inline void RegisterAllCoreRPCCommands(CRPCTable &tableRPC)
|
||||||
{
|
{
|
||||||
|
@ -27,6 +30,7 @@ static inline void RegisterAllCoreRPCCommands(CRPCTable &tableRPC)
|
||||||
RegisterMiscRPCCommands(tableRPC);
|
RegisterMiscRPCCommands(tableRPC);
|
||||||
RegisterMiningRPCCommands(tableRPC);
|
RegisterMiningRPCCommands(tableRPC);
|
||||||
RegisterRawTransactionRPCCommands(tableRPC);
|
RegisterRawTransactionRPCCommands(tableRPC);
|
||||||
|
RegisterClaimTrieRPCCommands(tableRPC);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -255,11 +255,11 @@ UniValue stop(const UniValue& params, bool fHelp)
|
||||||
if (fHelp || params.size() > 1)
|
if (fHelp || params.size() > 1)
|
||||||
throw runtime_error(
|
throw runtime_error(
|
||||||
"stop\n"
|
"stop\n"
|
||||||
"\nStop Bitcoin server.");
|
"\nStop LBRYcrd server.");
|
||||||
// Event loop will exit after current HTTP requests have been handled, so
|
// Event loop will exit after current HTTP requests have been handled, so
|
||||||
// this reply will get back to the client.
|
// this reply will get back to the client.
|
||||||
StartShutdown();
|
StartShutdown();
|
||||||
return "Bitcoin server stopping";
|
return "LBRYcrd server stopping";
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -460,13 +460,13 @@ std::vector<std::string> CRPCTable::listCommands() const
|
||||||
|
|
||||||
std::string HelpExampleCli(const std::string& methodname, const std::string& args)
|
std::string HelpExampleCli(const std::string& methodname, const std::string& args)
|
||||||
{
|
{
|
||||||
return "> bitcoin-cli " + methodname + " " + args + "\n";
|
return "> lbrycrd-cli " + methodname + " " + args + "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string HelpExampleRpc(const std::string& methodname, const std::string& args)
|
std::string HelpExampleRpc(const std::string& methodname, const std::string& args)
|
||||||
{
|
{
|
||||||
return "> curl --user myusername --data-binary '{\"jsonrpc\": \"1.0\", \"id\":\"curltest\", "
|
return "> curl --user myusername --data-binary '{\"jsonrpc\": \"1.0\", \"id\":\"curltest\", "
|
||||||
"\"method\": \"" + methodname + "\", \"params\": [" + args + "] }' -H 'content-type: text/plain;' http://127.0.0.1:8332/\n";
|
"\"method\": \"" + methodname + "\", \"params\": [" + args + "] }' -H 'content-type: text/plain;' http://127.0.0.1:9245/\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
void RPCSetTimerInterfaceIfUnset(RPCTimerInterface *iface)
|
void RPCSetTimerInterfaceIfUnset(RPCTimerInterface *iface)
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#include "pubkey.h"
|
#include "pubkey.h"
|
||||||
#include "script/script.h"
|
#include "script/script.h"
|
||||||
#include "uint256.h"
|
#include "uint256.h"
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
@ -247,7 +248,7 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un
|
||||||
vector<bool> vfExec;
|
vector<bool> vfExec;
|
||||||
vector<valtype> altstack;
|
vector<valtype> altstack;
|
||||||
set_error(serror, SCRIPT_ERR_UNKNOWN_ERROR);
|
set_error(serror, SCRIPT_ERR_UNKNOWN_ERROR);
|
||||||
if (script.size() > 10000)
|
if (script.size() > 20005)
|
||||||
return set_error(serror, SCRIPT_ERR_SCRIPT_SIZE);
|
return set_error(serror, SCRIPT_ERR_SCRIPT_SIZE);
|
||||||
int nOpCount = 0;
|
int nOpCount = 0;
|
||||||
bool fRequireMinimal = (flags & SCRIPT_VERIFY_MINIMALDATA) != 0;
|
bool fRequireMinimal = (flags & SCRIPT_VERIFY_MINIMALDATA) != 0;
|
||||||
|
@ -373,6 +374,13 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case OP_CLAIM_NAME: case OP_SUPPORT_CLAIM: case OP_UPDATE_CLAIM:
|
||||||
|
{
|
||||||
|
CScriptNum n(OP_0);
|
||||||
|
stack.push_back(vchZero);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case OP_CHECKSEQUENCEVERIFY:
|
case OP_CHECKSEQUENCEVERIFY:
|
||||||
{
|
{
|
||||||
if (!(flags & SCRIPT_VERIFY_CHECKSEQUENCEVERIFY)) {
|
if (!(flags & SCRIPT_VERIFY_CHECKSEQUENCEVERIFY)) {
|
||||||
|
@ -411,7 +419,7 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un
|
||||||
}
|
}
|
||||||
|
|
||||||
case OP_NOP1: case OP_NOP4: case OP_NOP5:
|
case OP_NOP1: case OP_NOP4: case OP_NOP5:
|
||||||
case OP_NOP6: case OP_NOP7: case OP_NOP8: case OP_NOP9: case OP_NOP10:
|
case OP_NOP9: case OP_NOP10:
|
||||||
{
|
{
|
||||||
if (flags & SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_NOPS)
|
if (flags & SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_NOPS)
|
||||||
return set_error(serror, SCRIPT_ERR_DISCOURAGE_UPGRADABLE_NOPS);
|
return set_error(serror, SCRIPT_ERR_DISCOURAGE_UPGRADABLE_NOPS);
|
||||||
|
|
|
@ -135,9 +135,9 @@ const char* GetOpName(opcodetype opcode)
|
||||||
case OP_NOP3 : return "OP_NOP3";
|
case OP_NOP3 : return "OP_NOP3";
|
||||||
case OP_NOP4 : return "OP_NOP4";
|
case OP_NOP4 : return "OP_NOP4";
|
||||||
case OP_NOP5 : return "OP_NOP5";
|
case OP_NOP5 : return "OP_NOP5";
|
||||||
case OP_NOP6 : return "OP_NOP6";
|
case OP_CLAIM_NAME : return "OP_CLAIM_NAME";
|
||||||
case OP_NOP7 : return "OP_NOP7";
|
case OP_SUPPORT_CLAIM : return "OP_SUPPORT_CLAIM";
|
||||||
case OP_NOP8 : return "OP_NOP8";
|
case OP_UPDATE_CLAIM : return "OP_UPDATE_CLAIM";
|
||||||
case OP_NOP9 : return "OP_NOP9";
|
case OP_NOP9 : return "OP_NOP9";
|
||||||
case OP_NOP10 : return "OP_NOP10";
|
case OP_NOP10 : return "OP_NOP10";
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
// Maximum number of bytes pushable to the stack
|
// Maximum number of bytes pushable to the stack
|
||||||
static const unsigned int MAX_SCRIPT_ELEMENT_SIZE = 520;
|
static const unsigned int MAX_SCRIPT_ELEMENT_SIZE = 20000; // bytes
|
||||||
|
|
||||||
// Maximum number of non-push operations per script
|
// Maximum number of non-push operations per script
|
||||||
static const int MAX_OPS_PER_SCRIPT = 201;
|
static const int MAX_OPS_PER_SCRIPT = 201;
|
||||||
|
@ -169,8 +169,11 @@ enum opcodetype
|
||||||
OP_NOP4 = 0xb3,
|
OP_NOP4 = 0xb3,
|
||||||
OP_NOP5 = 0xb4,
|
OP_NOP5 = 0xb4,
|
||||||
OP_NOP6 = 0xb5,
|
OP_NOP6 = 0xb5,
|
||||||
|
OP_CLAIM_NAME = OP_NOP6,
|
||||||
OP_NOP7 = 0xb6,
|
OP_NOP7 = 0xb6,
|
||||||
|
OP_SUPPORT_CLAIM = OP_NOP7,
|
||||||
OP_NOP8 = 0xb7,
|
OP_NOP8 = 0xb7,
|
||||||
|
OP_UPDATE_CLAIM = OP_NOP8,
|
||||||
OP_NOP9 = 0xb8,
|
OP_NOP9 = 0xb8,
|
||||||
OP_NOP10 = 0xb9,
|
OP_NOP10 = 0xb9,
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
#include "primitives/transaction.h"
|
#include "primitives/transaction.h"
|
||||||
#include "script/standard.h"
|
#include "script/standard.h"
|
||||||
#include "uint256.h"
|
#include "uint256.h"
|
||||||
|
#include "nameclaim.h"
|
||||||
#include <boost/foreach.hpp>
|
#include <boost/foreach.hpp>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
@ -67,8 +67,10 @@ static bool SignStep(const BaseSignatureCreator& creator, const CScript& scriptP
|
||||||
{
|
{
|
||||||
scriptSigRet.clear();
|
scriptSigRet.clear();
|
||||||
|
|
||||||
|
const CScript& strippedScriptPubKey = StripClaimScriptPrefix(scriptPubKey);
|
||||||
|
|
||||||
vector<valtype> vSolutions;
|
vector<valtype> vSolutions;
|
||||||
if (!Solver(scriptPubKey, whichTypeRet, vSolutions))
|
if (!Solver(strippedScriptPubKey, whichTypeRet, vSolutions))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
CKeyID keyID;
|
CKeyID keyID;
|
||||||
|
|
|
@ -20,8 +20,8 @@ BOOST_FIXTURE_TEST_SUITE(Checkpoints_tests, BasicTestingSetup)
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(sanity)
|
BOOST_AUTO_TEST_CASE(sanity)
|
||||||
{
|
{
|
||||||
const CCheckpointData& checkpoints = Params(CBaseChainParams::MAIN).Checkpoints();
|
//const CCheckpointData& checkpoints = Params(CBaseChainParams::MAIN).Checkpoints();
|
||||||
BOOST_CHECK(Checkpoints::GetTotalBlocksEstimate(checkpoints) >= 134444);
|
//BOOST_CHECK(Checkpoints::GetTotalBlocksEstimate(checkpoints) >= 134444);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_SUITE_END()
|
BOOST_AUTO_TEST_SUITE_END()
|
||||||
|
|
|
@ -21,7 +21,7 @@ BOOST_AUTO_TEST_CASE(PartitionAlert)
|
||||||
{
|
{
|
||||||
// Test PartitionCheck
|
// Test PartitionCheck
|
||||||
CCriticalSection csDummy;
|
CCriticalSection csDummy;
|
||||||
CBlockIndex indexDummy[100];
|
CBlockIndex indexDummy[2000];
|
||||||
CChainParams& params = Params(CBaseChainParams::MAIN);
|
CChainParams& params = Params(CBaseChainParams::MAIN);
|
||||||
int64_t nPowTargetSpacing = params.GetConsensus().nPowTargetSpacing;
|
int64_t nPowTargetSpacing = params.GetConsensus().nPowTargetSpacing;
|
||||||
|
|
||||||
|
@ -29,13 +29,13 @@ BOOST_AUTO_TEST_CASE(PartitionAlert)
|
||||||
// an arbitrary time:
|
// an arbitrary time:
|
||||||
int64_t now = 1427379054;
|
int64_t now = 1427379054;
|
||||||
SetMockTime(now);
|
SetMockTime(now);
|
||||||
for (int i = 0; i < 100; i++)
|
for (int i = 0; i < 2000; i++)
|
||||||
{
|
{
|
||||||
indexDummy[i].phashBlock = NULL;
|
indexDummy[i].phashBlock = NULL;
|
||||||
if (i == 0) indexDummy[i].pprev = NULL;
|
if (i == 0) indexDummy[i].pprev = NULL;
|
||||||
else indexDummy[i].pprev = &indexDummy[i-1];
|
else indexDummy[i].pprev = &indexDummy[i-1];
|
||||||
indexDummy[i].nHeight = i;
|
indexDummy[i].nHeight = i;
|
||||||
indexDummy[i].nTime = now - (100-i)*nPowTargetSpacing;
|
indexDummy[i].nTime = now - (2000-i)*nPowTargetSpacing;
|
||||||
// Other members don't matter, the partition check code doesn't
|
// Other members don't matter, the partition check code doesn't
|
||||||
// use them
|
// use them
|
||||||
}
|
}
|
||||||
|
@ -44,13 +44,13 @@ BOOST_AUTO_TEST_CASE(PartitionAlert)
|
||||||
|
|
||||||
// Test 1: chain with blocks every nPowTargetSpacing seconds,
|
// Test 1: chain with blocks every nPowTargetSpacing seconds,
|
||||||
// as normal, no worries:
|
// as normal, no worries:
|
||||||
PartitionCheck(falseFunc, csDummy, &indexDummy[99], nPowTargetSpacing);
|
PartitionCheck(falseFunc, csDummy, &indexDummy[1999], nPowTargetSpacing);
|
||||||
BOOST_CHECK_MESSAGE(strMiscWarning.empty(), strMiscWarning);
|
BOOST_CHECK_MESSAGE(strMiscWarning.empty(), strMiscWarning);
|
||||||
|
|
||||||
// Test 2: go 3.5 hours without a block, expect a warning:
|
// Test 2: go 3.5 hours without a block, expect a warning:
|
||||||
now += 3*60*60+30*60;
|
now += 3*60*60+30*60;
|
||||||
SetMockTime(now);
|
SetMockTime(now);
|
||||||
PartitionCheck(falseFunc, csDummy, &indexDummy[99], nPowTargetSpacing);
|
PartitionCheck(falseFunc, csDummy, &indexDummy[1999], nPowTargetSpacing);
|
||||||
BOOST_CHECK(!strMiscWarning.empty());
|
BOOST_CHECK(!strMiscWarning.empty());
|
||||||
BOOST_TEST_MESSAGE(std::string("Got alert text: ")+strMiscWarning);
|
BOOST_TEST_MESSAGE(std::string("Got alert text: ")+strMiscWarning);
|
||||||
strMiscWarning = "";
|
strMiscWarning = "";
|
||||||
|
@ -59,16 +59,16 @@ BOOST_AUTO_TEST_CASE(PartitionAlert)
|
||||||
// code:
|
// code:
|
||||||
now += 60*10;
|
now += 60*10;
|
||||||
SetMockTime(now);
|
SetMockTime(now);
|
||||||
PartitionCheck(falseFunc, csDummy, &indexDummy[99], nPowTargetSpacing);
|
PartitionCheck(falseFunc, csDummy, &indexDummy[1999], nPowTargetSpacing);
|
||||||
BOOST_CHECK(strMiscWarning.empty());
|
BOOST_CHECK(strMiscWarning.empty());
|
||||||
|
|
||||||
// Test 4: get 2.5 times as many blocks as expected:
|
// Test 4: get 2.5 times as many blocks as expected:
|
||||||
now += 60*60*24; // Pretend it is a day later
|
now += 60*60*24; // Pretend it is a day later
|
||||||
SetMockTime(now);
|
SetMockTime(now);
|
||||||
int64_t quickSpacing = nPowTargetSpacing*2/5;
|
int64_t quickSpacing = nPowTargetSpacing*2/5;
|
||||||
for (int i = 0; i < 100; i++) // Tweak chain timestamps:
|
for (int i = 0; i < 2000; i++) // Tweak chain timestamps:
|
||||||
indexDummy[i].nTime = now - (100-i)*quickSpacing;
|
indexDummy[i].nTime = now - (2000-i)*quickSpacing;
|
||||||
PartitionCheck(falseFunc, csDummy, &indexDummy[99], nPowTargetSpacing);
|
PartitionCheck(falseFunc, csDummy, &indexDummy[1999], nPowTargetSpacing);
|
||||||
BOOST_CHECK(!strMiscWarning.empty());
|
BOOST_CHECK(!strMiscWarning.empty());
|
||||||
BOOST_TEST_MESSAGE(std::string("Got alert text: ")+strMiscWarning);
|
BOOST_TEST_MESSAGE(std::string("Got alert text: ")+strMiscWarning);
|
||||||
strMiscWarning = "";
|
strMiscWarning = "";
|
||||||
|
|
|
@ -38,44 +38,44 @@ struct TestVector {
|
||||||
|
|
||||||
TestVector test1 =
|
TestVector test1 =
|
||||||
TestVector("000102030405060708090a0b0c0d0e0f")
|
TestVector("000102030405060708090a0b0c0d0e0f")
|
||||||
("xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8",
|
("Lpub2hkYkGHXktBhLCamCogeqGV7fQatCHyAe3LstjaUdvp6syZNaSGjdxf68TZG1hmc4Dz1dnMnZad1HHiS3DopTy4QxrMcSbiGir5nXrU2xFd",
|
||||||
"xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi",
|
"LprvXPsFZUGgrX1X8fNGTeYQawgXAMnj4SeUu4SpYk4vfQ5MtF16HTUVzFEmFmfM4D4JQ66TyH2y3X1SAkMtYvV455cRn2EPLb1DyK21SWCtZac",
|
||||||
0x80000000)
|
0x80000000)
|
||||||
("xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw",
|
("Lpub2k1xjyazr9JgUoiUQZZHiJbDzE9EaNTBKemmrpxbc81PFFrYzfopm71Vuj7xm1g94SGaW1uDJDh6FggZzFYCXrX9AV9sMucVEnDLqVLA3bY",
|
||||||
"xprv9uHRZZhk6KAJC1avXpDAp4MDc3sQKNxDiPvvkX8Br5ngLNv1TxvUxt4cV1rGL5hj6KCesnDYUhd7oWgT11eZG7XnxHrnYeSvkzY7d2bhkJ7",
|
"LprvXS8fZBa9wn8WHGVyfQR3TyndVBM5SX8VafsiWqT3dbGeFXJGhh1b7PbB331gTvSG78zALaMqRsrJtWPcCWmEs9gwqtuXaYi7gKersfwXWn8",
|
||||||
1)
|
1)
|
||||||
("xpub6ASuArnXKPbfEwhqN6e3mwBcDTgzisQN1wXN9BJcM47sSikHjJf3UFHKkNAWbWMiGj7Wf5uMash7SyYq527Hqck2AxYysAA7xmALppuCkwQ",
|
("Lpub2nC5wm8tErBkKFkv8pTAK3Ut3c8LaQBUFyScT6jQYkobUoMgiUE8ifujKoaYAxPV29tdHSMKQpBZqzRPTai6DWM5TgziqYcksWk88PnCeej",
|
||||||
"xprv9wTYmMFdV23N2TdNG573QoEsfRrWKQgWeibmLntzniatZvR9BmLnvSxqu53Kw1UmYPxLgboyZQaXwTCg8MSY3H2EU4pWcQDnRnrVA1xe8fs",
|
"LprvXUJnky83LV1a7iYRPfJv4igHYZLBSYrnWzYZ77DraE4rV4oQRVRu4xVQT6Ck4rDJZDjr9PxGWaoj2SuqKrZDeKBPMfsFeJUyM7yEQc2m5F9",
|
||||||
0x80000002)
|
0x80000002)
|
||||||
("xpub6D4BDPcP2GT577Vvch3R8wDkScZWzQzMMUm3PWbmWvVJrZwQY4VUNgqFJPMM3No2dFDFGTsxxpG5uJh7n7epu4trkrX7x7DogT5Uv6fcLW5",
|
("Lpub2poMzHxjwj3ABRZ1PQrXg3X2GkzrqwmTbWgHhS2ZidB2teYoXE4Zd7TespmNcppoNfzMtpKvnkkYJKZgAgFdGxVv3axrvVgSbCfGDgJ2VpS",
|
||||||
"xprv9z4pot5VBttmtdRTWfWQmoH1taj2axGVzFqSb8C9xaxKymcFzXBDptWmT7FwuEzG3ryjH4ktypQSAewRiNMjANTtpgP4mLTj34bhnZX7UiM",
|
"LprvXWv4oVwu3MryytLWeFiHRiiRmiChi6SmrXnEMSX1k6SHtuzXEFGKyQ3L18RN35io4gmEjruBvzddFeeausUQmQd3iHRooEiuxPiT3AByBL9",
|
||||||
2)
|
2)
|
||||||
("xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV",
|
("Lpub2s2kpj5h8Ci9Fu2j5g4cZYgLMaHbUY5f2zZaxPZ334jeFkBAazkvpgvaZ9km2cyXqz7Y2posqVeerjugFygpzYyAxNX3kgaGbta7NFjbxNP",
|
||||||
"xprvA2JDeKCSNNZky6uBCviVfJSKyQ1mDYahRjijr5idH2WwLsEd4Hsb2Tyh8RfQMuPh7f7RtyzTtdrbdqqsunu5Mm3wDvUAKRHSC34sJ7in334",
|
"LprvXZ9Tdw4rDqXy4MpELWvNKDsjrXVSLgkyJ1fXcQ3V4XzuG1ctJ1xhAyWFgSppVk8E8UtwMn8kqp5niqZ37J1kxoD67XWuMKYd7NBcYeJ6jSm",
|
||||||
1000000000)
|
1000000000)
|
||||||
("xpub6H1LXWLaKsWFhvm6RVpEL9P4KfRZSW7abD2ttkWP3SSQvnyA8FSVqNTEcYFgJS2UaFcxupHiYkro49S8yGasTvXEYBVPamhGW6cFJodrTHy",
|
("Lpub2tkXJQgwFL6LnEpBCDdLsFgL9oruJ2tgqEx9CfwBF988xsaZ7R1b5o5eByfhst4FKgQ5YAjgNhMFTAJhMqBfqp8Hpuw8ZA9uQrC2cTHvMov",
|
||||||
"xprvA41z7zogVVwxVSgdKUHDy1SKmdb533PjDz7J6N6mV6uS3ze1ai8FHa8kmHScGpWmj4WggLyQjgPie1rFSruoUihUZREPSL39UNdE3BBDu76",
|
"LprvXasE7cg6LxvAahbgT4V6cvsjem4kABa16G45rgRdGcPPy92GpSDMS5fKKJc2QfFJjtJC997hgrcuj1ZQeN2V5krdT2H8UEJLPhjyHjdGM3u",
|
||||||
0);
|
0);
|
||||||
|
|
||||||
TestVector test2 =
|
TestVector test2 =
|
||||||
TestVector("fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542")
|
TestVector("fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542")
|
||||||
("xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB",
|
("Lpub2hkYkGHXktBhKp66JxkwHUCsubjJsvDzKd8cBgKJcJvyAxaZkb3g4rpgUZeEix8ZxnDoYT1wxf8G15SfAQiybt4MpnZ5H6Cw3DktojFA2uq",
|
||||||
"xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U",
|
"LprvXPsFZUGgrX1X8GsbZoch39QHQYw9k4uJaeEYqgokdnCEBE2HTcFSR9QMbqSQEicPe8qtiZVRKd3dGH5zbLskgSwCESJdUvuxYZeEoQkoij6",
|
||||||
0)
|
0)
|
||||||
("xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH",
|
("Lpub2m2J1yyVEu1mr5gPSk8pMGcQGZUZatiGsnsyMVLkginvrw2YKrPkDhPw42c8X391B6hyQg1hMjyEAEsM3ZRPwUie6qHkBSMKAhsZEyWPpRJ",
|
||||||
"xprv9vHkqa6EV4sPZHYqZznhT2NPtPCjKuDKGY38FBWLvgaDx45zo9WQRUT3dKYnjwih2yJD9mkrocEZXo1ex8G81dwSM1fwqWpWkeS3v86pgKt",
|
"LprvXT8zqBxeLXqbeYTthaza6woomWgQT3Pb8oyv1VqCiC4BsCUG2sbWZyycBLiCsnTE3o5icZu9knTkcnip9dNocg6bEcigsR5hfyYoAmjDmEw",
|
||||||
0xFFFFFFFF)
|
0xFFFFFFFF)
|
||||||
("xpub6ASAVgeehLbnwdqV6UKMHVzgqAG8Gr6riv3Fxxpj8ksbH9ebxaEyBLZ85ySDhKiLDBrQSARLq1uNRts8RuJiHjaDMBU4Zn9h8LZNnBC5y4a",
|
("Lpub2nBMGb11coBt1wtZsC8TpcHxfJhU8NsxxwxWGtFXLTZKKEFzwjp4RmBXfQrFGmk6xcdX4WsJexPppujgpTuWfdBGduuoYAcL369A5mJaAUR",
|
||||||
"xprv9wSp6B7kry3Vj9m1zSnLvN3xH8RdsPP1Mh7fAaR7aRLcQMKTR2vidYEeEg2mUCTAwCd6vnxVrcjfy2kRgVsFawNzmjuHc2YmYRmagcEPdU9",
|
"LprvXUJ45nzAiS1hpQg582zDaHVNAFuJzXZHDy4SvtjyMvpaKVhiem1pn3mCnhCBc3Bhx2QcPb6nonxs42TaszywByY9fLx2dvoxTktKw75RfhE",
|
||||||
1)
|
1)
|
||||||
("xpub6DF8uhdarytz3FWdA8TvFSvvAh8dP3283MY7p2V4SeE2wyWmG5mg5EwVvmdMVCQcoNJxGoWaU9DCWh89LojfZ537wTfunKau47EL2dhHKon",
|
("Lpub2pzKgbywnSV57ZZhvrH2nZEBzqZyEZoEHPTN7wureLukz48AFFLmKfZuWD3P4eSPYo64u9xYJ5heuhzhjNLTvxeBEC7eki3Xxrp7LFdK9GD",
|
||||||
"xprv9zFnWC6h2cLgpmSA46vutJzBcfJ8yaJGg8cX1e5StJh45BBciYTRXSd25UEPVuesF9yog62tGAQtHjXajPPdbRCHuWS6T8XA2ECKADdw4Ef",
|
"LprvXX72Voy6t5Jtv2MDBh8nYERbVnmp6iUYYQZJmxQJfpB1zKZsxGYXfx9adVPodkPQFymK8tBBDLe5NjEjvtWKCTMSo7UqV2nLwZK4Qns6Jan",
|
||||||
0xFFFFFFFE)
|
0xFFFFFFFE)
|
||||||
("xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL",
|
("Lpub2rAMbZvJPqSnQWoJfL6aA4vNua3LHYRjK6BFefcGV7B1SQT6LvGmrBw18sAtG1xqWEjhhf2FLh2WZMA6RFSyeKLdW6S9K18wq5tgsCMpiS8",
|
||||||
"xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc",
|
"LprvXYH4QmuTVUGcCyaovAxKuk7nQXFB9h73a7HCJg6iWaSGSftp3wUYCUWgGC8CGAmgoZ41ShxAbiDfBrL7SqQotJ2cd429dEoyH9KaUbZHRAn",
|
||||||
2)
|
2)
|
||||||
("xpub6FnCn6nSzZAw5Tw7cgR9bi15UV96gLZhjDstkXXxvCLsUXBGXPdSnLFbdpq8p9HmGsApME5hQTZ3emM2rnY5agb9rXpVGyy3bdW6EEgAtqt",
|
("Lpub2sXPZ18ov1m29mzCPQEG8pJMJdaSXsLoyFo94Sxm7u2bWbnfWZCY2kt1DGFAPbKY2HwvyaXfEQ3W3nDbFM8sxaCD9GGEFNRgWP5sXmFVSUv",
|
||||||
"xprvA2nrNbFZABcdryreWet9Ea4LvTJcGsqrMzxHx98MMrotbir7yrKCEXw7nadnHM8Dq38EGfSh6dqA9QWTyefMLEcBYJUuekgW4BYPJcr9E7j",
|
"LprvXZe6ND7y1eaqxEmheF61tVVkoanHQ228EGu5iTTD9NHrWsEPDaQJP3TgLboCRBrkqrujjTaz3p4MEQDdB9n2wGmLRuXegewgyWf8ZANdd3A",
|
||||||
0);
|
0);
|
||||||
|
|
||||||
void RunTest(const TestVector &test) {
|
void RunTest(const TestVector &test) {
|
||||||
|
|
|
@ -86,7 +86,7 @@ BOOST_AUTO_TEST_CASE(bloom_create_insert_serialize_with_tweak)
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(bloom_create_insert_key)
|
BOOST_AUTO_TEST_CASE(bloom_create_insert_key)
|
||||||
{
|
{
|
||||||
string strSecret = string("5Kg1gnAjaLfKiwhhPpGS3QfRg2m6awQvaj98JCZBZQ5SuS2F15C");
|
string strSecret = string("y2Kag6A9fz5PRsuA5vKT5gd1XqxJRxvn6eKXGdovHkbCBsiKmW");
|
||||||
CBitcoinSecret vchSecret;
|
CBitcoinSecret vchSecret;
|
||||||
BOOST_CHECK(vchSecret.SetString(strSecret));
|
BOOST_CHECK(vchSecret.SetString(strSecret));
|
||||||
|
|
||||||
|
@ -102,7 +102,7 @@ BOOST_AUTO_TEST_CASE(bloom_create_insert_key)
|
||||||
CDataStream stream(SER_NETWORK, PROTOCOL_VERSION);
|
CDataStream stream(SER_NETWORK, PROTOCOL_VERSION);
|
||||||
filter.Serialize(stream, SER_NETWORK, PROTOCOL_VERSION);
|
filter.Serialize(stream, SER_NETWORK, PROTOCOL_VERSION);
|
||||||
|
|
||||||
vector<unsigned char> vch = ParseHex("038fc16b080000000000000001");
|
vector<unsigned char> vch = ParseHex("031ee0a1080000000000000001");
|
||||||
vector<char> expected(vch.size());
|
vector<char> expected(vch.size());
|
||||||
|
|
||||||
for (unsigned int i = 0; i < vch.size(); i++)
|
for (unsigned int i = 0; i < vch.size(); i++)
|
||||||
|
@ -182,6 +182,7 @@ BOOST_AUTO_TEST_CASE(bloom_match)
|
||||||
BOOST_CHECK_MESSAGE(!filter.IsRelevantAndUpdate(tx), "Simple Bloom filter matched COutPoint for an output we didn't care about");
|
BOOST_CHECK_MESSAGE(!filter.IsRelevantAndUpdate(tx), "Simple Bloom filter matched COutPoint for an output we didn't care about");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* TODO: put these tests back in when there are real blocks to use
|
||||||
BOOST_AUTO_TEST_CASE(merkle_block_1)
|
BOOST_AUTO_TEST_CASE(merkle_block_1)
|
||||||
{
|
{
|
||||||
// Random real block (0000000000013b8ab2cd513b0261a14096412195a72a0c4827d229dcc7e0f7af)
|
// Random real block (0000000000013b8ab2cd513b0261a14096412195a72a0c4827d229dcc7e0f7af)
|
||||||
|
@ -464,6 +465,7 @@ BOOST_AUTO_TEST_CASE(merkle_block_4_test_update_none)
|
||||||
BOOST_CHECK(!filter.contains(COutPoint(uint256S("0x147caa76786596590baa4e98f5d9f48b86c7765e489f7a6ff3360fe5c674360b"), 0)));
|
BOOST_CHECK(!filter.contains(COutPoint(uint256S("0x147caa76786596590baa4e98f5d9f48b86c7765e489f7a6ff3360fe5c674360b"), 0)));
|
||||||
BOOST_CHECK(!filter.contains(COutPoint(uint256S("0x02981fa052f0481dbc5868f4fc2166035a10f27a03cfd2de67326471df5bc041"), 0)));
|
BOOST_CHECK(!filter.contains(COutPoint(uint256S("0x02981fa052f0481dbc5868f4fc2166035a10f27a03cfd2de67326471df5bc041"), 0)));
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
static std::vector<unsigned char> RandomData()
|
static std::vector<unsigned char> RandomData()
|
||||||
{
|
{
|
||||||
|
|